7

Существует это поле в таблице:«полиморфизм» для FOREIGN KEY ограничений

room_id INT NOT NULL CONSTRAINT room_id_ref_room REFERENCES room 

У меня есть три 2 таблицы для двух видов комнат: standard_room и family_room

Как сделать что-то вроде этого:

room_id INT NOT NULL CONSTRAINT room_id_ref_room REFERENCES standard_room or family_room 

Я имею в виду, room_idдолжен ссылаться либоstandard_roomилиfamily_room.
Можно ли это сделать?

ответ

11

Вот образец, который я использовал.

CREATE TABLE room (
    room_id serial primary key, 
    room_type VARCHAR not null, 

    CHECK CONSTRAINT room_type in ("standard_room","family_room"), 
    UNIQUE (room_id, room_type) 
); 

CREATE_TABLE standard_room (
    room_id integer primary key, 
    room_type VARCHAR not null default "standard_room", 

    FOREIGN KEY (room_id, room_type) REFERENCES room (room_id, room_type), 
    CHECK CONSTRAINT room_type = "standard_room" 
); 
CREATE_TABLE family_room (
    room_id integer primary key, 
    room_type VARCHAR not null default "family_room", 

    FOREIGN KEY (room_id, room_type) REFERENCES room (room_id, room_type), 
    CHECK CONSTRAINT room_type = "family_room" 
); 

То есть, точка «подклассы» на супер-класса, в качестве столбца типа descriminator (таким образом, что заостренные к основанию класса правильного типа, и что первичный ключ суперкласса это то же самое, что и дочерние классы.

+1

Образец, который вы использовали, является хорошим. Он описан Мартином Фаулером как «Наследование класса». Вы можете увидеть сводку в Интернете: http://martinfowler.com /eaaCatalog/classTableInheritance.html. Как предполагает Фаулер, это Q имеет наследование больше, чем полиморфизм. Кроме того, вы использовали метод «общего первичного ключа» для связывания внешних ключей и первичных ключей подкласса вместе. для +1. –