1

次の一連のテーブルがありました。

CREATE TABLE sellers (
    id       integer PRIMARY KEY,
    ....
);

CREATE TABLE buyers (
    id       integer PRIMARY KEY,
    ....
);

CREATE TABLE invoices (
    id        integer PRIMARY KEY,
    number    varchar(40),
    buyer_id  integer REFERENCES buyers(id),
    seller_id integer REFERENCES sellers(id),
    UNIQUE(seller_id, number),
    ....
);

UNIQUE 制約は、1 人の売り手が指定された番号の請求書を 1 つしか持てないという制約を強制します。

buyers主にとの間の多対多の関係として、新しいテーブルを作成したかったのsellersです。

CREATE TABLE suppliers (
    id        integer PRIMARY KEY,
    buyer_id  integer REFERENCES buyers(id),
    seller_id integer REFERENCES sellers(id),
    ....
);

正規化の取り組みとして、次のようinvoicesに参照するように変更したいとsuppliers思います。

CREATE TABLE invoices (
    id        integer PRIMARY KEY,
    number    varchar(40),
    supplier_id  integer REFERENCES suppliers(id),
    ....
);

私の質問は次のとおりです: UNIQUE 制約をどのように置き換えることができますか?

4

1 に答える 1

4

には複合主キーを使用しますsuppliers:

CREATE TABLE suppliers (
    buyer_id  integer REFERENCES buyers(id),
    seller_id integer REFERENCES sellers(id),
    ...
    PRIMARY KEY (buyer_id, seller_id),
    ...
);

invoices2 つの外部キーを 1 つに変更するだけで、テーブルをそのまま維持します。

CREATE TABLE invoices (
    id        integer PRIMARY KEY,
    number    varchar(40),
    buyer_id  integer,
    seller_id integer,
    UNIQUE (seller_id, number),
    FOREIGN KEY (buyer_id, seller_id)
      REFERENCES suppliers (buyer_id, seller_id),
    ....
);

suppliersこの設計は、関係に関連するテーブルにさらに列を追加する予定がある場合に役立つと思いますseller - buyerinvoicesそれ以外の場合は、テーブルからデータを収集するビューを作成できます。

CREATE VIEW suppliers AS
SELECT DISTINCT buyer_id, seller_id
FROM invoices ;
于 2013-06-06T18:53:00.890 に答える