Sql 数据库规范化、数字主键或字符串

Sql 数据库规范化、数字主键或字符串,sql,database,normalization,Sql,Database,Normalization,我不得不就此与我的教授争论,但他坚持认为我的解决方案是反常的,可能会引起冲突。他补充说,我无法理解数据库设计的概念 但是,他无法向我解释为什么他的解决方案是正确的,而我的解决方案是错误的 问题是关于以下kena数据库表的数据库规范化: 我的答案在左边,教授的答案在右边: 更好的视图: 你认为我的错误是什么?为什么你认为他说我的答案远非正确?这里没有太多的实际答案,但接下来。。。你的教授是对的 小计不适用于项目概念-不属于该表 雇员-同样-看起来没问题-但实际上,职业类别可能会随着时间的推移

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

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

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

我的答案在左边,教授的答案在右边:

更好的视图:


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

这里没有太多的实际答案,但接下来。。。你的教授是对的

  • 小计不适用于项目概念-不属于该表
  • 雇员-同样-看起来没问题-但实际上,职业类别可能会随着时间的推移而改变,并且不属于这两个类别
  • jobclass应该有您显示的所有3列-id、名称和费用
  • 行项目-相同,所以可以

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

    这里实际回答的内容不多-但这里是。。。你的教授是对的

  • 小计不适用于项目概念-不属于该表
  • 雇员-同样-看起来没问题-但实际上,职业类别可能会随着时间的推移而改变,并且不属于这两个类别
  • jobclass应该有您显示的所有3列-id、名称和费用
  • 行项目-相同,所以可以

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

    有两个显著的区别

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

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


    理想情况下,您希望主键是唯一的(两种解决方案都满足这一点)。您还希望它保持不变—这就是我将您的解决方案列为更好的解决方案的地方—当您更改作业类“sys analyst”的描述时会发生什么

    有两个显著差异

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

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


    理想情况下,您希望主键是唯一的(两种解决方案都满足这一点)。您还希望它保持不变—这就是我将您的解决方案列为更好的解决方案的地方—当您更改作业类“sys analyst”的描述时会发生什么

    这是自然密钥与代理密钥的问题吗?我们有这些。还是关于项目表中的小计?这确实是一个3NF冲突。

    这是一个自然密钥与代理密钥的问题吗?我们有这些。还是关于项目表中的小计?这确实是一个3NF冲突。

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

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


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

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

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


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

    我在这里看到一些问题

  • 正如其他人所指出的,小计是派生出来的,因此不应该包括在内

  • 教授未能抓住项目负责人,这似乎是无法从其他方面推断出来的。在原始版本中,它与员工的名字一起存储,这让我的眼睛直打颤

  • 正如其他人所说,在基于名称的pk可能更改的地方使用代理密钥是正常的

  • 总电荷是另一个衍生场,不应包含在3nf溶液中


  • 不,你走得太远了。您包含了两个派生字段,这是建模3nf时非常常见的错误。你的教授也不太可能,但如果我采访他的话,我会更深入一点

    我在这里看到了一些问题

  • 正如其他人所指出的,小计是派生出来的,因此不应该包括在内

  • 教授未能抓住项目负责人,这似乎是无法从其他方面推断出来的。在原始版本中,它与员工的名字一起存储,这让我的眼睛直打颤

  • 正如其他人所说,在基于名称的pk可能更改的地方使用代理密钥是正常的

  • 总电荷是另一个衍生场,不应包含在3nf溶液中


  • 不,你走得太远了。您包含了两个派生字段,这是建模3nf时非常常见的错误。你的教授也不太可能,但如果我采访他的话,我会更深入一点

    但是我是不是很不正确?但是我是不是很不正确?你为什么认为