ホームページ >データベース >mysql チュートリアル >PostgreSQL で多対多の関係を実装するにはどうすればよいですか?
PostgreSQL は、他のリレーショナル データベース システムと同様に、データベース テーブル間の複雑な関係を可能にします。 一般的なシナリオは多対多の関係で、1 つのテーブル内の複数のレコードを別のテーブルの複数のレコードに関連付けることができます。
PostgreSQL で多対多のリレーションシップを実装するには、通常、3 番目の中間テーブルが必要です。この「ジャンクション テーブル」または「ブリッジ テーブル」は、2 つの元のテーブルを接続します。 これには、両方のテーブルの主キーを参照する外部キーが含まれており、複合主キー (または一意性制約) を形成します。
例で説明してみましょう:
<code class="language-sql">CREATE TABLE product ( product_id SERIAL PRIMARY KEY, product_name TEXT NOT NULL, price NUMERIC NOT NULL DEFAULT 0 ); CREATE TABLE invoice ( invoice_id SERIAL PRIMARY KEY, invoice_number TEXT NOT NULL, invoice_date DATE NOT NULL DEFAULT CURRENT_DATE ); CREATE TABLE invoice_product ( invoice_id INTEGER REFERENCES invoice (invoice_id) ON UPDATE CASCADE ON DELETE CASCADE, product_id INTEGER REFERENCES product (product_id) ON UPDATE CASCADE, quantity NUMERIC NOT NULL DEFAULT 1, CONSTRAINT invoice_product_pkey PRIMARY KEY (invoice_id, product_id) );</code>
invoice_product
テーブルはジャンクション テーブルとして機能し、invoice
と product
をリンクします。 invoice_id
と product_id
は外部キーであり、参照整合性が保証されます。 ON UPDATE CASCADE
句と ON DELETE CASCADE
句は、メイン テーブルでレコードが変更または削除されるときにデータの一貫性を維持します。
invoice
または product
テーブルで行を挿入または削除すると、外部キーに対するカスケード アクションにより、invoice_product
テーブル内の関連エントリが自動的に更新または削除され、データ管理が簡素化されます。
この多対多の関係全体でデータをクエリするには、JOIN
操作を使用します。 たとえば、特定の請求書に関連付けられたすべての製品を検索するには:
<code class="language-sql">SELECT p.product_name, ip.quantity FROM invoice i JOIN invoice_product ip ON i.invoice_id = ip.invoice_id JOIN product p ON ip.product_id = p.product_id WHERE i.invoice_id = 123;</code>
要約すると、PostgreSQL で多対多の関係を効果的に管理するには、適切な外部キー制約を持つジャンクション テーブルを作成する必要があります。このアプローチにより、明確なデータ モデリングと効率的なデータ取得が容易になります。
以上がPostgreSQL で多対多の関係を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。