Mysql 数据库方法-冗余数据

Mysql 数据库方法-冗余数据,mysql,duplicates,redundancy,Mysql,Duplicates,Redundancy,我有三张桌子: products (id, name, price, etc) orders (id, date, payment_method, etc) shipments (id, order_id, product_id, address, etc) 我的问题是:在发货表中保留产品标识是否正确?我把它放在这里是为了在不使用orders表的情况下查找已装运产品的信息。您可以这样做,但要小心-如果orders表中的信息可能会更改,这将是一个问题-即,如果orders表中的相应记录更改了产品

我有三张桌子:

products (id, name, price, etc)
orders (id, date, payment_method, etc)
shipments (id, order_id, product_id, address, etc)

我的问题是:在发货表中保留产品标识是否正确?我把它放在这里是为了在不使用orders表的情况下查找已装运产品的信息。

您可以这样做,但要小心-如果orders表中的信息可能会更改,这将是一个问题-即,如果orders表中的相应记录更改了产品id,数据库将不一致

我确实使用了冗余列,例如在静态字典中


还要检查数据库设计的范式NF,我不确定这种冗余是否违反了一些范式。但是,您是否决定保留一些NF取决于您。

您可以这样做,但要小心-如果表orders中的信息可能会更改,这将是一个问题-即,如果表orders中的相应记录更改了产品id,则数据库将不一致

我确实使用了冗余列,例如在静态字典中

还要检查数据库设计的范式NF,我不确定这种冗余是否违反了一些范式。但是,你是否决定保留一些NF取决于你自己。

我建议:

products (product_id, name, price, etc)
orders (order_id, date, payment_method, etc)
orderitem (orderitem_id, order_id, product_id, ...)
shipment (shipment_id, order_id, ... )
发货有点多余-我会将地址等添加到订单中…

我建议:

products (product_id, name, price, etc)
orders (order_id, date, payment_method, etc)
orderitem (orderitem_id, order_id, product_id, ...)
shipment (shipment_id, order_id, ... )

发货有点多余-我会将地址等添加到订单中…

遵循真与美的原则,您不应该存储多余的数据-这是错误发生的一个很好的机会,它很难看,它会在未来开发人员的头脑中造成混乱

你可以打破真和美的原则,但前提是你遇到了用任何其他方法都无法解决的问题。例如,如果您通过加入orders表发现您的查询速度太慢,那么可以对数据进行非规范化,这是您正在做的事情的技术名称—如果您记录它并确保所有开发人员都理解它


仅仅避免查询中的额外连接似乎不是一个很好的理由……

遵循真与美的原则,您不应该存储冗余数据-这是错误发生的一个很好的机会,它很丑陋,它会在未来开发人员的头脑中造成混乱

你可以打破真和美的原则,但前提是你遇到了用任何其他方法都无法解决的问题。例如,如果您通过加入orders表发现您的查询速度太慢,那么可以对数据进行非规范化,这是您正在做的事情的技术名称—如果您记录它并确保所有开发人员都理解它


仅仅在查询中避免额外的连接似乎不是一个很好的理由……

订单不包含产品吗?在我看来,订单有1->n个产品和1->n个装运。不是这样吗?如果同一订单上有两种产品,你会怎么做?为什么这样做?您只需编写适当的联接即可从正确规范化的schemaA版本获取数据订单只有一个产品。订单不包含产品吗?在我看来,订单有1->n个产品和1->n个装运。不是这样吗?如果同一订单上有两种产品,你会怎么做?为什么这样做?您只需编写适当的联接即可从正确规范化版本的schemaA中获取数据订单只有一个产品。产品表中的信息具有当前价格,而订单/发货表中的信息具有订单发货时的价格。所以这不会真正违反数据库设计原则——一个是模板,另一个是该模板的实例。@MJB刚才我想到了一些东西。用户可以查看订购产品的历史记录。如果管理员编辑有关产品名称、说明的信息,会发生什么情况?现在为了避免这个问题,如果订购了产品,产品会被锁定。@morandi3:一些系统还支持对某个项目进行不同的修订,例如车型年份或特定地区的变化。产品表中的信息具有当前价格,而订单/发货表中的信息具有订单发货时的价格。所以这不会真正违反数据库设计原则——一个是模板,另一个是该模板的实例。@MJB刚才我想到了一些东西。用户可以查看订购产品的历史记录。如果管理员编辑有关产品名称、说明的信息,会发生什么情况?现在为了避免这个问题,如果订购了产品,产品将被锁定。@morandi3:一些系统还支持对某个项目进行不同修订的概念,如车型年份或特定地区的变化。