sql >> Base de Datos >  >> RDS >> PostgreSQL

polimorfismo para restricciones FOREIGN KEY

Este es el patrón que he estado usando.

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"
);

Es decir, las 'subclases' apuntan a la superclase, a través de una columna de discriminador de tipo (de modo que la clase base apuntada sea del tipo correcto, y la clave principal de la superclase sea la misma que la de las clases secundarias). .