这个问题显然是一个家庭作业问题。我听不懂我的教授,也不知道他在选举中说了什么。我需要逐步说明将下表标准化为1NF,然后是2NF,然后是3NF。

感谢您的帮助和指导。

最佳答案

好吧,我希望我能正确记住所有这些,让我们开始吧...
规则
使它们非常简短(而不是非常精确,只是让您初步了解所有内容):

  • 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 =美国,CAR_MODEL_NAME = Fox
  • 第2行:COUNTRY_ID = 2,CAR_MODEL_ID = 5,COUNTRY_NAME =德国,CAR_MODEL_NAME =马球

  • 也就是说,模型“Fox”在美国被称为“Fox”,而同一辆汽车模型在德国被称为“Polo”(不记得是不是真的)。
    违反了NF2,因为国家/地区名称不取决于汽车型号ID和国家/地区ID,而仅取决于国家/地区ID。
    解决方案:要实现NF2,请将COUNTRY_NAME移到带有COUNTRY_ID(主键)和COUNTRY_NAME列的单独的表“COUNTRY”中。要获得包含国家/地区名称的结果集,您需要使用JOIN连接两个表。
    NF3
    假设您有一个包含这些列的表格,用于表达各州的气候条件:
  • STATE_ID(varchar,主键)
  • CLIME_ID(外键,气候区域的ID,例如“沙漠”,“雨林”等)
  • IS_MOSTLY_DRY( bool )

  • 违反了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的每个元组使用“年份”(我的老师会把后者称为“关联实体”)。

    关于database - 将表格标准化为第三范式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15274985/

    10-11 13:27