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


83

アプリ用のDBを作成しようとしていますが、最善の方法を見つけたいのはUsersItemsテーブルとテーブルの間に1対多の関係を作成することです。

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

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


3
この機能をPostgresに追加するパッチがあります。blog.2ndquadrant.com/…(2012)およびpostgresql.org/message-id/…(2017)を参照してください。まだ受け入れられていませんが、いつか受け入れられることを願っています。
Simon Kissane 2017

回答:


68

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

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

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


3
あなたはできることを確認します制約トリガを定義します。しかし、それがすべての場合に確実に機能するかどうかはわかりません。
a_horse_with_no_name 2016

@a_horse_with_no_name:例を挙げていただけますreliably in all casesか?トリガーが失敗することがあるということですか?ありがとう。
Luan Huynh 2016

1
@LuanHuynh :(技術的な)詳細を思い出せませんが、これがメーリングリストで最後に議論されたときに、対応する制約トリガーがすべてのケースをキャッチしない可能性があると誰かが言及しました-しかし、それはもはや真実ではないかもしれません
a_horse_with_no_name

おかげで、私は彼らのために関係テーブルを作るだけだと思います
ザック2016

1
@a_horse_with_no_nameそのような制約の例を含む回答を投稿できますか?
OrangeDog

65

すぐにこれを行うことが可能になるかもしれません: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の内部を知っているこれを読んでいる人は、可能であれば助けてください。


8
非常にCREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int )
ビクター

1
パッチは作者がフォローアップするのを待っています。この機能が利用可能になるまで、トリガーを使用して整合性をチェックする必要がありますが、これは遅い場合があります。
yoonghm

34
恥、:(含まれているように思われません
Teocali

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.