0

我不得不就此与我的教授争论,但他坚持认为我的解决方案异常,可能会引起冲突。他补充说,我无法理解数据库设计的概念。

但是,他无法向我解释为什么他的解决方案是正确的,而我的解决方案是错误的。

问题是关于以下 kena 数据库表的数据库规范化:

问题

左边是我的回答,右边是教授的回答:

答案

更好的视图: http ://tny.cz/48c4a28b

您认为我的错误是什么?为什么您认为他说我的答案远非正确?

4

5 回答 5

1

在这里实际上没有太多要回答的问题-但是在这里……您的教授是正确的。

  1. 小计不适合项目的概念 - 不属于该表。
  2. 员工 - 相同 - 似乎还可以 - 但实际上工作类别可能会随着时间而改变,并且不属于任何一个
  3. jobclass 应该有你显示的所有 3 列 - id、name 和 charge
  4. 行项目 - 一样好。

此外,项目负责人似乎是一个额外的概念。不应该是这个答案的一部分,因为它似乎没有出现在您正在处理的基表中。

于 2013-03-08T16:47:42.877 回答
1

有两个显着差异。

首先,您似乎将小计存储在项目中。这是重复的信息 - 您可以通过汇总每个项目的费用来获得小计。数据库设计的一个关键方面是“不要重复自己”。

第二个是您为“jobclass”创建了一个无意义的主键,而您的教授使用 jobclass 的名称作为主键。

理想情况下,您希望您的主键是唯一的(两种解决方案都满足这一点)。您还希望它保持不变 - 这就是我认为您的解决方案更好的地方 - 当您更改工作类“系统分析师”的描述时会发生什么?

于 2013-03-08T16:48:08.133 回答
1

无论您使用作业类名称还是代理键,从实际的角度来看,两者都可以且正确。如果您使用该名称,则该名称很难更改,因为它被用作 FK 关系的一部分。这就是为什么通常会分配像您的答案中这样的代理 ID。

它也更节省空间(这是一个物理问题)。

主键应该小而稳定,所以我喜欢基于 ID 的解决方案。

于 2013-03-08T17:06:23.033 回答
1

我在这里看到了一些问题。

  1. 正如其他人指出的那样,小计是派生的,因此不应包括在内。

  2. 教授未能抓住项目负责人,而项目负责人似乎无法以其他方式推导出来。在原始版本中,它与employee_name 一起存储,这实际上让我大吃一惊。

  3. 正如其他人所说,在基于名称的 pk 可能更改的地方使用代理键是预期和正常的。

  4. Total_charge 是另一个派生字段,不应包含在 3nf 解决方案中。

不,你不会离开的。您包含了几个派生字段,这在 3nf 建模中是一个很常见的错误。你的教授也不远,但如果我采访他,我会更深入地挖掘这个。

于 2013-03-08T18:00:07.780 回答
0

这是一个自然键与代理键的问题吗?我们以前吃过这些。还是与项目表中的小计有关?这确实违反了 3NF。

于 2013-03-08T16:48:55.790 回答