postgresql: внешний ключ или к tableA или к tableB

Я пытаюсь выяснить, как определить схему базы данных по с Postgresql 8.

У меня есть 2 таблицы:

Journals, Books

это определяет публикации, которые я имею

Journal:
id_j, name, issn, other fields

Book:
id_b, name, isbn, author, other fields

и у меня есть другая таблица Scans это логически направляет обоих предыдущие таблицы.

Scans:
id, medium, source, status

каждый Journal или Book может иметь больше чем один Scan, но каждый Scan может отослать только один Journal или Book.

Для формализации этого моя первая идея состояла в том, чтобы вставить два внешних ключа Scans как

Scans:
id, medium, source, status, id_j, id_b

и заполните также id_j или id_b

но это решение кажется мне немного странным.

Я не хочу (если это возможно) для определения таблицы способом как это:

Scans:
id, medium, source, status, id_other_table, other_table_name

потому что я хотел бы иметь формальное соединение между таблицами.

Какая-либо идея?

5
задан Giovanni Di Milia 24 March 2010 в 17:28
поделиться

1 ответ

CREATE TABLE source (
       type CHAR(1) NOT NULL CHECK (type IN ('J', 'B')),
       id INT NOT NULL,
       PRIMARY KEY (type, id)
);

CREATE TABLE book (
       type CHAR(1) NOT NULL CHECK(type = 'B'), id INT NOT NULL,
       PRIMARY KEY (id),
       FOREIGN KEY (type, id) REFERENCES source (type, id) ON DELETE CASCADE
);

CREATE TABLE journal (
       type CHAR(1) NOT NULL CHECK(type = 'J'), id INT NOT NULL,
       PRIMARY KEY (id),
       FOREIGN KEY (type, id) REFERENCES source (type, id) ON DELETE CASCADE
);

CREATE TABLE scan (id INT NOT NULL, sourcetype CHAR(1) NOT NULL, sourceid INT NOT NULL,
       PRIMARY KEY (id),
       FOREIGN KEY (sourcetype, sourceid) REFERENCES source (type, id)
);

При таком дизайне вы не должны удалять записи непосредственно из книги или журнала : вместо этого удалите из таблицы источник , что приведет к каскадному преобразованию операции в соответствующий стол.

Вы можете переместить атрибуты, общие для книги и журнала , в источник .

6
ответ дан 14 December 2019 в 13:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: