我有两个表:foosbars,它们之间有一个多对一的关系:每个foo可以有多个bars。我还有一个视图foobars,它连接这两个表(它的查询类似于select foo.*, bar.id from foos, bars where bar.foo_id=foo.id)。
编辑:如果你说foos和bars之间有多对多的关系,那就没有错。不过,abar只是一个标记(实际上,它是一个大小),只是由它的名称组成。表bars的角色与链接表的相同。
我有一个插入到foobars的规则,这样“foo”部分作为一个新行插入到foos中,“bar”部分(由两个用逗号分隔的bar id组成)被拆分,并且对于每个这样的部分,在它和相应的foo之间创建一个链接(我使用一个过程来实现这一点)。
这对插入非常有用。不过,在更新整件事的时候,我有个问题。规则的foo部分很简单。但是,我不知道如何处理多重的部分。当我尝试在规则中执行类似于bar的操作时,我将结束从表DELETE FROM bars WHERE foo_id=new.foo_id中删除所有内容。
我做错什么了?有没有办法达到我的要求?最后,我对整件事的态度是否明智?
(我对视图执行这个过度复杂的操作,因为我得到的数据是“bars及其所有foos”的形式,但是用户必须只看到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/

10-11 07:58