将表规范化为第3范式

Dav*_*ell 7 database database-design normalization relational-database database-schema

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

在此输入图像描述

我感谢任何帮助和指导.

小智 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_ID(主键)和的单独表"COUNTRY" 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的每个元组(我的老师会称后者为"关联实体").