【问题标题】:Database normalisation (1NF to 3NF)数据库规范化(1NF 到 3NF)
【发布时间】:2016-08-17 02:44:24
【问题描述】:

我目前正在做一些课程作业,其中给了我一个建议的表格,我必须确定它会破坏哪些范式规则。我想我已经做到了,但是我一直对何时应用某些规则感到困惑。因此,如果有人可以检查它并向我解释为什么有问题的话,我将不胜感激。

例子:

这会破坏 1NF,因为每个摄影师可能会参加多场比赛(比赛 ID),因此存在重复数据,因此为了解决这个问题并将其带到 1NF,我这样做:

由于没有复合键,这两个表都已经在 2NF 中,但是公司和公司编号之间存在传递依赖关系。因此这样做是为了带入 3NF:

手机号码和照片名称也是传递依赖吗?如果有人有相同的名字,那是否意味着它不是?此外,我不确定在将其带到 1NF 时是否会将公司和公司编号归类为重复项。

谢谢。


编辑:请注意,很抱歉造成混淆 - PhotoID 是摄影师 ID。完整的列名:

Photographer ID (Primary key) <- Told this is the PK in the question

Photographer Name,

Mobile Phone Number,

Employing Company, <-Told this is unique in the question

Employing Company Phone Number,

Matches Attending,

【问题讨论】:

    标签: mysql sql database normalization database-normalization


    【解决方案1】:

    在您的第二张图片中,您跳过了对重复组的传统 1NF 处理(将分组数据复制到每个 Matches ID 的单独行中)并直接使用 2NF。那里没问题。你的 3NF 也是正确的。

    手机号和照片名也是传递依赖吗?

    没有。拍摄者姓名和手机号是拍摄者ID的属性(函数依赖)。

    我不确定在将其带到 1NF 时是否会将公司和公司编号归类为重复。

    识别重复不是将表转换为 1NF 的一部分。

    【讨论】:

      【解决方案2】:

      我认为,您的问题是,据我所知,您实际上并没有一个人的标识符。最接近你的是名字。这可能会给您带来问题,但我认为,在这种情况下,它通过了 3NF 的定义。

      最大的问题是您可能希望能够识别名为“约翰·詹姆斯”的两个不同的人,所以实际的问题是您需要一些其他信息才能做到这一点(例如,社会安全号码、员工id 之类的)。此时,需要将 name 拆分并与人员的标识符一起存储(因为依赖人员编号是 id 的函数,但 name 是人员编号的函数)。

      【讨论】:

      • 抱歉造成混淆 - PhotoID 是摄影师 ID。我会更新问题以使其更清楚。
      • 在这种情况下,这听起来像是 3NF,因为名称始终是摄影师 ID 的依赖项。
      【解决方案3】:

      据我所知。表中不能有任何功能依赖才能使其通过 3NF 测试。

      如果表中有任何列可以代替主键,那么它一定不存在。

      现在看一下标准化后的表格 - 手机号码肯定是唯一的 id。

      【讨论】:

      • 所以你的建议应该是这样的i.stack.imgur.com/uhi9q.png? - 抱歉不知道如何在评论中显示。
      • 电话号码不是标识符,因为人们确实共享电话,甚至是移动电话。
      • 说实话取决于用例。我从未部署过允许用户重复输入手机号码的系统。我说的只是手机号码。
      猜你喜欢
      • 2014-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多