SQL;如何在复杂情况下确保数据完整性

时间:2014-08-03 06:59:26

标签: sql many-to-many relational-database data-integrity

我有三个名为客户产品销售的表格。我需要知道哪些产品已经介绍了哪些销售以及哪些客户已经参加了哪些销售。所以这就是我们到目前为止所做的:

Customer (Id, Name)

Product (Id, Name)

Sale(Id, Title, Date)

CustomerSale(Id, CustomerId, SaleId) //intermediate table

ProductSale(Id, ProductId, SaleId)   //intermediate table

此外,我需要知道哪个客户喜欢(想象一下他们可以投票产品!)每个销售中的哪些产品,我还需要知道哪个客户在每个销售中标记哪个产品有用。所以我有两个解决方案:

场景1:只需在这两个中间表之间建立一个中间表!

CustomerProduct(Id, customerSaleId, productSaleId, doesLikes, isUseful)

场景2:将FK中间件制作成三个表(客户,产品,销售)!

CustomerProduct(Id, SaleId, CustomerId, ProductId, doesLikes, isUseful)

问题: 以上解决方案都不能确保数据完整性,因为在方案1中,可以插入不引用相同Sale的customerSaleIdproductSaleId。在方案2中,可以插入无效(销售,客户,产品)三元组。因为您无法确定该产品是否在该销售中展示,而且您无法确定该客户是否已参与该销售。

那么还有更好的解决方案吗?

2 个答案:

答案 0 :(得分:0)

如果您忽略CustomerSale和ProductSale上的代理键并且方案2分别引用这些表(CustomerId,SaleId)和(ProductId,SaleId)上的复合唯一键,这会给您提供您想要的内容吗?

答案 1 :(得分:-2)

我将你的结构改为

Customer (Id, Name)

Product (Id, Name)

Sale(Id, CustomerId, Title, Date)

ProductSale(Id, ProductId, SaleId)  

CustomerProduct(Id, productSaleId, doesLikes, isUseful)

不是更好吗?