Должен ли я добавить столбец типа для разработки наследования в postgreSQL? - PullRequest
1 голос
/ 28 июля 2010

Я планирую создать веб-приложение с использованием Spring / Hibernate.

Как мне спроектировать базу данных postgresql для поддержки наследования?
Предположим, что у меня есть следующие таблицы: super_table, sub_table_1, sub_table_2.
Тогда sub_table_1 и subtable_2 наследуют super_table.

Должен ли я добавить столбец типа (например, char или int), чтобы я знал
если строка в super_table является sub_table_1 или sub_table_2?

Пожалуйста, сообщите. Благодаря.

1 Ответ

3 голосов
/ 28 июля 2010

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

CREATE TABLE Super_Table (
  super_id SERIAL PRIMARY KEY,
  sub_type CHAR(1) NOT NULL,
  UNIQUE KEY (super_id, sub_type) 
);

CREATE TABLE Sub_Table_A (
  super_id PRIMARY KEY,
  sub_type CHAR(1) NOT NULL,
  CHECK (sub_type = 'A'),
  FOREIGN KEY (super_id, sub_type) REFERENCES Super_Table (super_id, sub_type)
);

CREATE TABLE Sub_Table_B (
  super_id PRIMARY KEY,
  sub_type CHAR(1) NOT NULL,
  CHECK (sub_type = 'B'),
  FOREIGN KEY (super_id, sub_type) REFERENCES Super_Table (super_id, sub_type)
);

Теперь в Super_Table нет возможности ссылаться на строку в обеих вложенных таблицах. Строка в Super_Table должна иметь «A» или «B», поэтому только одна из вложенных таблиц может соответствовать ссылке на внешний ключ.


Ваш комментарий:

Насколько я понимаю, текущая реализация INHERITS в PostgreSQL допускает ряд аномалий, связанных с индексами, уникальными условиями и ограничениями внешнего ключа. Использование этой функции сложно и подвержено ошибкам.

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

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

Это известные и неразрешенные ограничения НАСЛЕДОВАНИЯ в PostgreSQL. Дизайн, который я показал выше, решает проблему для первичного ключа, но не для вторичных уникальных ключей.

http://archives.postgresql.org/pgsql-hackers/2010-05/msg00285.php

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