1

我正在研究数据库并且遇到了这个问题。例如,如果我有包含 Invoice_Id(pk)、Product_Id(pk)、Date_Of_Supply、Quantity 和 Value_Of_Product 的表 product_supply。

   | Invoice_ID | Product_ID | Date_Of_Supply | Quantity | Value_Of_Product |
   -------------------------------------------------------------------------
   | AA111111111|      5001  | 08-07-2013     |     50   |       200$       |
   | AA111111111|      5002  | 08-07-2013     |     20   |       300$       |
   | BB222222222|      5003  | 10-09-2013     |     70   |        50$       |
   | CC333333333|      5004  | 15-10-2013     |     100  |        40$       |
   | CC333333333|      5005  | 15-10-2013     |     70   |        25$       |
   | CC333333333|      5006  | 15-10-2013     |     100  |        30$       |

正如我们所看到的,该表已经是 1NF 形式。我的问题是。就规范化而言,将这个表规范化为 2NF 形式并有另一个表是明智的,例如带有 Invoice_ID(pk) 和 Date_Of_Supply 的 supply_date 或者如果有上表可以吗?

    | Invoice_ID | Date_Of_Supply |
    -------------------------------
    |AA111111111 |   08-07-2013   |
    |BB222222222 |   10-09-2013   |
    |CC333333333 |   15-10-2013   |
4

2 回答 2

2

绝对值得标准化。如果需要修改一个供货日期,用1NF,需要更新几条记录;使用 2NF,您只需要更新一条记录。此外,请注意 1NF 中的数据冗余,其中供应日期为每个发票 ID 存储多次。它不仅浪费空间,而且使处理诸如“列出在日期 X 和 Y 之间提供的所有发票”之类的查询变得更加困难。

编辑

正如罗伯特·哈维(Robert Harvey)在他的评论中指出的那样(我花了一段时间才理解,因为由于某种原因我很厚),如果您已经有一个表,每个表都有一行Invoice_ID(例如,“发票表”),那么您可能应该Date_Of_Supply为该表添加一列,而不是创建一个新表。

于 2013-06-12T03:22:19.467 回答
0

将表格更改为第二范式涉及删除第一范式表中的冗余。第一个问题是确定是否有任何裁员。

如果存在冗余,那么我们应该能够创建第二个不涉及第一个主键(Invoice_ID)的表。根据第一个表中的非 PK 列(即 Product_ID、Date_Of_Supply、Quantity 和 Value_Of_Product),尚不清楚这些列是否相互依赖。

作为一般经验法则,如果您有一个表,其中所有非 PK 列都仅依赖于该表的 PK 列,则它已经在 2NF 中。

于 2013-06-12T03:33:29.953 回答