Я пытаюсь выяснить, как определить схему базы данных по с 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
потому что я хотел бы иметь формальное соединение между таблицами.
Какая-либо идея?
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)
);
При таком дизайне вы не должны удалять записи непосредственно из книги
или журнала
: вместо этого удалите из таблицы источник
, что приведет к каскадному преобразованию операции в соответствующий стол.
Вы можете переместить атрибуты, общие для книги
и журнала
, в источник
.