规范化表第三范式(Normalize table to 3rd normal form)

2019-07-21 03:50发布

这个问题显然是一门功课的问题。 我不明白我的教授,不知道他在竞选期间说了什么。 我需要一步一步的指示下表第一归到1NF,然后2NF,然后3NF。

我感谢所有帮助和指导。

Answer 1:

好吧,我希望我能记得所有的人都正确,让我们开始...

规则

为了使它们非常短(而不是非常精确,只是给你一个什么它是所有关于第一个想法):

  • NF1:表的单元格不能包含一个以上的值。
  • NF2:NF1,加上所有非主键列必须依靠所有主键列。
  • NF3:NF2,加非主键列可以不依赖于彼此。

说明

  • NF1:包含不止一个值找到表格单元格,把那些到单独列。
  • NF2:找到取决于小于所有主键列,把它们放到它只有他们真的取决于这些主键列另一个表。
  • NF3:发现依赖于其他非主键列中,除了依赖于主键列。 把从属的列到另一个表。

例子

NF1

一列“ state ”有一个像“WA,华盛顿”的价值观。 NF1受到侵犯,因为这是两个值,缩写和名称。

解决方案:为了满足NF1,创建两列, STATE_ABBREVIATIONSTATE_NAME

NF2

想象一下,你有这些4列的表格,表达车型的国际名称:

  • COUNTRY_ID (数字,主键)
  • CAR_MODEL_ID (数字,主键)
  • COUNTRY_NAME (VARCHAR)
  • CAR_MODEL_NAME (VARCHAR)

该表可能有这两个数据行:

  • 行1:COUNTRY_ID = 1,CAR_MODEL_ID = 5,COUNTRY_NAME = USA,CAR_MODEL_NAME =福克斯
  • 行2:COUNTRY_ID = 2,CAR_MODEL_ID = 5,COUNTRY_NAME =德国,CAR_MODEL_NAME =波罗

这表示,模式“福克斯”被称为美国“福克斯”,但同样的车型在德国被称为“波罗”(不记得了,如果这实际上是真的)。

NF2受到侵犯,因为该国的名称不依赖于这两个车型ID和国家ID,但只对国家ID。

解决方案:为了实现NF2,移动COUNTRY_NAME到一个单独的表中的“国家”的列COUNTRY_ID (主密钥)和COUNTRY_NAME 。 为了得到一个结果集,包括国名,你需要使用JOIN两个表进行连接。

NF3

假设你已经有了这些列的表格,表达国家的气候条件:

  • STATE_ID (VARCHAR,主键)
  • CLIME_ID (外键,如“沙漠”,“热带雨林”等气候区的ID)
  • IS_MOSTLY_DRY (布尔)

NF3受到侵犯,因为IS_MOSTLY_DRY仅取决于CLIME_ID(让我们至少假设),但不是在STATE_ID(主键)。

解决方案:履行NF3,把列MOSTLY_DRY到气候区表。


以下是关于此次演习给予实际的表的一些想法:

我申请上述NF规则,而不去挑战主键列。 但他们实际上没有任何意义,我们将在后面看到。

  • NF1不受侵犯,每个单元拥有只有一个值。
  • NF2是由EMP_NM和所有的电话号码侵犯,因为所有这些列的不依赖于完整的主键。 他们都依赖于EMP_ID(PK),但不是在DEPT_CD(PK)。 我认为电话号码保持不变,当雇员移动到另一个部门。
  • NF2也由DEPT_NM侵犯,因为DEPT_NM不依赖于完整的主键。 这取决于DEPT_CD,但不能在EMP_ID。
  • NF2也被所有的技能栏侵犯,因为它们不是部 - 但只有员工专用。
  • NF3由SKILL_NM侵犯,因为技能的名字只依赖于技能代码,这甚至不是复合主键的一部分。
  • SKILL_YRS违反NF3,因为它依赖于主键构件(EMP_ID)和非主键构件(SKILL_CD)上。 因此,它是部分依赖于非主键属性。

所以,如果你删除违反NF2或NF3,只有主键遗体(EMP_ID和DEPT_CD)所有列。 这剩余部分违反了给定的业务规则:这种结构将允许员工在多个部门同时工作。

让我们从远处审查。 您的数据模型是关于雇员,部门,技能和这些实体之间的关系。 如果您正常化的是,你最终会与员工(含DEPT_CD作为外键),一个部门,一个是技术,另一个员工和技能之间的关系一个表,持“技能年”为EMP_ID和SKILL_CD的每个元组(我的老师会叫后者的‘关联实体’)。



Answer 2:

看着你的表中的前两行,
看着这列被标记为“PK”在该表中,
并假设“PK”代表“主键”,
看着出现在这些两行的两列中的值,
我建议你教授滚出数据库教学,而不是回来,直到他得到了自己关于这个问题的正确教育。

这项工作不能认真对待,因为这个问题语句本身包含绝望矛盾的信息。

(注意,作为一种结果,根本不是一个“好”或“右”的回答这个问题的任何这样的事!)



Answer 3:

另一种过于简单的答案来了。

在3NF关系表,每一个非关键值由键,整个键,并没有什么,但关键决定(帮帮我吧科德;))。

1NF:关键。 这意味着,如果你指定键值,命名列,会出现在该行与列的交叉值最多一个。 多值,就像一系列由逗号分隔值,是不允许的,因为你不能只用一个键,将aColumn名直接获得的值。

2NF:全键。 如果一列是不是关键的一部分是由键列的真子集来确定,然后2NF被侵犯。

3NF:并没有什么,但关键。 如果一列是由一些组非键列的确定,然后3NF被侵犯。



Answer 4:

只有当它是在第二范式和亘古不变的3NF满足有任何传递依赖和所有的非关键属性应该依赖于主键。

传递依赖:R =(A,B,C)。 A-> B和B-> C,则A->Ç



文章来源: Normalize table to 3rd normal form