是否值得正常化?

时间:2013-06-12 03:19:35

标签: mysql database normalization

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

   | 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)的Supply_date并且Date_Of_Supply或上表是否合适?

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

2 个答案:

答案 0 :(得分:2)

绝对值得正常化。如果您需要修改1NF的供应日期,则需要更新多个记录;使用2NF,您只需要更新一条记录。另外,请注意1NF中的数据冗余,其中每个发票ID都会多次存储供应日期。它不仅浪费空间,而且更难以处理查询,例如“列出日期X和Y之间提供的所有发票”。

修改

正如Robert Harvey在他的评论中指出的那样(我花了一段时间才明白,因为我因为某种原因而变得很厚),如果你已经有一个表格,每个Invoice_ID都有一行(比如说,“发票表”),然后您应该为该表添加Date_Of_Supply列而不是创建新表。

答案 1 :(得分:0)

将表格更改为第二范式包括删除第一个普通表格表格中的冗余。第一个问题是确定是否存在任何裁员。

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

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