2009-08-21 11 views
1

私はのようなものを意味する:Postgres:ネストされた外部キーは許可されていますか?

FK1 -> 1FK2 -> 2PK 

してくださいは、1FK2がFK1にPKですが、1FK2が2PKにFKであることに注意してください。したがって、入れ子構造のキーはFKとPKです。

例:

--- Like an interface 
CREATE TABLE q_content (
user_id SERIAL PRIMARY KEY, ---); 

---- tables that refer to it 
CREATE TABLE questions (
user_id SERIAL 
    references q_content(user_id) ---); 

CREATE TABLE removed_questions (
user_id SERIAL 
    references questions(user_id) ---); 

答えて

3

はい、列は、その表の主キーでも、親表への外部キーでもかまいません。

ただし、この場合、questions.user_idremoved_questions.user_idのデータ型としてSERIALを使用する必要はありません。 SERIALデータ型は新しいシーケンスオブジェクトを暗黙的に作成します。これらの主キーは、参照するテーブルにすでに存在する値だけを含む必要があるため、そのシーケンスオブジェクトは不要です。

これはあなたの質問に接するものですが、私はremoved_questionsテーブルをまったく定義しません。これは、questionsテーブルの属性列である必要があります。

+0

+1の接線ポイント –

1

はい。

自然なキーやほとんど自然なキーを使用しようとすると、サブオブジェクトのテーブルに親の主キーが含まれることがよくあります。あなたの例を拡張するには、次のものがあります:

CREATE TABLE questions 
(
    user_id INTEGER REFERENCES q_content(user_id), 
    topic TEXT, 

    PRIMARY KEY (used_id, topic) 
); 

-- CREATE TABLE removed_questions (that has the same primary key as questions, which is also a foreign key to questions's primary). 

あなたは、一般的にの値に対応するようになっていたときのことを空気からそれを生成したくないので、私は、ここではINTEGERにuser_idを変更しましたテーブルq_content

+0

整数の+1の整数 –

0

はい、これは完全に合法であり、実際はむしろ一般的なことです。

関連する問題