假设表格的这种表示:
Object是“父”表,用于保存所有其他4个子表的目标 除了具有objectid列之外,'something'表还将包含linked_to_objectid列。此列仅指向object1和object2的objectid(而不是object3)。
我的问题是,如果linked_to_objectid不是来自object3,我每次插入行时都必须检查。
另一种方法是将另一列添加到对象表中,该列将描述objectid是什么类型的对象......但我觉得这是错误的。
我知道这个模型打破了正常的形式规则,但我找不到其他方法 任何人都可以帮助我并找到建模的最佳方法吗?
答案 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,您可以使用表继承和约束触发器来实现更清洁的东西,但这是相对高级的东西。