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 次 |
最近记录: |