Mysql 它值得正常化吗?
我正在研究数据库,我遇到了这个问题。例如,如果我有一个表product\u supply,其中包含发票Id(pk)、产品Id(pk)、供应日期、产品数量和价值Mysql 它值得正常化吗?,mysql,database,normalization,Mysql,Database,Normalization,我正在研究数据库,我遇到了这个问题。例如,如果我有一个表product\u supply,其中包含发票Id(pk)、产品Id(pk)、供应日期、产品数量和价值 | Invoice_ID | Product_ID | Date_Of_Supply | Quantity | Value_Of_Product | ------------------------------------------------------------------------- | AA11111111
| 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形式,并使用另一个表,例如带有发票ID(pk)和供货日期的供货日期,或者是否可以使用上表
| Invoice_ID | Date_Of_Supply |
-------------------------------
|AA111111111 | 08-07-2013 |
|BB222222222 | 10-09-2013 |
|CC333333333 | 15-10-2013 |
这绝对值得正常化。如果您需要修改一个供货日期,使用1NF,您需要更新多个记录;使用2NF,您只需要更新一条记录。另外,请注意1NF中的冗余数据,其中每个发票id的供应日期都存储了多次。这不仅浪费了空间,而且使处理“列出在日期X和Y之间提供的所有发票”这样的查询变得更加困难 编辑
正如罗伯特·哈维(Robert Harvey)在他的评论中指出的那样(我花了一段时间才理解,因为我因为某种原因变得很胖),如果您已经有一个表,每个
发票ID
都有一行(比如说,“发票表”),然后,您可能应该在该表中添加一列“供货日期”,而不是创建一个新表。将该表更改为第二个标准格式需要删除第一个标准格式表中的冗余。第一个问题是确定是否存在任何冗余
如果存在冗余,那么我们应该能够创建不涉及第一个表的主键(Invoice_ID)的第二个表。根据第一个表中的非主键列(即产品标识、供应日期、数量和产品价值),不清楚它们是否相互依赖
作为一般经验法则,如果您有一个表,其中所有非PK列都完全依赖于该表的PK列,则该表已经在2NF中。我理解您的逻辑,但在我看来,您可以将供应日期填入发票表中,除非每个发票有多个供应日期。您似乎对自己的答案非常确定,但您没有向OP提出任何问题,而且从问题中提供的有限信息来看,用法似乎一点也不明显。@RobertHarvey-发布的数据显示每个发票ID的多行具有相同日期。如果第二个正常形式生成OP描述的表,那么,每个发票ID必须有一个日期。@RobertHarvey-我很困惑。为什么2NF不需要第二个表?可能发票头表已经存在。主键是发票ID。@RobertHarvey-OP有表
产品供应
。问题是是否值得创建表supply\u date
,以便在2NF中放置供应日期。我没有看到提到发票表。没有极客ese这意味着什么?他只需在发票标题记录中填写供应日期(假设存在)?@RobertHarvey的工作一直在进行,目的是完善粗略构思的机器概念,该机器不仅提供反向无功电流,用于单边相位减速机,但也能够自动同步基数语法。这样的机器就是“涡轮增压器……”马特鲍尔:太棒了。我完全理解。现在请原谅我把我的锡纸帽子收起来。。。我的天啊,事实上这有点奇怪。根据我对数据的理解,也就是说。如果提供日期与另一列之间存在某种关系,则情况可能并非如此。“如果您有一个表,其中所有非PK列都完全依赖于该表的PK列,则该表已在2NF中”-当表具有复合键时,这是错误的。如果一个表在1NF中,那么它在2NF中,而且任何非键值都依赖于整个键,而不是它的适当子集。在OP的示例中,第二个标准失败,即使它满足您的标准。