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



我有三个表,CustomerProductSale。我需要知道哪些产品在哪些Sales中展示过,哪些Sales接待过哪些客户。下面是我们目前的内容:

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到三个表(Customer, Product, Sale)的中间表!

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

问题:上述解决方案都不能确保数据完整性,因为在场景1中,可能会插入不引用相同Sale的customerSaleIdproductSaleId。在场景2中,有可能插入无效的(Sale、Customer、Product)三元组。因为你不能确定产品是否在销售中出现,而且你不能确定客户是否参加了销售。

那么有没有更好的解决方案呢?

如果忽略CustomerSale和ProductSale上的代理键,并让场景2分别引用(CustomerId, SaleId)和(ProductId, SaleId)这两个表上的复合唯一键,这会得到您想要的吗?

我把你的结构改成这个

Customer (Id, Name)
Product (Id, Name)
Sale(Id, CustomerId, Title, Date)
ProductSale(Id, ProductId, SaleId)  
CustomerProduct(Id, productSaleId, doesLikes, isUseful)

不是更好吗?

最新更新