数据库 - 试图巩固对规范化的理解,这是如何规范化的?

时间:2016-09-17 21:13:40

标签: database database-design normalization database-normalization

how normalized is this table?

Example SqlFiddle

所以我知道规范化本身的主题和定义已经得到了很好的讨论,但我希望能够对我对规范化的理解做出一些澄清。一个例子是我在Access中快速绘制的图表,我认为,我认为这些关系和表格本身都符合3NF标准。有一个Projects表,其中包含以下字段:ProjNumber(PK),ProjName和ProjDesc。然后有一个Assignments表,复合键与EmpID / ProjNumber一致,字段为HourlyBillingRate,NumOfHours和TeamNum。最后是Teams表,它包含TeamNum(PK),TeamName,ProjNumber字段。

分配和团队中的ProjNumber都是与Projects表相关的外键,而Assignments中的TeamNum字段是与Teams表主键相关的外键。我不太确定是否有必要直接与Teams表关联,如果我有ProjNumber外键,因为该项目将有一个关联的TeamNum。

这些表格的背景是,必须完成一个项目,一个与执行该团队相关联的团队,然后是该团队中的员工,他们按小时计费该项目。在。下工作。

我使用复合键的原因是,我想回答“员工在多个项目上工作的内容是什么?”的问题,因此我无法将EmpID作为唯一的主键,因此我选择将其设为复合密钥,因为即使员工在多个项目上工作,两者的组合也将始终是唯一的。我相信每个领域都是必要的,并且与各自的主键完全相关。

思考?它实际上是否符合3NF标准?

1 个答案:

答案 0 :(得分:1)

这取决于。您的图表和讨论似乎假设主键是每个表中唯一的候选键。情况似乎并非如此。

在Assignments表中,看起来EmpID和TeamNumber是另一个候选键,前提是TeamNumber可能不是NULL。

如果我们使用EmpId查看此表,TeamNumber作为键,那么它不在2NF中。 ProjNumber由TeamNumber决定,而不是整个密钥。

所以现在你的问题的答案是关于是否针对所有候选键或仅仅声明的prmary键来分析FD。我已经看到了关于规范化的教程,它们都是双向的。我遵循考虑所有候选键的那个,因此该表不在2NF中。

除非我在您的情况下误解了FD,否则Assigment.TeamNumber可能为NULL。

但是,您的SQL Fiddle演示文稿有所不同。现在,如果一个项目中有多个团队,并且一个员工被分配到一个项目几个小时,那么就没有任何方法可以告诉该员工在哪个团队。这些FD在SQL Fiddle示例中以及我从图中得到的含义中都不相同。