将表规范化为第3范式

时间:2013-03-07 15:25:40

标签: database database-design relational-database normalization database-schema

这个问题显然是一个功课问题。我无法理解我的教授,也不知道他在大选期间所说的话。我需要逐步说明将下表首先规范化为1NF,然后是2NF,然后是3NF。

enter image description here

我感谢任何帮助和指导。

4 个答案:

答案 0 :(得分:20)

好的,我希望我能正确记住所有这些,让我们开始......

规则

要使它们非常短(并且不是非常精确,只是为了让您初步了解它的全部内容):

  • NF1 :表格单元格不得包含多个值。
  • NF2 :NF1以及所有非主键列必须依赖于所有主键列。
  • NF3 :NF2加上非主键列可能不会相互依赖。

说明

  • NF1 :查找包含多个值的表格单元格,将它们放入单独的列中。
  • NF2 :根据少于所有主键列的内容查找列,将它们放入另一个只包含他们真正依赖的主键列的表中。
  • NF3 :除了依赖主键外,还可以查找依赖于其他非主键列的列。将依赖列放入另一个表中。

实施例

NF1

列“state”的值类似于“WA,Washington”。 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 = Fox
  • 第2行:COUNTRY_ID = 2,CAR_MODEL_ID = 5,COUNTRY_NAME =德国,CAR_MODEL_NAME = Polo

也就是说,模型“Fox”在美国被称为“Fox”,但同样的车型在德国被称为“Polo”(不记得是否真的如此)。

违反了NF2,因为国家/地区名称不依赖于车型ID和国家/地区ID,而只取决于国家/地区ID。

解决方案:要实现NF2,请将COUNTRY_NAME移至单独的表“COUNTRY”,其中包含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,每个单元格只保留一个值。
  • EMP_NM和所有电话号码违反了NF2,因为所有这些列都不依赖于完整的主键。它们都依赖于EMP_ID(PK),但不依赖于DEPT_CD(PK)。我认为当员工搬到另一个部门时,电话号码保持不变。
  • DEPT_NM也违反了NF2,因为DEPT_NM不依赖于完整的主键。它取决于DEPT_CD,但不取决于EMP_ID。
  • 所有技能专栏都违反了NF2,因为它们不是部门 - 而只是员工特定的。
  • SKILL_NM违反了NF3,因为技能名称仅取决于技能代码,而技能代码甚至不是复合主键的一部分。
  • SKILL_YRS违反NF3,因为它依赖于主键成员(EMP_ID)和非主键成员(SKILL_CD)。所以它部分依赖于非主键属性。

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

让我们从远处回顾它。您的数据模型涉及员工,部门,技能以及这些实体之间的关系。如果你将其标准化,你最终将为员工提供一个表(包含DEPT_CD作为外键),一个用于部门,一个用于技能,另一个用于员工和技能之间的关系,持有“技能”年“对于EMP_ID和SKILL_CD的每个元组(我的老师会将后者称为”关联实体“)。

答案 1 :(得分:4)

查看表格中的前两行,并查看该表中标记为“PK”的列,并假设“PK”代表“主键”,自己对这个问题进行了适当的教育。

这个练习不能被认真对待,因为问题陈述本身包含了无可救药的矛盾信息。

(因此,观察到这个问题根本就没有“好”或“正确”的答案!!!)

答案 2 :(得分:1)

另一个过于简化的答案即将出现。

在3NF关系表中,每个非键值都是由键,整个键以及除键之外的任何键确定的(所以请帮助我Codd;))。

1NF:钥匙。这意味着如果指定键值和命名列,则行和列的交叉处最多只能有一个值。不允许使用多个值,例如用逗号分隔的一系列值,因为您不能仅使用键和列名直接获取值。

2NF:整个关键。如果不是键的一部分的列由键列的适当子集确定,则违反2NF。

3NF:除了关键之外什么都没有。如果列由某些非键列确定,则违反3NF。

答案 3 :(得分:0)

3NF只有在它处于第二范式并且没有任何传递依赖性且所有非关键属性都应该依赖于主键时才满足。

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