Страницы

Поиск по вопросам

среда, 18 декабря 2019 г.

Как совместить иерархию и наследование таблиц в PostgreSQL?

#наследование #архитектура #база_данных #postgresql


PostgreSQL реализует наследование таблиц. К примеру, можно создать таблицу places
(географические объекты) и несколько таблиц, которые будут наследовать все ее колонки.
Допустим, это будут таблицы для информации о городах (cities), реках (rivers) и озерах
(lakes):
CREATE TABLE places (id, name, latitude, longitude, altitude);
CREATE TABLE cities (population) INHERITS (places);
CREATE TABLE rivers (lenght) INHERITS (places);
CREATE TABLE lakes  (maxdepth, volume) INHERITS (places);

Теперь допустим, что мы хотим хранить в базе данных информацию книгах, посвященных
этим объектам. Взаимоотношение между объектом и книгами - один-к-многим. Как это можно
сделать, если у нас данные фактически находятся в таблицах-потомках и при этом уникальность
ключей действует только в пределах одной таблицы?
UPD. Никак. Такая логика работы в PostgreSQL не предполагается.    


Ответы

Ответ 1



Как вариант — не использовать наследование и перейти к традиционному cities (place_id REFERENCES places.id, population) и выборке с JOIN'ами. Менее красиво-удобно, зато быстро и надежно. Как другой вариант — раз PostgreSQL не хочет обеспечивать целостность ключами, то обеспечить целостность триггерами или правилами. Можно использовать наследование, но вставки и обновления будут медленнее.

Ответ 2



Ну триггеры/ключи можно использовать, конечно, для проверки целостности, либо можно партицировать таблицу с книгами, повесив в качестве check, например, непересечение по жанру. Соответственно, внешние ключи можно назначить от партиции к партиции. Здесь на русском можно про наследование таблиц немного почитать еще

Комментариев нет:

Отправить комментарий