一个订单上的多个不同产品的表设计

时间:2010-10-07 14:56:21

标签: sql relational data-modeling

如果我有一个销售苹果和显示器的在线购物网站,并且这些存储在不同的表中,因为苹果的区别属性是颜色而显示器的区别是分辨率如何将这两者都添加到发票表中保留参照完整性而不加入这些表格?

                        Invoices(InvoiceId)
                                 |
                  InvoiceItems(ItemId, ProductId)
                                 |
                       Products(ProductId)
              |                                            |
Apples(AppleId, ProductId, Colour)   Monitors(MonitorId, ProductId, Resolution)

4 个答案:

答案 0 :(得分:3)

首先,我会将它们存储在单个Products表中,而不是存储在两个不同的表中。

在第二位,(除非每张发票仅适用于一种产品)我不会将它们添加到单个发票表中 - 相反,我会设置一个Invoice_Products表,以便在表之间进行链接。

我建议你研究Database Normalisation

答案 1 :(得分:1)

您的数据模型的问题是您需要使用参考方案来识别产品吗?也许SKU

然后通过分配SKU将每个苹果识别为产品。同样对于显示器。然后在发票项目中使用SKU。像这样:

产品{sku} key {sku};

invoice_item {invoice_id,sku} key {invoice_id,sku};

apple {color,sku} 键{color} key {sku};

监控{size,sku} key {size} key {sku};

有适当的约束...特别是apple {sku}和monitor {sku} == product {sku}的联合。

答案 2 :(得分:0)

因此Invoice表有ProductID FK,ProductID可以是AppleID(PK颜色)还是MonitorID(PK分辨率)?

如果是这样,您可以引入一个ProductTypeID,其值为0 = apple,1 = monitor或isProductTypeApple boolean(如果只有2种产品类型),并将其包含在ProductID表PK中。

您还需要在Apple表和Monitor表PK中包含ProductTypeID字段。

答案 3 :(得分:0)

我喜欢这些的名称 - 值表...重新设计可能更容易,因此它是“产品”,然后是“产品详细信息”......产品详细信息包含产品ID,详细信息类型和价值。这将允许您将苹果和监视器保存在同一个表中,而不管识别属性如何(并保持打开以便稍后添加其他产品)。

可以在发票表中采用类似的方法...有一个'product_type'列,告诉你要查看哪个表(苹果或监视器),然后是'product_id',它引用了apple /中的任何ID列监控表。查询这样的设置有点困难,并且可能会强制你使用动态sql ......如果你无法控制上面的重新设计(我在这里发布的其他答案参考),我只会选择这条路线。

第一个解决方案是优惠的我会认为......将此数据库上的设计更改为产品的名称值对,您将在以后保存令您头疼的问题。

相关问题