2011-07-22 19 views
1

我有3个表:数据库阿布罗奇 - 冗余数据

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

我的问题是:这是正确的,以保持出货量表PRODUCT_ID?我将它保留在这里以查找有关已发货产品的信息,而不使用订单表。

+1

订单中是否包含产品?在我看来,订单有1-> n个产品和1-> n个出货。这不是这种情况吗? – GarlicFries

+0

如果您在同一订单上有两种产品,您会做什么? –

+0

为什么这样做?您只需编写适当的连接以从架构的正确标准化版本获取数据 – manku

回答

2

我建议:

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, ...) 

出货是一种多余的 - 我想补充继真与美的原则,地址等转化为订单......

1

你可以这样做,但要小心 - 如果在订单表中的信息可能会改变,这将是一个问题 - 即,如果在订单表相应的记录改变PRODUCT_ID,数据库会出现不一致。

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

还检查数据库设计的正常形式(NF),我不知道这个冗余是否违反了一些正常的形式。但如果你决定保留一些NF,这取决于你。

+1

产品表中的信息具有当前价格,而订单/装运表中的信息具有订单发货时的价格。所以这不会违反数据库设计原则 - 一个是模板,一个是该模板的实例。 – MJB

+0

@MJB刚才有些事情出现在我的脑海里。用户可以查看订购产品的历史记录。如果管理员编辑有关产品(名称,说明)的信息,会发生什么情况?现在,为了避免这个问题如果订购的产品被锁定。 – morandi3

+0

@ morandi3:有些系统还支持不同项目的“修订版”(如车型年,或特定区域的变化)的概念。 – TMN

1

,你不应该存储冗余数据 - 这是发生错误的好机会,这很丑陋,会引起未来开发人员的困惑。

你被允许打破真与美的原则,但只有当你遇到一个问题,你不能以任何其他方式解决。例如,如果通过加入订单表发现您的查询太慢了,那么将数据非规范化(这是您正在做的事情的技术名称)是可以的 - 如果您记录它并确保所有开发人员都了解。

只是在查询中避免额外加入似乎不是一个足够好的理由....