子产品类型的SQL表模式

时间:2015-03-16 10:49:57

标签: sql sql-server entity-framework database-schema

我有一个传统的SQL架构,其中包含Supplier ==>产品关系。

然而,我还有一些超级'保证自己的数据/表格的产品类型。我已经提出了以下架构 - 请记住我使用的是实体框架,因此导航对我来说也很重要。

唯一的重复是在利基产品表上,其中添加了SupplierID以维持与NicheSupplier的关系。

NicheSupplier是必需的,因为有一些额外的信息,只有小众供应商基于拥有一个或多个利基产品。

如有必要,我也可以直接与供应商建立关系(适用于EF导航)。

我已经确定,在利基表中还需要几个触发器来确保完整性。

我没有SQL专家 - 事实上,远非如此,所以我希望得到关于此类情景是否有更好的模式的评论和建议,或者有任何遗传上的错误。

SQL Schema for sub product data

1 个答案:

答案 0 :(得分:0)

您的架构很接近,但不完全存在,您需要从dbo.NicheProduct.SupplierIDdbo.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)
);

enter image description here