3 回答

TA貢獻1842條經(jīng)驗 獲得超21個贊
術(shù)語“重復組”最初是指基于CODASYL和COBOL的語言中的概念,其中單個字段可能包含重復值數(shù)組。當EFCodd描述他的第一范式時,這就是他所說的重復小組的意思。這個概念在任何現(xiàn)代的關(guān)系型或基于SQL的DBMS中都不存在。
數(shù)據(jù)庫設計人員也非正式地和不精確地使用了“重復組”一詞來表示一組重復的列,這意味著表中包含相似類型值的列的集合。這與1NF的原始含義不同。例如,在名為Families的表中,其列名為Parent1,Parent2,Child1,Child2,Child3,...等,有時將Child N列的集合稱為重復組,并假定違反了1NF,甚至盡管從Codd的意圖來說,它不是重復的小組。
如果每個屬性都是單值的,則后一種所謂的重復組的含義在技術(shù)上并不違反1NF。屬性本身不包含重復值,因此不會因此而違反1NF。但是,這種設計通常被認為是反模式,因為它將表限制為預定的固定數(shù)量的值(一個家庭中最多有N個子級),并且因為它強制對每個列重復進行查詢和其他業(yè)務邏輯。換句話說,它違反了設計的“ DRY ”原則。因為它通常被認為是糟糕的設計,所以它適合數(shù)據(jù)庫設計人員,有時甚至適合老師將這種重復的列稱為“重復組”,并且違反了“第一范式”的精神。
術(shù)語的這種非正式用法有點不幸,因為它可能有點武斷和混亂(何時一組列實際上構(gòu)成重復?),還因為它分散了更基本的問題,即Null問題。所有范式都與不允許存在null的關(guān)系有關(guān)。如果表允許任何列為空,則它不滿足滿足1NF的關(guān)系模式的要求。對于我們的家庭表,如果“子級”列允許為空(代表少于N個孩子的家庭),則“家庭”表不滿足1NF。在規(guī)范化練習中,通常會忘記或忽略空值的可能性,但是避免不必要的可空列是避免重復使用列集的一個很好的理由,
添加回答
舉報