Postgres: разрешены ли вложенные иностранные ключи? - PullRequest
1 голос
/ 21 августа 2009

Я имею в виду такие вещи, как:

FK1 -> 1FK2 -> 2PK

Обратите внимание, что 1FK2 - это от PK до FK1, а 1FK2 - от FK до 2PK. Таким образом, ключ во вложенной структуре - это 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 ]

3 голосов
/ 21 августа 2009

Да, столбец может быть первичным ключом своей таблицы, а также внешним ключом родительской таблицы.

Однако в этом случае вам не нужно использовать SERIAL в качестве типа данных для questions.user_id и removed_questions.user_id. Тип данных SERIAL неявно создает новый объект последовательности, и вам это не нужно, поскольку эти первичные ключи должны содержать только те значения, которые уже существуют в таблице, на которую они ссылаются.

Также это касается вашего вопроса, но я бы не стал определять таблицу removed_questions. Это должен быть столбец атрибута в таблице questions.

1 голос
/ 21 августа 2009

Да.

Это довольно часто, когда вы пытаетесь использовать естественные или в основном натуральные ключи - таблицы для подобъектов часто имеют первичные ключи, которые «содержат» первичные ключи своих родителей. Чтобы расширить ваш пример, вы можете иметь:

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

Я изменил user_id на INTEGER, потому что вы обычно не хотите генерировать его из ничего, когда он должен соответствовать значению в таблице q_content.

0 голосов
/ 21 августа 2009

Да, это совершенно законно, и на самом деле может быть довольно распространенным явлением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...