7

这道题显然是一道作业题。我无法理解我的教授,也不知道他在选举期间说了什么。我需要逐步说明将下表首先标准化为 1NF,然后是 2NF,然后是 3NF。

在此处输入图像描述

我感谢任何帮助和指导。

4

4 回答 4

21

好吧,我希望我没记错,让我们开始吧……

规则

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

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

指示

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

例子

NF1

列“ state”具有类似“WA, Washington”的值。NF1 被违反,因为这是两个值,缩写和名称。

解决方案:要满足 NF1,创建两列,STATE_ABBREVIATION并且STATE_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,因为它们不是部门特定的,而是特定于员工的。
  • NF3被SKILL_NM违反了,因为技能名称只依赖于技能代码,甚至不是复合主键的一部分。
  • SKILL_YRS 违反了 NF3,因为它依赖于一个主键成员 (EMP_ID) 和一个非主键成员 (SKILL_CD)。所以它部分依赖于非主键属性。

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

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

于 2013-03-07T16:50:17.450 回答
4

查看表中的前两行,
并查看该表中哪些列被标记为“PK”,
并假设“PK”代表“主键”,
并查看为这两个列显示的值两行,
我建议你的教授从数据库教学中滚出来,直到他这个主题进行了适当的教育后再回来。

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

(请注意,因此,对于这个问题根本没有“好”或“正确”的答案!!!)

于 2013-03-07T20:16:30.923 回答
1

另一个过于简单的答案出现了。

在 3NF 关系表中,每个非键值都由键、整个键和除了键确定(所以帮助我 Codd ;))。

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

2NF:全键。如果不属于键的列由键列的适当子集确定,则违反了 2NF。

3NF:只有钥匙。如果一列是由一组非关键列确定的,则违反了 3NF。

于 2013-03-07T17:05:13.620 回答
0

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

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

于 2013-11-21T10:01:55.960 回答