将主键传播到子表

时间:2014-04-29 13:05:14

标签: postgresql database-design propagation shared-primary-key

我希望在插入新行时将主键列的值从父表传播到特定的子表。

为了便于说明,我创建了以下表格:

Create TABLE Material(
MatID serial PRIMARY KEY,
materialname TEXT
);

Create TABLE RealMaterial(
MatID INT REFERENCES Material(MatID),
attributereal TEXT,
PRIMARY KEY(MatID)
);

Create TABLE VirtualMaterial(
MatID INT REFERENCES Material(MatID),
attributevirt TEXT,
PRIMARY KEY(MatID)
);

当我插入新材料时,我自动想要添加RealMaterialVirtualMaterial(引用新ID)。我应该强调我想使用这个共享主键模式,而不仅仅是单表继承。

我应该为我的目的使用触发器吗?

2 个答案:

答案 0 :(得分:1)

从您的评论中,您似乎并不真正关心"自动插入",而是"自动执行"儿童的存在 1 排他性 2

由于PostgreSQL支持延迟约束,因此可以声明性地like this进行。

然而,它需要" uglyfying"您的模型通常会增加复杂性,因此在应用程序级别强制执行此类约束通常被视为较小的恶意。你可以考虑隐藏这种逻辑behind an API,以消除" rogue"客户绕过它。


1 对于给定的父行,必须有子行。换句话说,单独的父类无法实例化 - 它是抽象的。

2 对于给定的父行,不能有多个子行。

答案 1 :(得分:0)

我真的不明白你所有的字段是什么意思,你并没有真正提供大量的信息,但你可以用触发器完成这个。同样,这里没有很多信息,所以我不会尝试编写一个有效的例子,但伪代码片段将是:

IF (TG_OP = 'INSERT') THEN
    IF NEW.Parameter = 'REAL' THEN
        INSERT INTO RealMaterial (MatID) VALUES (NEW.MatID);
    ELSE
        INSERT INTO VirtualMaterial (MatID) VALUES (NEW.MatID);
    END IF;
END IF;

我不知道Material.Parameter与Parameter2和Parameter3之间的关系(如果有的话)。假设Material.Parameter控制材质是真实的还是虚拟的,那么您将需要处理INSERTS和UPDATES,并能够将材料从“RealMaterial”移动到“VirtualMaterial”,反之亦然。您可以使用外键(级联)处理删除。

两条未经请求的建议:

  1. 发布时,请尽可能多地提供(相关)信息。它会带来更好的答案。在这里解释关系会有所帮助。此外,您应始终包含有关您正在使用的PostgreSQL版本的信息。
  2. 根据我的经验,感觉你不需要不同的桌子,只需要一张桌子。我强烈建议将其作为单个表格实施。