1NF:重复小组,他们是什么?

时间:2014-10-14 09:31:21

标签: database database-design normalization database-normalization

对于什么是重复群体似乎存在误解,就第一范式(1NF)中的删除而言,任何人都可以清楚地阐明它实际上是什么以及如何识别一个?

我发现误解在这里进一步讨论:https://stackoverflow.com/a/23202535/4011506。然而,这让我更加困惑。

关于以下视频(4:30开始),https://www.youtube.com/watch?v=HHDH6N_qjm4

Aren的姓名,地址,城镇,邮政编码和性别字段是重复的群体吗?

而不是此视频作者的建议(最后5个字段)?

此外,如果任何人能够提供证明重复群体误解的例子,以及实际答案是什么,那也会很好。

谢谢

编辑: 我得到的回复进一步困扰了我的困惑......所以我有另一个例子来协助查询:

https://hostr.co/file/970/ITiHuyVyCmPr/UNF.png

考虑到非标准化表格,我的文字暗示要删除'重复组,删除NULL(通过向NULL字段添加适当的数据值)。结果如下:(请在' 970'之后替换上述链接:/6QWYWR8FtxFD/1NF.png

因此,基本上,在这种情况下,重复组是什么? (根据我刚刚从回复中读到的内容,不是包含每个实例/行的SAME数据的字段,即使从字面上看,它们本质上是在重复',这是正确的吗?有点不直观...)

并建议删除'一个重复组,一个字面上删除重复组(如原始帖子中的视频中所描绘的)或者一个“删除”#39; NULL(通过向其中添加值)?或者它取决于情况......?

3 个答案:

答案 0 :(得分:2)

就我而言,误解至少可以追溯到20世纪80年代早期我学习关系数据库的时候。我在1NF中最简单的概念处理是位于行和列交叉处的值必须是一个简单的值。然而,“简单”的定义并非那么简单(小笑话)。

字符串是一个简单的值,即使它由组件(即字符)组成。时间戳很简单,即使它由日期和时间组成,每个日期和时间都由年,月等组成。

我将用逗号分隔的值列表视为违反1NF,但这可能仅仅意味着我使用了非正式定义。

在关系和关系数据模型方面,关系数学中没有任何东西禁止元组和属性从它自身作为关系的交集。正是这种结构我认为E.F.Codd打算在他提出正常化时排除。 (一旦发现第二种形式,后来命名为第一范式)。

他为什么使用“标准化”一词。好吧,这是他驾驶的东西,IMO。对于任何定义的信息要求集合,有一组关系模型都充分表达了这些要求。在这个意义上,该集的成员可被视为“等同”。人们可以提出一个规则来挑选该集合中的一个成员并将其称为整个集合的“正常”表示。 Codd提出的规则是1NF规则:没有子关系。

“规范化”概念在计算中早先出现的另一个地方是浮点数。数字0.1和1e-1都表示相同的数字,并且存在无数种表示相同数字的方式。其中一个可称为“标准化”表示。一旦(二进制)浮点数开始在计算机指令集中得到支持,有一种方法可以“规范化”二进制浮点数,使得尾数总是在二分之一和一之间,除非数字是零。理解这些细节并不重要。我的观点是,1970年当Codd写论文时,“规范化”一词已经成为计算机术语的一部分。

一个更大的问题,IMO,“违反1NF有什么不好?为什么1NF很重要?”

该问题的答案有两部分:一部分与逻辑模型有关,一部分与第一关系DBMS的物理实现有关,直到1978年左右才出现。

在逻辑模型中,可以说指定元组(通过提供键值)和指定属性(按名称)应该是足够的信息来将指定的值固定为单个值,在DBMS处理的详细程度。早期的文献称这是“对所有数据的密钥访问”。

在物理模型中,重要的是避免必须进行整个表扫描,以便对所有出现的简单值进行简单搜索。索引应该在几次磁盘读取中完成,而不是数百万次磁盘读取用于表扫描。据我所知,没有任何DBMS可以为存储在列中的CSV文本中存储的各个值创建索引。而Codd肯定希望在构建第一个关系型DBMS时避免使用这样的索引。

这是最后一点让我回到对我来说非常有帮助的“理论是实践的”座右铭。新手数据库设计师一直都在这里,问为什么在学生表中存储课程代码列表不会“更有效”,而不是采用创建具有两个外键的联结表的“复杂性” ,studentId和courseId。如果已经创建了适当的索引,那么说服新手的答案通常与执行表扫描和相关延迟有关,对于良好的DBMS将通过索引执行的操作。 IMO,这就是我认为Codd也在开车的方式。

为了进一步混淆水域,有可能(至少在Oracle中)定义一个包含其中一列中的子表的表。这样的数据库是否在1NF中可能会出现问题。我的回答是否定的。

(对不起,这太久了。)

答案 1 :(得分:1)

重复组是数据库表中的多值构造:一个没有单个值但由多个值组成的属性,这些值通常由位置索引而不是名称访问。 Codd的原始First Normal Form避开了包含重复组的表,支持仅由单值属性组成的关系。大多数现代DBMS都不允许多值属性,因此这种禁止并不是特别重要。

Codd后来修改/改写了他对1NF的定义,指出它排除了关系价值属性(请注意,他没有调用关系值属性"重复群组" - 关系是一个完全不同的东西)。对关系值属性(RVAs)的禁令比1NF的原始定义更具争议性。原则上的关系是一个值,可以像任何其他单个值一样访问。对于"显而易见的"清晰和简单的原因通常可以避免使用RVAs。但并不一定要遵循它们必须始终避免。由于RVAs是单个值(与重复组不同),因此它们可以像其他单个值一样受到关系操作的约束。要说一个关系应该由任何类型的单值属性组成,除了之外的关系似乎是不必要的限制,有点任意。

以简单(无向,无环,非多边)图形为例。假设图表在relvar中表示,每个边缘都有一个元组,使用lt,rt属性来标识节点:

G {lt,rt}

图形由G的关系值表示。现在假设我们需要在关系数据库中对这些图形的任意集合进行建模。显然,一个图必须与另一个图区分开,因为它由一组不同的节点和边组成,但不同的图也可能有一些共同的节点和边。不是最自然的表示(可能是唯一可能的表示)一种由图值组成的新关系 - 即与G相同类型的关系值?

Graphs { G {lt,rt} }

此Graphs relvar有一个属性G,它是一个带有标题{lt,rt}的关系值属性。如果我们希望不惜一切代价避开RVA,那么可能的替代方案是通过添加新属性来扩展我们的原始G relvar,以通过除其节点和边缘之外的其他东西来识别图形。

Gnam {graphname,lt,rt}

这可能是一个有用的解决方案,但为什么必须它是1NF下的解决方案?如果在我们试图建模的现实中不存在这样的属性,那么仅仅为了数据库表示而发明新属性可能是非常不方便的。归一化过程通常不需要发明新属性来满足任何正常形式。如果理解RVAs被1NF排除,那么作为设计过程的标准化可能会被打破" - 我们的图表表示确实不能被标准化;只有替代的Gnam形式才能成功归一化。我同意在大多数情况下,RVAs可能是不受欢迎的。我不太相信将1NF解释为完全排除它们是个好主意。

但重申一下,RVAs 与重复组相同。

答案 2 :(得分:0)

关系是一组 n - 元组,其中每个 n -tuple的 j 属性取自 j 关系域。

第一范式是定义问题,即确保数据库仅由关系组成。所以数据库是第一种正常形式,当且仅当它只包含关系时

如果数据库处于第一个正常状态,则意味着每个关系的每个属性都是通过域定义的。域指定可以分配给属性的允许值集合,可以对这些值执行操作。

e.g。你可以定义一个域 StringUpper(10),它由值A和Z之间的0到10个字符组成。可以对该域中的值执行的操作是 SubString( “开始,结束”,提取从开始开始到结束结束的字符。

域名可能是任意复杂的"例如 MPEG-4 PortableNetworkGraphic ;只需要确保分配给在这样的域上定义的属性的任何值确实在该域的允许值的集合中,例如,是一个有效的 MPEG-4 。这些域中的值可以具有可以对它们执行的特定操作,例如, 播放查看

域名可能包含某些人可能会考虑重复的内容,例如你可以定义一个域 ListStringUpper(10),它由0个或更多个元素组成,其中每个元素在值A和Z之间由0到10个字符组成。可以对值执行的操作包括在此域中是 GetElement(Index),它提取列表中的 Index 元素。 (注意这与作为字符列表的字符串没有太大区别)

但是,如果其中一个域将自身关系作为允许值,则会出现潜在问题。如果是这种情况,则不必使用一阶逻辑来操作数据库中的关系,而是必须使用二阶逻辑。这可以使操作更复杂。为了消除这种复杂性,并确保始终可以使用一阶逻辑,可以改进第一范式的定义,以便:

当且仅当数据库仅包含关系并且没有关系属性的域本身具有允许值的关系时,数据库才处于第一范式。