ホームページ >データベース >mysql チュートリアル >PostgreSQL で多対多の関係を実装するにはどうすればよいですか?

PostgreSQL で多対多の関係を実装するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-22 14:57:13727ブラウズ

How Do I Implement Many-to-Many Relationships in PostgreSQL?

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 テーブルはジャンクション テーブルとして機能し、invoiceproduct をリンクします。 invoice_idproduct_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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。