考虑这个数据库有4个表(星号主键):添加唯一约束的关系,2度远
Products(*ProductId*, SkuText, ...)
ProductRevisions(ProductId, *RevisionId*, ...)
Orders(*OrderId*, ...)
OrderItems(*OrderId*, *ProductRevisionId*, Quantity, ...)
的想法是,一个产品SKU可以有多个版本(例如2016年的版本的产品与2015版相比)。业务规则是这样的,即Product
的Order
只能有一个单独的ProductRevision
,例如,订单不能请求同一产品的2014和2016版本,他们只能拥有2014年版或 2016版。
按说这不会是一个问题:OrderItems
表将有一个ProductId
柱,用UNIQUE
约束上OrderId
和ProductId
。但是,由于OrderItems
的引用ProductRevisionId
(所以参考ProductId
是间接的),这是一个简单的UNIQUE
约束失败和架构将接受以下数据,即使它是为每业务规则无效:
Products
ProductId, SkuText
1, 'Kingston USB Stick'
ProductRevisions
ProductId, RevisionId, ...
1, 1, '2014 model'
1, 2, '2016 model'
Orders
OrderId
1
OrderItems
OrderId, ProductRevisionId, Quantity
1, 1, 100
1, 2, 50 -- Invalid data! Two revisions of the same Product should not be in the same order.
我需要的是这样的:
ALTER TABLE OrderItems
ADD CONSTRAINT UNIQUE (OrderId, SELECT ProductId FROM ProductRevisions WHERE RevisionId = OrderItems.ProductRevisionId)
我不想通过增加一个明确的ProductId
列进行非规范化我OrderItems
表,因为这增加了潜在的故障点,如果给定的父/子关系ProductId
和ProductRevisionId
被改变,那么数据变得无效。
我有什么选择?
”这种方法的缺点是产品只能出现在每个订单中只有一行。“ - 这不是一个缺点,这正是我所追求的:) – Dai