3 回答
TA贡献1842条经验 获得超21个赞
术语“重复组”最初是指基于CODASYL和COBOL的语言中的概念,其中单个字段可能包含重复值数组。当EFCodd描述他的第一范式时,这就是他所说的重复小组的意思。这个概念在任何现代的关系型或基于SQL的DBMS中都不存在。
数据库设计人员也非正式地和不精确地使用了“重复组”一词来表示一组重复的列,这意味着表中包含相似类型值的列的集合。这与1NF的原始含义不同。例如,在名为Families的表中,其列名为Parent1,Parent2,Child1,Child2,Child3,...等,有时将Child N列的集合称为重复组,并假定违反了1NF,甚至尽管从Codd的意图来说,它不是重复的小组。
如果每个属性都是单值的,则后一种所谓的重复组的含义在技术上并不违反1NF。属性本身不包含重复值,因此不会因此而违反1NF。但是,这种设计通常被认为是反模式,因为它将表限制为预定的固定数量的值(一个家庭中最多有N个子级),并且因为它强制对每个列重复进行查询和其他业务逻辑。换句话说,它违反了设计的“ DRY ”原则。因为它通常被认为是糟糕的设计,所以它适合数据库设计人员,有时甚至适合老师将这种重复的列称为“重复组”,并且违反了“第一范式”的精神。
术语的这种非正式用法有点不幸,因为它可能有点武断和混乱(何时一组列实际上构成重复?),还因为它分散了更基本的问题,即Null问题。所有范式都与不允许存在null的关系有关。如果表允许任何列为空,则它不满足满足1NF的关系模式的要求。对于我们的家庭表,如果“子级”列允许为空(代表少于N个孩子的家庭),则“家庭”表不满足1NF。在规范化练习中,通常会忘记或忽略空值的可能性,但是避免不必要的可空列是避免重复使用列集的一个很好的理由,
添加回答
举报