【问题标题】:Normalize table to 3rd normal form将表格规范化为第三范式
【发布时间】:2013-02-22 21:00:31
【问题描述】:

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

感谢任何帮助和指导。

【问题讨论】:

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


【解决方案1】:

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

规则

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

  • 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=Germany,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 (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,因为它们不是部门特定的,而只是员工特定的。
  • SKILL_NM违反了NF3,因为技能名称只依赖于技能代码,甚至不是复合主键的一部分。
  • SKILL_YRS 违反 NF3,因为它依赖于主键成员 (EMP_ID) 和非主键成员 (SKILL_CD)。所以它部分依赖于非主键属性。

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

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

【讨论】:

  • 好的,Walter Mitty,我明白您编辑的重点。当一列依赖于主键列加上其他列时,您是对的,违反了 NF3。但是,如果列根本不依赖主键,也违反了 NF3,不是吗?所以我建议 NF3:“根据任何非主键列查找列”。你同意吗?
  • 很详细,我觉得很有用!谢谢
【解决方案2】:

查看表中的前两行,
并查看该表中哪些列被标记为“PK”,
并假设“PK”代表“主键”,
并且查看这两行中这两列出现的值,
我建议您的教授从数据库教学中解脱出来,直到他自己对主题。

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

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

【讨论】:

    【解决方案3】:

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

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

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2014-09-20
        • 1970-01-01
        • 1970-01-01
        • 2015-08-08
        • 2013-09-27
        • 2013-07-17
        • 2015-08-21
        • 1970-01-01
        相关资源
        最近更新 更多