【问题标题】:SQL Table Schema For Sub Product Types子产品类型的 SQL 表架构
【发布时间】:2015-03-16 10:49:56
【问题描述】:

我有一个带有供应商 ==> 产品关系的传统 SQL 模式。

但是,我也有几个“超级”产品类型,它们可以保证自己的数据/表格。我想出了以下架构 - 请记住,我使用的是实体框架,所以导航对我来说也很重要。

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

NicheSupplier 是必需的,因为有一些附加信息,只有基于具有 1 个或多个利基产品的利基供应商才有。

如有必要,我也可以直接添加与供应商的关系(适合 EF 导航)。

我已经确定,为了确保完整性,利基表也需要几个触发器。

我不是 SQL 专家 - 事实上,远非如此,所以我很感激 cmets 和关于这种场景是否有更好的模式的建议,或者有什么天生不好的东西。

【问题讨论】:

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


    【解决方案1】:

    您的架构很接近,但不完全在那里,您确实需要从 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)
    );
    

    【讨论】:

    • 感谢 Gareth 的建议 - 我花了一段时间才明白你的答案,所以我从来没有想过 - 干杯!
    猜你喜欢
    • 2019-12-19
    • 2015-11-07
    • 2020-01-28
    • 1970-01-01
    • 2021-02-20
    • 2012-05-08
    • 2021-04-02
    • 1970-01-01
    • 2021-05-17
    相关资源
    最近更新 更多