【发布时间】:2011-09-10 22:54:49
【问题描述】:
假设我们有这些表:
CREATE TABLE A (
id SERIAL NOT NULL PRIMARY KEY
);
CREATE TABLE B (
id SERIAL NOT NULL PRIMARY KEY
);
CREATE TABLE Parent (
id SERIAL NOT NULL PRIMARY KEY,
aId INTEGER NOT NULL REFERENCES A (id),
bId INTEGER NOT NULL REFERENCES B (id),
UNIQUE(aId, bId)
);
CREATE TABLE Child (
parentId INTEGER NOT NULL REFERENCES Parent (id),
createdOn TIMESTAMP NOT NULL
);
是否可以在Child 上创建一个唯一约束,以使Child 中的所有行最多引用一个Parent,其值为aId?换句话说,我可以创建一个唯一约束,以便上述表的连接不会有重复的aId?我认为不是——我能找到的每个数据库的语法似乎都与每个约束绑定到一个表——但这可能是我缺乏想象力。 (当然,去规范化以在 Child 上包含 aId 是一种解决方案。)
【问题讨论】:
-
您可以在插入或更新时使用触发器来执行和响应您的约束逻辑,但我认为触发器应该是绝对的最后手段——我宁愿在业务层这样做。
-
我同意 hamlin11 的观点,我不希望在业务层看到这一点,但在大多数情况下使用数据库触发器。
-
业务层将是放置这种逻辑的最糟糕的宫殿,如果它对于约束来说太简单了,那么触发器是正确的方法。它当然必须是一个正确编写且性能良好的触发器(编写糟糕的触发器会导致触发器的表现不佳)。
标签: sql postgresql normalization denormalization relational-algebra