我有两个表:foos
和bars
,它们之间有一个多对一的关系:每个foo
可以有多个bars
。我还有一个视图foobars
,它连接这两个表(它的查询类似于select foo.*, bar.id from foos, bars where bar.foo_id=foo.id
)。
编辑:如果你说foo
s和bar
s之间有多对多的关系,那就没有错。不过,abar
只是一个标记(实际上,它是一个大小),只是由它的名称组成。表bars
的角色与链接表的相同。
我有一个插入到foobars
的规则,这样“foo”部分作为一个新行插入到foos
中,“bar”部分(由两个用逗号分隔的bar id组成)被拆分,并且对于每个这样的部分,在它和相应的foo
之间创建一个链接(我使用一个过程来实现这一点)。
这对插入非常有用。不过,在更新整件事的时候,我有个问题。规则的foo
部分很简单。但是,我不知道如何处理多重的部分。当我尝试在规则中执行类似于bar
的操作时,我将结束从表DELETE FROM bars WHERE foo_id=new.foo_id
中删除所有内容。
我做错什么了?有没有办法达到我的要求?最后,我对整件事的态度是否明智?
(我对视图执行这个过度复杂的操作,因为我得到的数据是“bars
及其所有foo
s”的形式,但是用户必须只看到bar
)
最佳答案
rysiek,如果我理解正确的话,您在foos
表中有一个文本列,它被解析为提取指向bars
表的外键。这种建立关系的方法在某些情况下可能是合理的,但是几乎每一个数据库编程指南/教程都不鼓励这样做。为什么不在bars
中使用指向foos
中foo的标准外键呢?除非需要将条分配给多个foo。如果是的话,这表明你的关系是多对多,而不是一对多。在这两种情况下,对于数据库来说,使用标准的基于外键的解决方案似乎要自然得多。
一对多关系的数据库架构示例:
CREATE TABLE foos (
id SERIAL PRIMARY KEY,
....
);
CREATE TABLE bars (
id SERIAL PRIMARY KEY,
foo_id INT REFERENCES bars (id) ON DELETE CASCADE,
...
);
对于多对多关系也是如此:
CREATE TABLE foos (
id SERIAL PRIMARY KEY,
....
);
CREATE TABLE bars (
id SERIAL PRIMARY KEY,
...
);
CREATE TABLE foostobars (
foo_id INT REFERENCES foos (id) ON DELETE CASCADE,
bar_id INT REFERENCES bars (id) ON DELETE CASCADE
);
我还建议使用内部连接而不是表乘法(从foos、bar中选择)。
CREATE VIEW foobars AS
SELECT
foos.id AS foo_id, foos.something,
bars.id AS bar_id, bars.somethingelse
FROM foos
INNER JOIN bars ON bars.foo_id = foo.id;
对于多对多内部连接也是如此
CREATE VIEW foobars AS
SELECT
foos.id AS foo_id, foos.something,
bars.id AS bar_id, bars.somethingelse
FROM foos
INNER JOIN foostobars AS ftb ON ftb.foo_id = foo.id
INNER JOIN bars ON bars.id = ftb.bar_id;
关于sql - 通过PostgreSQL中的 View 以多对一关系更新两个表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/160453/