我有三个表,Customer, Product, Sale。我需要知道哪些产品在哪些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的customerSaleId
和productSaleId
。在场景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)
不是更好吗?