回答

收藏

sql多对多关系标准化

技术问答 技术问答 204 人阅读 | 0 人回复 | 2023-09-13

我有一个包含两列的产品表
7 ]; _. H) b4 B  l9 w0 x: kProductID   Desc          Fan   2                                                                                                                                                                                                                                                                                                                                                                                                                         Table    3                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     Bulb我还有另一个包含供应商信息的表格- i/ ?6 N' S" ?4 b/ G
SupplierID    Desc                                 ABC   2                                                                                                                                                                                                                                                                                                                                     XYZ    3                                                                                                                                                                                                                                                                                                                                    HJK现在,供应商可以提供多种产品,而一种产品可以
; S/ h6 Q8 {( p( l由多个供应商提供。为此,我创建了另一张表格tbl_Supplier_Product) y7 Y0 y6 a; k
    SupplierID    ProductID                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        通过& \4 F% z; c2 t' c2 U
主复合键链接到供应商和产品表的好方法吗?在这个表中,主键将是复合键$ M: d' t9 z; ^2 q
(SupplierID和ProductID),或者我应该是每一个
! b0 K% W: h8 z2 \8 j2 D  c+ A添加额外列行记录ID ,然后用其用作主键向
4 K* ]: R  |: K: ~$ x2 aSupplierID和ProductID列添加唯一的约束
9 ]/ F3 }) d8 ^8 P) v% F  Y6 k    SupplierID    ProductID    Row ID                                                     2                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  UNIQUE CONSTRAINT(SupplierID,ProductID)这个表和供应商表有什么关系?
. w; Y6 v# d) f9 a, Q, c; N这里有点困惑,因为我添加了这个表来解决多对多关系
9 r6 f/ {  w5 l# c* g- L还有冗余数据,但看起来表还是+ M# L; Z7 T0 [% d, D
和两个表有多对多关系?9 ^" z& o1 T( ?( A) N8 d" a
                                                                3 y9 I$ Y5 `+ Y( c
    解决方案:                                                                7 J. h( e) J# U7 O2 H' ], Q
                                                                你不需要额外的列:你只需要一个组合键/ Y3 O# u; T1 d1 X3 T3 C9 |
我也会创造一个和PK唯一相反的索引:这
3 B. s+ s! g+ d3 y/ S5 i' [对很多查询都很有用,也很有用ProductID提供了FK索引9 t- u8 C5 e7 z  {
评论后:$ s0 y: M8 b+ v5 O! M. H0 C
CREATE TABLE SupplierProduct  SupplierID int NOT NULL,   ProductID int NOT NULL,   PRIMARY KEY (SupplierID,ProductID));GOCREATE UNIQUE NONCLUSTERED INDEX IXU_ReversePK ON SupplierProduct (ProductID,SupplierID);GO并且通常使用它来确保你拥有的一切FK都有索引, w6 [+ O3 }+ l
SELECT  fk.name AS [Missing FK Index]FROM    sys.foreign_keys fkWHERE   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
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则