2010-10-07 94 views
3

如果我有一个销售苹果和显示器的在线购物网站,并且这些网站存储在不同的表格中,因为苹果的显着属性是彩色的,而显示器的显示属性是分辨率,我将如何将这两个添加到发票表中,同时仍保留参照完整性并且不将这些表联合起来?一个订单上的多个不同产品的表设计

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

回答

3

首先,我将它们存储在一个产品表中,而不是放在两个不同的表中。第二,(除非每个发票只用于一个产品),我不会将它们添加到单个发票表中 - 相反,我会设置一个Invoice_Products表,以便在这些表之间进行链接。我建议你看看Database Normalisation

+0

如果我将它们存储在单个组合产品表中,那么这是否意味着只有根据特定产品是显示器还是Apple而只能填充可分辨的Resolution和Color列?规范化建议只在表中包含列,如果它们直接与主键相关。 关于链接表,好点。我过分简化了这个问题,错过了这个细节。我会更新这个问题。 – Rob 2010-10-07 15:46:24

+1

发票(InvoiceId) | InvoiceItems(ItemId,ProductId) | 产品(ProductId) | | 苹果(AppleId,ProductId,Color)监视器(MonitorId,ProductId,Resolution) – Rob 2010-10-07 15:47:59

0

因此发票表有一个ProductID FK,而ProductID可以是AppleID(PK颜色)或MonitorID(PK分辨率)?

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

您还需要在苹果表ProductTypeID场和监控台PK。

0

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

可以在发票表中采取类似的方法...有一个'product_type'列,告诉你要查看哪个表(苹果或监视器),然后是一个'product_id',它引用苹果的任何ID列/监视器表。查询上像这样的设置是有点困难的,可以强迫你使用动态SQL ...如果你有过做上面的重新设计没有控制(这里张贴其他答案参考)我只走这条路

第一种解决方案是优惠的,我会认为...将这个数据库的设计更改为与产品的名称值对,以后您可以节省头痛地编写您的查询。

+0

名称 - 值表是否意味着只有String(varchar)值?如果某些属性是数字或日期值,那么需要进行可比性/类型安全呢?显然这里的查询/用户界面很复杂,但我面临的主要困难似乎首先是数据库结构。 我想也许我可以制作4个不同的名称 - 值表,每个表都包含不同的类型(int,float,datetime,varchar),但是这造成了知道如何链接到正确的名称 - 值表的新问题! – Rob 2010-10-07 15:52:47

+0

是的,你对这个限制是正确的...... varchar或nvarchar是你唯一可以处理任何数据类型的数据类型。可能有一个“数据类型”列与值一起使用,尽管它后来迫使你进入更动态的SQL来转换为不同的数据类型。任何你无法将它存储为varchar的原因,并在你的查询中引用它时将其转换为你需要的任何数据类型? – Twelfth 2010-10-07 16:33:11

1

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

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

产品{} SKU关键 {} SKU;

invoice_item {INVOICE_ID,SKU} 键{INVOICE_ID,SKU};

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

monitor {size,sku} key {size} key {sku};

适当的约束......特别是,苹果的{} SKU工会和监视{} SKU产品== {} SKU。

相关问题