Я работал над проектом, который потребовал отчета PDF. После поиска онлайн я нашел библиотеку PoDoFo. Казался очень устойчивым. Мне не были нужны все функции, таким образом, я создал обертку к краткому обзору далеко часть сложности. Не было слишком трудным. Можно найти библиотеку здесь:
http://podofo.sourceforge.net/
Обладает!
Некоторые люди используют для этого дизайн под названием «Полиморфные ассоциации», позволяющий 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)
.
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
...
)
Я думаю, вы могли бы смоделировать такую ссылку, используя наследование таблиц в PostgreSQL .
Если вам действительно нужно знать, откуда берется строка в запросе, вы можете использовать простой статус UNION ALL, например (эта возможность не имеет ничего общего с наследованием таблицы):
SELECT car.*, 'car' table_name
UNION ALL
SELECT motor.*, 'motor' table_name