我有一个传统的带有供应商==>产品关系的SQL模式。
然而,我也有几个“超级”产品类型,需要它们自己的数据/表。我想出了以下模式--记住我使用的是实体框架,所以导航对我也很重要。
唯一的复制是在小众产品表上,其中添加了SupplierID以维护与NicheSupplier的关系。
NicheSupplier是必需的,因为有一些额外的信息,只有利基供应商基于有一个或更多的利基产品。
如果需要的话,我可以直接和供应商建立关系(对EF导航有好处)。
我已经确定,为了确保完整性,小众表也需要几个触发器。
我不是SQL专家--事实上,还远不是这样,所以我希望能就这类场景是否有更好的模式,或者有什么天生的坏处,提出意见和建议。

发布于 2015-03-16 11:25:40
您的模式是接近的,但并不完全在那里,您确实需要从dbo.NicheProduct.SupplierID到dbo.NicheSupplier.SupplierID的链接,但也需要添加从dbo.Product到dbo.NicheProduct的链接,以确保NicheSupplier中的供应商和产品id的组合是一个有效的组合。要做到这一点,您需要向dbo.Prodcut on (ProductID,SupplierID)添加一个唯一的约束,这允许NicheProduct上的外键确保组合是有效的。这意味着不需要触发器来保持完整性。因此,您的SQL应该类似于:
CREATE TABLE dbo.Supplier
(
ID INT IDENTITY,
CONSTRAINT PK_Supplier__ID PRIMARY KEY (ID)
);
CREATE TABLE dbo.NicheSupplier
(
SupplierID INT NOT NULL,
CONSTRAINT PK_NicheSupplier__SupplierID PRIMARY KEY (SupplierID),
CONSTRAINT FK_NicheSupplier__SupplierID FOREIGN KEY (SupplierID)
REFERENCES dbo.Supplier (ID)
);
CREATE TABLE dbo.Product
(
ID INT IDENTITY,
SupplierID INT NOT NULL,
CONSTRAINT PK_Product__ID PRIMARY KEY (ID),
CONSTRAINT FK_Product__SupplierID FOREIGN KEY (SupplierID)
REFERENCES dbo.Supplier (ID),
CONSTRAINT UQ_Product__ID_SupplierID UNIQUE (ID, SupplierID)
);
CREATE TABLE dbo.NicheProduct
(
ProductID INT NOT NULL,
SupplierID INT NOT NULL,
CONSTRAINT PK_NicheProduct__ProductID PRIMARY KEY (ProductID),
CONSTRAINT FK_NicheProduct__ProductID_SupplierID FOREIGN KEY (ProductID, SupplierID)
REFERENCES dbo.Product (ID, SupplierID),
CONSTRAINT FK_NicheProduct__SupplierID FOREIGN KEY (SupplierID)
REFERENCES dbo.NicheSupplier (SupplierID)
);

https://stackoverflow.com/questions/29074984
复制相似问题