如果我理解正确,未完成的订单尚未分配面包师/定价(意味着下订单时,尚未选择面包师来烘烤产品)。
在这种情况下,订单可能针对 Products 表下达,然后针对 BakersProducts 表“最终确定”。
一种解决方案可能是给 ProductsOrders 2 个单独的“ProductID”,一个用于原始订购的 ProductId(即非 Nullable)——比如 ProductId,第二个是分配给 BakersProducts 的外键的一部分(比如 ProductId2)。这意味着在 ProductsOrders 中,复合外键 BakerId、ProductId2 和 PricingDate 都可以为空,因为它们只有在订单完成后才会设置。
为了消除这种冗余,您还可以考虑使用代理键而不是复合键。这样,BakersProducts 将有一个代理 PK(例如 BakersProductId),然后在 ProductsOrders 中将其引用为可为空的 FK。这也可以避免将 ProductsOrders 中的 Direct FK 与 Product.ProductId 混淆(从上面看,它是作为订单一部分的原始产品线)。
HTH?
编辑:
CREATE TABLE dbo.BakersProducts
(
BakerProductId int identity(1,1) not null, -- New Surrogate PK here
BakerId int not null,
ProductId int not null,
PricingDate datetime not null,
Price money not null,
StockLevel bigint not null,
CONSTRAINT PK_BakerProducts PRIMARY KEY(BakerProductId),
CONSTRAINT FK_BakerProductsProducts FOREIGN KEY(ProductId) REFERENCES dbo.Products(ProductId),
CONSTRAINT FK_BakerProductsBaker FOREIGN KEY(BakerId) REFERENCES dbo.Bakers(BakerId),
CONSTRAINT U_BakerProductsPrice UNIQUE(BakerId, ProductId, PricingDate) -- Unique Constraint mimicks the original PK for uniqueness ... could also use a unique index
)
CREATE TABLE dbo.ProductOrders
(
OrderId INT NOT NULL,
ProductId INT NOT NULL, -- This is the original Ordered Product set when order is created
BakerProductId INT NULL, -- This is nullable and gets set when Order is finalised with a baker
OrderQuantity BIGINT NOT NULL,
CONSTRAINT FK_ProductsOrdersBakersProducts FOREIGN KEY(BakersProductId) REFERENCES dbo.BakersProducts(BakerProductId)
.. Other Keys here
)