web-dev-qa-db-ja.com

それぞれが外部キーである要素のPostgreSQL配列

アプリ用のDBを作成しようとしていますが、UsersテーブルとItemsテーブルの間に1対多の関係を作成することをお勧めします。

3番目のテーブルReviewedItemsを作成でき、列をUser idとItem idにできることはわかっていますが、列を作成できるかどうかを知りたいUsersでは、reviewedItemsは、ItemsがレビューしたUserへの外部キーを含む整数配列です。

PostgreSQLでこれができる場合は、お知らせください!そうでない場合は、3番目のテーブルルートに進みます。

45
Zach

いいえ、これは不可能です。

PostgreSQLはリレーショナル DBMSであり、適切に正規化されたデータモデルで最も効率的に動作します。配列は-定義上、順序付けられたセットです-リレーショナルデータ構造ではないため、SQL標準は配列要素での外部キーの定義をサポートせず、PostgreSQLもサポートしません。

ただし、他のテーブルの主キーにリンクする配列要素を使用して、完全に優れたデータベースを構築できます。ただし、これらの配列要素は外部キーとして宣言できないため、DBMSは参照整合性を維持しません。

41
Patrick

すぐにこれを行うことが可能になるかもしれません: https://commitfest.postgresql.org/17/1252/ -Mark Rofailはこのパッチで素晴らしい仕事をしてくれました!

パッチは(完了したら)許可します

CREATE TABLE PKTABLEFORARRAY (
    ptest1 float8 PRIMARY KEY,
    ptest2 text
);
CREATE TABLE FKTABLEFORARRAY (
    ftest1 int[],
    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY,
    ftest2 int
);

ただし、著者は現在、パッチをリベースするために(私の能力を超えて)助けが必要なので、これを読んでPostgresの内部を知っている人は、できれば助けてください。

40
Jarym