关于数据库:规范化:“重复组”是什么意思?

您所在的位置:网站首页 组一组是什么意思 关于数据库:规范化:“重复组”是什么意思?

关于数据库:规范化:“重复组”是什么意思?

2024-07-11 08:43| 来源: 网络整理| 查看: 265

我已经阅读了不同的教程并看到了标准化的不同例子,特别是第一范式中"重复组"的概念。从他们那里我已经收集到,重复的群体是"有点"的多值属性(例如这里和这里)。

但是,在将ERM(实体关系模型)映射到RDM(关系数据模型)的过程中,我们已经通过在父表中包含外键来为每个多值属性创建单独的表?参考:这个

其次,那些"重复组"基本上是在同一行中水平排列,或者可以在同一列中反复出现相同的值,即一次又一次的属性相同的值,也是一个重复的组,应该被消除?

在此示例中,英语值一次又一次地重复。这是一个重复的群体吗? 如果我删除它以使用Subject Name和Module_ID(外键)创建另一个表SUBJECT,这就是我得到的。当然它摆脱了重复的价值,但我不确定这是否是正确的。这样对吗?

术语"重复组"最初是指基于CODASYL和COBOL的语言中的概念,其中单个字段可以包含重复值的数组。当E.F.Codd描述他的第一范式是他重复组的意思。任何现代关系或基于SQL的DBMS中都不存在该概念。

术语"重复组"也被数据库设计者非正式地且不精确地用于表示重复的列集合,意味着表格中包含类似值的列的集合。这与其与1NF相关的原始含义不同。例如,在一个名为Families的表的情况下,列名为Parent1,Parent2,Child1,Child2,Child3,...等,Child N列的集合有时被称为重复组,并假设甚至违反了1NF虽然它不是Codd意图的重复组。

如果每个属性仅是单值的话,后一种所谓的重复组的意义在技术上并不违反1NF。属性本身不包含重复值,因此没有违反1NF的原因。这种设计通常被认为是反模式,但是因为它将表限制为预定的固定数量的值(一个族中最多N个子节点),并且因为它强制对每个列重复查询和其他业务逻辑。换句话说,它违反了"DRY"设计原则。因为它通常被认为是糟糕的设计,它适合数据库设计者,有时甚至教师将这种重复的列称为"重复组"并违反第一范式的精神。

这种术语的非正式用法有点不幸,因为它可能有点武断和令人困惑(一组列实际上是什么时候构成重复?),也因为它分散了一个更基本的问题,即Null问题。所有正规形式都关注不允许出现空值的关系。如果表允许任何列中的null,则它不满足满足1NF的关系模式的要求。对于Families表,如果Child列允许空值(表示少于N个子节点的族),则Families表不满足1NF。在规范化练习中经常会遗忘或忽略null的可能性,但避免使用不必要的可空列是避免重复列集的一个非常好的理由,无论你是否将它们称为"重复组"。

另见本文。

相关讨论 你对答案的第一段有什么参考吗? 这个tutoral提出了重复组的另一个定义:"重复组是一个域或一组域,直接与密钥相关,跨元组重复数据,以满足每个元组数据不同的其他域。" Codd1971"3.1重复组......以CODASYL形式表示包含重复组模式的复合组模式---参见[Codasyl Systems Committee,广义数据库管理系统的特征分析]中的McGee第2章。 不在opengrass.net的例子中说服。这真的是一个"重复小组"吗?要么是桌子的图片根本不是关系。或者它是一个关系的图片,可能满足1NF并且应该有一个复合密钥。 {StudentId}显然不是关键; {StudentId,UnitCode}可能在这种情况下似乎满足1NF但不满足2NF。 @sqlvogel;事实上,该网站还声称第一个表是非标准化的。但是根据其他教程和维基百科,该表在1NF中,因为该表中没有重复组。这并不是唯一一个声称拥有该网站的网站。 AFAIK,在1NF中提供表格的步骤:1。消除重复组。 2.为每组相关属性创建一个单独的表,以及3.为每个表提供一个主键。大多数教程或书籍都说,只需考虑第一步,表格就在1NF中,其中一些也考虑了第3步。 opengrass.net考虑了所有三个步骤,并且它在其他教程上有说服力(如果不考虑重复grp的定义)...... .......现在至少对我而言,决定如何在1NF制作一张桌子真是令人沮丧吗? 简单回答:不要过于担心1NF。关键点是所讨论的表是否是关系的准确表示(即命名和类型属性;有一个键;没有空值)。 @ MikeSherrill'CatRecall'这个答案没有解决(据称)"非原子"的属性,这太糟糕了,因为当人们使用/听到"重复组"时,这实际上可能意味着。

the value English is repeating again and again. Is this a repeating group?

不会。在SUBJECT_MODULE中,英语的多次出现不是重复组,也不是人们误认为重复组的两种情况之一。它们也不是冗余或缺乏正常化的证据。这种多次出现可能与冗余或标准化有关,但它们在没有冗余和各种标准化水平时始终出现。

如果SUBJECT_MODULE是"[SUBJECT_NAME]有[MODULE_NAME]标识[MODULE_NAME]"并且主题可能包含多个模块的行,则某个地方您必须多次提及该主题(可能通过其名称)并提及不同的模块(也许是名字或身份)。那不会涉及冗余。

123456Student Age Subject Adam    15  Biology Adam    15  Maths Alex    14  Maths Stuart  17  Maths

此问题的第二个"this"链接中的冗余不是Adam出现在两行中,或者Adam出现在两行中的15。如果表格是"[学生]年龄[年龄]岁并且需要[主题]"的行,那么学生(例如亚当)可以出现在多行中,但总是以相同的年龄出现(例如15)。但是如果表格是"[学生]在[主题]中有一个朋友[年龄]岁的行"那么该表可以已经完全标准化。

Sure it gets rid of the repeating value, but I am not sure if this is the right thing.

它适用于您的示例数据,但它可能不适用于其他示例数据。你还没告诉我们。 (无论如何,正如我上面所说,多次出现甚至可能都不需要标准化。)

SUBJECT_MODULE中是否存在任何与归一化相关的冗余,或者甚至是否存在任何有效分解(包括您给出的分解)取决于标准化到1NF以上所需的常用信息。即它的某些列是否是其他列的功能(功能依赖性)以及它的行是否也是"..."和"..."(连接依赖性)的行。

通过给出可能的分解,你说它也是"... [Subject_Name] ... [Module_ID] ..."和"... [Module_Name] ... [Module_ID] ......"的行您已经给出了一些示例分解数据。但是我们只知道它可以被分解,因为你添加了分解。分解加上数据仍然不足以让我们知道它是否应该如此分解。

I have read different tutorials and seen different examples of normalization, specially the notion of"repeating groups" in the first normal form.

"重复组"来自预关系数据库,不可能出现在关系表(关系)中。它们就像一组命名的值,就像一个记录的字段,但并不完整。关系表始终为1NF。行的每列都具有列类型的单个值。非关系数据库被"标准化"到表格,即1NF(第一种"标准化"意义),它消除了重复的组。然后将这些表/关系"标准化"为更高的正规形式(第二种"标准化"意义)。

具有多个相似列或具有多个相似部分的列类型的关系表每个都让人联想到在非关系数据库中具有重复组。并且多个列和部分应该在单独的表中变成多行,就像重复组的多个成员一样。但是这些问题与设计的关系质量有关,而不是重复组或规范化(在任何意义上)或关系(即在1NF中)。

请注意,非关系数据库本身可能与多个相似字段和/或命名集或具有多个类似字段值的部分具有类似问题。当表格去掉重复的组时,对表格的规范化并没有摆脱它们。

无论他们如何进入关系设计,删除它们都会带来"更好"的设计。这只是因为这些设计问题让人想起重复的群体让人们感到困惑,并想象某个表格可能包含一个重复的群体。因此,具有多个相似部分(或部分)的多个相似列和值被错误地称为"重复组"。

看到这个答案重新"原子性"。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3