我有一个传统的SQL架构,其中包含Supplier ==>产品关系。
然而,我还有一些超级'保证自己的数据/表格的产品类型。我已经提出了以下架构 - 请记住我使用的是实体框架,因此导航对我来说也很重要。
唯一的重复是在利基产品表上,其中添加了SupplierID以维持与NicheSupplier的关系。
NicheSupplier是必需的,因为有一些额外的信息,只有小众供应商基于拥有一个或多个利基产品。
如有必要,我也可以直接与供应商建立关系(适用于EF导航)。
我已经确定,在利基表中还需要几个触发器来确保完整性。
我没有SQL专家 - 事实上,远非如此,所以我希望得到关于此类情景是否有更好的模式的评论和建议,或者有任何遗传上的错误。
答案 0 :(得分:0)
您的架构很接近,但不完全存在,您需要从dbo.NicheProduct.SupplierID
到dbo.NicheSupplier.SupplierID
的链接,但您还需要将dbo.Product中的链接添加到dbo.NicheProduct,以确保NicheSupplier中供应商和产品ID的组合是有效组合。为此,您需要在(ProductID,SupplierID)上为dbo.Prodcut添加唯一约束,这允许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)
);