2

假设表格的这种表示:

db 父/子表

Object 是包含所有其他 4 个子表的 objectid 的“父”表。
'something' 表除了有一个 objectid 列之外,还将包括 linked_to_objectid 列。此列仅指向来自 object1 和 object2(而不是来自 object3)的 objectid。

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

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

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

4

1 回答 1

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,您可能可以使用表继承和约束触发器来实现一些更简洁的东西,但这是相对高级的东西。

于 2012-09-22T14:12:08.627 回答