Как эмулировать размеченное объединение в базе данных?

Я работал над проектом, который потребовал отчета PDF. После поиска онлайн я нашел библиотеку PoDoFo. Казался очень устойчивым. Мне не были нужны все функции, таким образом, я создал обертку к краткому обзору далеко часть сложности. Не было слишком трудным. Можно найти библиотеку здесь:

http://podofo.sourceforge.net/

Обладает!

11
задан Łukasz Lew 13 November 2009 в 17:15
поделиться

3 ответа

Некоторые люди используют для этого дизайн под названием «Полиморфные ассоциации», позволяющий vehicle_id содержать значение, которое существует либо в car , либо в motor таблицы. Затем добавьте vehicle_type , который называет таблицу, на которую ссылается данная строка в t1 .

Проблема в том, что вы не можете объявить реальное ограничение внешнего ключа SQL, если сделаете это. В SQL нет поддержки внешнего ключа, имеющего несколько ссылочных целей. Есть и другие проблемы, но отсутствие ссылочной целостности уже является преградой.

Лучше всего заимствовать концепцию из объектно-ориентированного проекта общего супертипа обоих автомобилей. и двигатель :

CREATE TABLE Identifiable (
 id SERIAL PRIMARY KEY
);

Затем сделайте ссылку t1 на эту таблицу супертипов:

CREATE TABLE t1 (
  vehicle_id INTEGER NOT NULL,
  FOREIGN KEY (vehicle_id) REFERENCES identifiable(id)
  ...
);

А также сделать так, чтобы подтипы ссылались на их родительский супертип. Обратите внимание, что первичный ключ подтипов - , а не с автоматическим приращением. Родительский супертип заботится о выделении нового значения id, а дочерние элементы ссылаются только на это значение.

CREATE TABLE car (
  id INTEGER NOT NULL,
  FOREIGN KEY (id) REFERENCES identifiable(id)
  ...
);

CREATE TABLE motor (
  id INTEGER NOT NULL,
  FOREIGN KEY (id) REFERENCES identifiable(id)
  ...
);

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


Ответ @Quassnoi также показывает метод для принудительного применения несвязанных подтипов . То есть вы хотите, чтобы оба car и motor не ссылались на одну и ту же строку в их родительской таблице супертипов. Когда я это делаю, я использую первичный ключ из одного столбца для Identifiable.id , но также объявляю ключ UNIQUE над Identifiable. (Id, type) .

9
ответ дан 3 December 2019 в 07:13
поделиться
CREATE TABLE vehicle (type INT NOT NULL, id INT NOT NULL,
             PRIMARY KEY (type, id)
)

CREATE TABLE car (type INT NOT NULL DEFAULT 1, id INT NOT NULL PRIMARY KEY,
             CHECK(type = 1),
             FOREIGN KEY (type, id) REFERENCES vehicle
)

CREATE TABLE motorcycle (type INT NOT NULL DEFAULT 2, id INT NOT NULL PRIMARY KEY,
             CHECK(type = 2),
             FOREIGN KEY (type, id) REFERENCES vehicle
)

CREATE TABLE t1 (
  ...
  vehicle_type INT NOT NULL,
  vehicle_id INT NOT NULL,
  FOREIGN KEY (vehicle_type, vehicle_id) REFERENCES vehicle
  ...
)
5
ответ дан 3 December 2019 в 07:13
поделиться

Я думаю, вы могли бы смоделировать такую ​​ссылку, используя наследование таблиц в PostgreSQL .

Если вам действительно нужно знать, откуда берется строка в запросе, вы можете использовать простой статус UNION ALL, например (эта возможность не имеет ничего общего с наследованием таблицы):

SELECT car.*, 'car' table_name
UNION ALL
SELECT motor.*, 'motor' table_name
3
ответ дан 3 December 2019 в 07:13
поделиться
Другие вопросы по тегам:

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