PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

polimorfismo para restrições FOREIGN KEY


Aqui está o padrão que tenho usado.
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"
);

Ou seja, as 'subclasses' apontam para a superclasse, por meio de uma coluna descriminadora de tipo (de modo que a classe base apontada seja do tipo correto e que a chave primária da superclasse seja a mesma das classes filhas .