【问题标题】:How to split example data table into BCNF/4NF?如何将示例数据表拆分为 BCNF/4NF?
【发布时间】:2013-09-04 11:47:50
【问题描述】:

我正在尝试更多地掌握简单的数据库概念,但在更高的规范化方面遇到了麻烦。例如,以下在 Boyce Codd 范式 (BCNF) 和第四范式 (4NF) 中会是什么样子?

INVOICE(CustomerNumber、FirstName、LastName、Phone、InvoiceNumber、DateIn、DateOut、ItemType、Quantity、ItemPrice、ExtendedPrice、SpecialInstructions)

到目前为止,我已经做到了,但我知道我还没有做到:

客户(客户编号、名字、姓氏、电话、发票号码) INVOICE(InvoiceNumber, DateIn, DateOut, ItemType, Quantity, ItemPrice, SpecialInstructions)

根据我正在阅读的书,以下假设已经到位:

  1. CustomerNumber --> (FirstName, LastName),但不是 CustomerNumber -->-->(名,姓)
  2. 客户编号 -->--> 电话。可能有多个电话号码 每个客户。
  3. 一个客户有很多订单,但每个订单只与 一位客户。
  4. 一个 ORDER 有多个 ItemType,但每个 ItemType 在 任何订单。
  5. 商品价格不会因订单而异,因此 ItemType 确定 商品价格。
  6. SpecialInstructions 与每个项目类型相关联,因为 可能会针对不同的项目给出不同的说明。
  7. 订单号是分配给订单本身的编号,没有 与任何特定客户的关联。因此我们有这样的数字 如“123454”、123455 等,而不是“客户 101,订单 1”, 客户 101,订单 2”,客户 102,订单 1”,等等。
  8. ItemPrice 可能因订单而异,因此特价优惠是 反映在价格中。

谁能帮帮我?

【问题讨论】:

  • 这可能属于Database Administrators。只是对于初学者来说,INVOICE 应该有一个到 Customer 的 FK,而不是像你所拥有的那样。
  • 你能告诉我它应该是什么样子 4NF 吗?
  • 项目不应在 Invoice 表中,而应在 InvoiceItems 表中。您假设发票只能包含一项。

标签: mysql sql sql-server database database-design


【解决方案1】:

我不知道如何回复这篇文章 (see this meta post),所以我只是提出一些想法,而不是“回答”,希望能帮助你朝着正确的方向前进。

@Analytic,您似乎只完成了第 2 项!你的 ORDER 表在哪里?项目呢?请将其添加到您的帖子中,以便我们知道您的第一次尝试是什么(我们不会为您做作业!)。

因此,由于您仅在 #1 和 #2 上为我们提供了努力,因此我将对客户电话号码发表评论。您的设计仅允许每个客户使用一个电话号码,因此不符合要求,对吗?你会想象什么样的数据结构可以让你为一个客户拥有多个电话号码?您会在客户表上创建更多字段,例如 Phone1、Phone2、Phone3 等吗?那会实用吗?你会放几个?如果客户曾经拥有比您计划的更多的东西怎么办?查看描述one-to-many) 关系的网页。

如果您想在这篇文章中添加更多作品并付出真诚的努力,我们会尽力为您提供帮助。

祝你好运。

【讨论】:

  • 我明白了。谢谢你报道你所拥有的!我会在早上重新审视事情并评论我的进展。
猜你喜欢
  • 2021-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-02
  • 1970-01-01
  • 2014-11-24
相关资源
最近更新 更多