【问题标题】:Normalisation: im new to db normalisation. I dont know if my answer is right规范化:我是数据库规范化的新手。我不知道我的回答是否正确
【发布时间】:2015-05-26 18:30:13
【问题描述】:

将以下内容标准化为 3NF:

代号 |项目名称 |员工人数 |员工名 |工作班 |小时 |小时 |

    15 |Evergreen|   103   |  June    |Engineer | 84      |  23  |
    15 |Evergreen|   101   |  John    |Designer | 105     |  19  |
    15 |Evergreen|   105   |  Alie    |Designer | 105     |  35  |
    15 |Evergreen|   106   |  Dave    |Analyst  | 96      |  12  |
    15 |Evergreen|   102   |  Anne    |Clerical | 26      |  23  |

编辑:

Functional dependency 1: projnum → projname

FD2: empnum → empname

FD3: empnum, empname → jobclass

FD4: jobclass → chrghour

FD5: projnum, empnum → hours 

1NF 我得到:

Table 1(projnum[pk], projname, hours)
Table 2(projnum[pk], empnum[pk], empname, jobclass, chrghour)

2NF 我得到:

Table 1(projnum[pk], projname, hours)
Table 2(projnum[pk], empnum[pk])
Table 3(empnum[pk], empname, jobclass, chrghour)

3NF 我得到:

Table 1(projnum[pk], projname) //then i put [hours] in table 2 but I DONT KNOW THE LOGIC BEHIND. Explanation is welcomed.
Table 2(Projnum[pk], empnum[pk], hours)
Table 3(empnum[pk], empname, jobclass)
Table 4(jobclass[pk], chrghour)

有没有违反范式的规则?我的回答正确吗?

【问题讨论】:

  • 通过 BCNF 标准化是基于函数依赖的。编辑您的问题,并包含功能依赖项。
  • 归一化基于你知道的所有 FD。您应该包括所有您知道的 FD。句子“我们应该以第二范式本身列出所有 FD 吗?”真的没有意义。
  • 你确定 projname -> projnum 不是函数依赖吗? empnum, empname -> jobclass 会简化为 empnum -> jobclass,不是吗?
  • a) 你误解了what functional dependency means。 b)如果您“几乎确定”,那么您就是在猜测。你在猜吗? (我们有时不得不在数据库设计的现实世界中进行猜测,但这是学习规范化的一种非常糟糕的方式。)
  • 如果你没有猜到,你可以从作业问题的文本中读取 FD。

标签: database database-design normalization database-normalization


【解决方案1】:

你的 3NF 结果是正确的,但你的道路是,呃,绝望。

归一化的过程是一个分解(“分裂”)的过程。重要的是要了解您从 单个 关系模式开始,以及 所有 应用于该模式的 FD。同样重要的是要理解,在规范化过程中的任何时候,某些特定的 FD 集都适用于一个单一的关系模式。因此,在将初始单一模式拆分为两个关系模式后,ALSO 最终会得到两组不同的 FD,每组在分裂。甚至可能通过进行某些特定的模式拆分,您失去表达适用于模式-before-split 的某些特定 FD 的所有能力。在您所做的第一次拆分中,您已经对 FD5 完全这样做了。 FD5 在 Table1 中不可表达,因为该模式中缺少 empnum,并且在 Table2 中不可表达,因为该模式中缺少 hours。所以FD5已经完全无法表达了。 (这并不总是可以避免的,因此不一定是坏事,但在你的情况下它是。)

事实上,你只能继续分裂得越来越远,这就是你的分解过程有缺陷的原因。您不能“将 [小时] 移至 Table2”。

【讨论】:

  • 分解当然是一种标准化方法,但它不是唯一的。通过完全不涉及任何分解的过程来实现规范化的数据库设计是完全可能的。 IMO有点不幸的是,学生仍然被教归一化作为通过连续范式进行分解的线性过程。我不相信这是每个​​数据库设计概念的最佳方式。
  • @sqlvogel,如果您指的是从一开始就在 5NF 中进行设计的概念,仅基于直觉/经验/常识/...,是的,我很清楚我也很清楚,与“教科书”分解法归一化相比,它通常会在更短的时间内产生良好的结果。但是,如果您允许只使用教科书方法(通常是教科书课程中的情况),那么您就可以进行分解。
【解决方案2】:

需要更多关于数据含义的信息;有些答案似乎是错误的,但哪些是不可能的。具体来说:

  • 如果hours 是它所属的项目的持续时间 项目表,如 2NF 答案;如果是员工的时间 从事一个属于多对多关系表的项目 项目和员工之间,就像在 3NF 答案中一样。
  • 同一员工能否以不同的chrghour 和/或jobclass 值出现?

【讨论】:

  • 这似乎更适合作为评论而不是作为答案。
  • 不,同一员工不能以不同的 chrghour 或 jobclass 出现,但他们可以以不同的 [hours] 出现。
猜你喜欢
  • 2013-12-25
  • 1970-01-01
  • 2018-07-08
  • 2014-07-29
  • 1970-01-01
  • 1970-01-01
  • 2013-07-26
  • 2017-01-27
  • 1970-01-01
相关资源
最近更新 更多