PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Polymorphismus für FOREIGN KEY-Einschränkungen

Hier ist das Muster, das ich verwendet habe.

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

Das heißt, die 'Unterklassen' zeigen auf die Oberklasse über eine Typdekriminatorspalte (so dass die Basisklasse, auf die gezeigt wird, vom richtigen Typ ist und dass der Primärschlüssel der Oberklasse derselbe ist wie die untergeordneten Klassen .