在关系数据库中表示多态关联的最佳方法是什么?

时间:2012-07-11 21:23:36

标签: relational-database polymorphic-associations

假设表格的这种表示:

db parent/child tables

Object是“父”表,用于保存所有其他4个子表的目标 除了具有objectid列之外,'something'表还将包含linked_to_objectid列。此列仅指向object1和object2的objectid(而不是object3)。

我的问题是,如果linked_to_objectid不是来自object3,我每次插入行时都必须检查。

另一种方法是将另一列添加到对象表中,该列将描述objectid是什么类型的对象......但我觉得这是错误的。

我知道这个模型打破了正常的形式规则,但我找不到其他方法 任何人都可以帮助我并找到建模的最佳方法吗?

1 个答案:

答案 0 :(得分:4)

我认为你的答案是使用互惠的主键/外键并在表中划分主键的一部分,例如:

 CREATE TABLE object_class (
     id int not null unique, -- hand assigned
     label text not null primary key
 );

 CREATE TABLE object (
     object_id bigserial not null primary key,
     class_id int not null references object_class(id),
     ...., 
     UNIQUE (object_id, class_id)
 );

 CREATE TABLE object1 (
      object_id bigint not null,
      class_id bigint not null,
      .....
      check(class_id = 1),
      primary key (object_id, class_id),
      foreign key (object_id, class_id) references object(object_id, class_id)
 );

 etc.

现在,如果您正在使用PostgreSQL,您可以使用表继承和约束触发器来实现更清洁的东西,但这是相对高级的东西。