我有一个包含两列
的产品表ProductID Desc
1 Fan
2 Table
3 Bulb
我有另一个包含供应商信息的表
SupplierID Desc
1 ABC
2 XYZ
3 HJK
现在一个供应商可以提供多种产品,一个产品可以由多个供应商提供为实现这一点,我创建了另一个表tbl_Supplier_Product
SupplierID ProductID
1 1
1 2
2 1
2 2
2 3
通过主要组合密钥将此表链接到供应商和产品表是一种好方法吗?在此表中,主键是复合键(SupplierID和ProductID),或者我应该为每个记录添加额外的列行ID,然后将其用作主键并为列SupplierID和ProductID添加唯一约束
SupplierID ProductID Row ID
1 1 1
1 2 2
2 1 3
2 2 4
2 3 5
UNIQUE CONSTRAINT(SupplierID, ProductID)
此表与供应商表的关系是什么?我在这里有点困惑,因为我添加了这个表来解决多对多关系和冗余数据,但看起来这个表似乎与这两个表有多对多关系?
答案 0 :(得分:4)
您不需要额外的列:只需要一个复合键
我会创建一个与PK相反的唯一索引:这对许多查询很有用,并且还为ProductID提供FK索引
评论后:
CREATE TABLE SupplierProduct (
SupplierID int NOT NULL,
ProductID int NOT NULL,
PRIMARY KEY (SupplierID, ProductID)
);
GO
CREATE UNIQUE NONCLUSTERED INDEX IXU_ReversePK ON SupplierProduct (ProductID, SupplierID);
GO
了解更多
并且通常也使用它来确保所有FK都有索引
SELECT fk.name AS [Missing FK Index]
FROM sys.foreign_keys fk
WHERE EXISTS
(
SELECT *
FROM sys.foreign_key_columns fkc
WHERE fkc.constraint_object_id = fk.object_id
AND NOT EXISTS
(
SELECT *
FROM sys.index_columns ic
WHERE ic.object_id = fkc.parent_object_id
AND ic.column_id = fkc.parent_column_id
AND ic.index_column_id = fkc.constraint_column_id
)
);
GO
在ERD中(我从PowerPoint中随机出现):