2009-08-21 17 views
1

Ich meine Dinge wie:Postgres: Sind verschachtelte Fremdschlüssel erlaubt?

FK1 -> 1FK2 -> 2PK 

Bitte beachten Sie, dass 1FK2 ein PK FK1 ist, aber die 1FK2 ist ein FK zu 2PK. Der Schlüssel in der verschachtelten Struktur ist also ein FK und ein PK.

Ein Beispiel:

--- 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) ---); 

Antwort

3

Ja, eine Spalte kann sowohl ein Primärschlüssel ihrer Tabelle als auch ein Fremdschlüssel für eine Elterntabelle sein. In diesem Fall müssen Sie SERIAL nicht als Datentyp für questions.user_id und removed_questions.user_id verwenden. Der Datentyp SERIAL erstellt implizit ein neues Sequenzobjekt, das Sie nicht benötigen, da diese Primärschlüssel nur Werte enthalten müssen, die bereits in der Tabelle vorhanden sind, auf die sie verweisen.

Auch das ist tangential zu Ihrer Frage, aber ich würde keinen removed_questions Tisch überhaupt definieren. Dies sollte eine Attributspalte in der Tabelle questions sein.

+0

+1 für den Tangentialpunkt –

1

Ja.

Es ist ziemlich üblich, wenn Sie versuchen, natürliche oder meist natürliche Schlüssel zu verwenden - Tabellen für Unterobjekte haben oft Primärschlüssel, die die Primärschlüssel ihrer Eltern "enthalten". So erweitern Sie Ihr Beispiel könnten Sie haben:

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). 

ich die user_id an INTEGER hier geändert haben, weil Sie in der Regel nicht generieren wollen es aus, was Luft, wenn es angenommen hat, auf den Wert entsprechen, in die q_content Tabelle.

+0

+1 ganze Zahl für die ganze Zahl –

0

Ja, das ist vollkommen legal, und in der Tat könnte ziemlich häufig sein.

Verwandte Themen