tro*_*ine 8 sql postgresql relational-algebra normalization denormalization
假设我们有这些表格:
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吗?我在想 - 我能找到的每个数据库的语法似乎都与每个约束的一个表相关联 - 但这可能是我缺乏想象力的.(DE-标准化为包括aId上Child当然是一个解决方案,.)
你可以尝试以下方法。您必须在(id, aId)Parent 中创建一个冗余的 UNIQUE 约束(SQL 非常愚蠢,不是吗?!)。
CREATE TABLE Child
(parentId INTEGER NOT NULL,
aId INTEGER NOT NULL UNIQUE,
FOREIGN KEY (parentId,aId) REFERENCES Parent (id,aId),
createdOn TIMESTAMP NOT NULL);
Run Code Online (Sandbox Code Playgroud)
可能更好的解决方案是从子表中完全删除parentId,添加bId并仅基于以下内容引用父表(aId, bId):
CREATE TABLE Child
(aId INTEGER NOT NULL UNIQUE,
bId INTEGER NOT NULL,
FOREIGN KEY (aId,bId) REFERENCES Parent (aId,bId),
createdOn TIMESTAMP NOT NULL);
Run Code Online (Sandbox Code Playgroud)
你有什么理由不能这样做吗?
| 归档时间: |
|
| 查看次数: |
6541 次 |
| 最近记录: |