【问题标题】:database normalization, numerical primary key or string [closed]数据库规范化,数字主键或字符串
【发布时间】:2013-02-24 06:58:14
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: sql database normalization


    【解决方案1】:

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

    1. 小计不适合项目的概念 - 不属于该表。
    2. 员工 - 相同 - 看起来还可以 - 但实际上工作类别可能会随着时间的推移而变化,并且不属于任何一个
    3. jobclass 应该包含所有 3 列 - id、name 和 charge
    4. 订单项 - 一样好。

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

    【讨论】:

    • 但我说的不正确吗?
    【解决方案2】:

    有两个显着差异。

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

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

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

    【讨论】:

    • 为什么你认为jobclass的主键没有意义?
    • 它没有内在的商业意义——它是一个代理键。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

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

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

        2. Professor 未能捕获项目负责人,似乎无法以其他方式推导出项目负责人。原来是和employee_name一起存储的,这真的让我眼花缭乱。

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

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

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

        【讨论】:

          猜你喜欢
          • 2013-06-29
          • 2010-10-10
          • 2016-09-16
          • 1970-01-01
          • 2013-01-18
          • 2012-12-24
          • 2018-09-29
          • 2020-02-12
          • 2012-04-25
          相关资源
          最近更新 更多