FOREIGN KEY约束的"多态"

Jah*_*nov 12 postgresql polymorphism database-design referential-integrity foreign-keys

表中有这个字段:

room_id INT NOT NULL CONSTRAINT room_id_ref_room REFERENCES room
Run Code Online (Sandbox Code Playgroud)

我有两个房间的三张桌子:standard_roomfamily_room

怎么做这样的事情:

room_id INT NOT NULL CONSTRAINT room_id_ref_room REFERENCES standard_room or family_room
Run Code Online (Sandbox Code Playgroud)

我的意思是,room_id应该引用任何 standard_room family_room.
有可能这样做吗?

Sin*_*ion 16

这是我一直在使用的模式.

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"
);
Run Code Online (Sandbox Code Playgroud)

也就是说,超类的'子类'指向一个类型描述符列(这样指向的基类具有正确的类型,并且超类的主键与子类相同) .

  • 需要插入 2 条记录来表示每个逻辑对象,这感觉很尴尬。 (3认同)
  • 你一直在使用的模式是一个很好的模式。Martin Fowler 将其描述为“类表继承”。您可以在 Web 上查看摘要:http://martinfowler.com/eaaCatalog/classTableInheritance.html。正如 Fowler 所暗示的,这个 Q 是关于继承而不是多态性。此外,您已经使用“共享主键”技术将外键和子类主键联系在一起。上帝+1。 (2认同)