1

2つの列を含む製品テーブルがあります

ProductID   Desc
  1         Fan
  2         Table
  3         Bulb

サプライヤー情報を含む別のテーブルがあります

SupplierID    Desc
   1          ABC
   2          XYZ
   3          HJK

1 つのサプライヤーが複数の製品を供給できるようになり、1 つの製品が複数のサプライヤーから供給されるようになりました。これを実現するために、別のテーブル 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)

このテーブルと仕入先テーブルとの関係は? 多対多の関係と冗長データを解決するためにこのテーブルを追加したため、ここで少し混乱していますが、このテーブルは両方のテーブルと多対多の関係を持っているようです??

4

2 に答える 2

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(私が持っているパワーポイントからのランダムなもの):

ここに画像の説明を入力

于 2013-04-25T08:53:52.250 に答える