【发布时间】:2013-02-22 21:00:31
【问题描述】:
这道题显然是一道作业题。我无法理解我的教授,也不知道他在选举期间说了什么。我需要一步一步地把下表规范化为 1NF,然后是 2NF,然后是 3NF。
感谢任何帮助和指导。
【问题讨论】:
标签: database database-design relational-database normalization database-schema
这道题显然是一道作业题。我无法理解我的教授,也不知道他在选举期间说了什么。我需要一步一步地把下表规范化为 1NF,然后是 2NF,然后是 3NF。
感谢任何帮助和指导。
【问题讨论】:
标签: database database-design relational-database normalization database-schema
好吧,我希望我没记错,让我们开始吧……
为了让它们非常简短(并且不是很精确,只是为了让您初步了解它的全部内容):
“state”列的值类似于“WA, Washington”。违反了 NF1,因为这是两个值,缩写和名称。
解决方案:要满足 NF1,请创建两列,STATE_ABBREVIATION 和 STATE_NAME。
假设您有一个包含这 4 列的表格,表示汽车型号的国际名称:
COUNTRY_ID(数字,主键)CAR_MODEL_ID(数字,主键)COUNTRY_NAME (varchar)CAR_MODEL_NAME (varchar)表格可能有这两个数据行:
也就是说,模型“Fox”在美国被称为“Fox”,但同一款车型在德国被称为“Polo”(不记得是不是真的)。
违反了NF2,因为国家名称不依赖于车型ID和国家ID,而只依赖于国家ID。
解决方案:要满足 NF2,请将 COUNTRY_NAME 移动到单独的表“COUNTRY”中,其中包含 COUNTRY_ID(主键)和 COUNTRY_NAME 列。要获得包含国家名称的结果集,您需要使用 JOIN 连接两个表。
假设您有一张包含这些列的表格,表示各州的气候条件:
STATE_ID(varchar,主键)CLIME_ID(外键,“沙漠”、“雨林”等气候区的 ID)IS_MOSTLY_DRY (bool)违反了 NF3,因为 IS_MOSTLY_DRY 仅依赖于 CLIME_ID(我们至少假设一下),而不依赖于 STATE_ID(主键)。
解决方案:要满足 NF3,请将列 MOSTLY_DRY 放入气候带表中。
以下是关于练习中给出的实际表格的一些想法:
我应用上述 NF 规则而不挑战主键列。但它们实际上没有意义,我们稍后会看到。
因此,如果您删除所有违反 NF2 或 NF3 的列,则仅保留主键(EMP_ID 和 DEPT_CD)。剩下的部分违反了给定的业务规则:这种结构将允许员工同时在多个部门工作。
让我们从远处回顾一下。您的数据模型是关于员工、部门、技能以及这些实体之间的关系。如果将其标准化,您最终将得到一张员工表(包含 DEPT_CD 作为外键),一张用于部门,一张用于技能,另一张用于员工与技能之间的关系,持有“技能年”对于 EMP_ID 和 SKILL_CD 的每个元组(我的老师会称后者为“关联实体”)。
【讨论】:
查看表中的前两行,
并查看该表中哪些列被标记为“PK”,
并假设“PK”代表“主键”,
并且查看这两行中这两列出现的值,
我建议您的教授从数据库教学中解脱出来,直到他自己对主题。
这个练习不能被认真对待,因为问题陈述本身包含了无可救药的矛盾信息。
(请注意,因此,对于这个问题根本没有“好”或“正确”的答案!!!)
【讨论】:
另一个过于简单的答案即将出现。
在 3NF 关系表中,每个非键值都由键、整个键和除了键确定(所以帮帮我 Codd ;))。
1NF:关键。这意味着如果您指定键值和命名列,则在行和列的交叉处最多会有一个值。不允许使用多值,例如用逗号分隔的一系列值,因为您不能仅使用键和列名直接获取值。
2NF:全键。如果不属于键的列由键列的适当子集确定,则违反了 2NF。
3NF:只有钥匙。如果一列是由一组非关键列确定的,则违反了 3NF。
【讨论】:
3NF 仅在满足第二范式且没有任何传递依赖且所有非键属性都应依赖于主键时才满足。
传递依赖: R =(A,B,C)。 A->B 和 B->C 然后 A->C
【讨论】: