我正在研究数据库,我遇到了这个问题。如果我有表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 |
答案 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中。