SQL Table 子产品类型的架构
SQL Table Schema For Sub Product Types
我有与供应商 ==> 产品关系的传统 SQL 架构。
但是,我也有一些 'super' 产品类型可以保证它们自己的 data/tables。我想出了以下架构 - 请记住,我使用的是 Entity Framework,因此导航对我来说也很重要。
唯一的重复出现在利基产品 table 上,其中添加了 SupplierID 以保持与 NicheSupplier 的关系。
需要 NicheSupplier,因为有一些额外的信息,只有利基供应商拥有 1 个或多个利基产品。
如有必要,我也可以直接添加与 Supplier 的关系(对 EF nav 有好处)。
我已经确定,为了确保完整性,利基 table 也需要一些触发器。
我不是 SQL 专家 - 事实上,远非如此,所以对于是否有针对此类场景的更好模式,或者是否存在任何固有的错误,我将不胜感激。
您的架构很接近,但还不够完善,您确实需要从 dbo.NicheProduct.SupplierID
到 dbo.NicheSupplier.SupplierID
的 link,但您还需要添加 link 来自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)
);
我有与供应商 ==> 产品关系的传统 SQL 架构。
但是,我也有一些 'super' 产品类型可以保证它们自己的 data/tables。我想出了以下架构 - 请记住,我使用的是 Entity Framework,因此导航对我来说也很重要。
唯一的重复出现在利基产品 table 上,其中添加了 SupplierID 以保持与 NicheSupplier 的关系。
需要 NicheSupplier,因为有一些额外的信息,只有利基供应商拥有 1 个或多个利基产品。
如有必要,我也可以直接添加与 Supplier 的关系(对 EF nav 有好处)。
我已经确定,为了确保完整性,利基 table 也需要一些触发器。
我不是 SQL 专家 - 事实上,远非如此,所以对于是否有针对此类场景的更好模式,或者是否存在任何固有的错误,我将不胜感激。
您的架构很接近,但还不够完善,您确实需要从 dbo.NicheProduct.SupplierID
到 dbo.NicheSupplier.SupplierID
的 link,但您还需要添加 link 来自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)
);