是否可以跨架构从另一个表继承数据?

时间:2019-10-26 02:44:35

标签: sql postgresql inheritance

我正在尝试创建用户可以在地图上绘制的房屋的自定义列表。每个用户都可以创建房屋,或编辑他们创建的房屋。但是,所有用户必须拥有一套通用的房屋,并且不能对其进行编辑或删除。

每个用户将用户划分为一个架构,其中user.houses表列出了单个用户的所有自定义房屋。

类似地,public.houses表包含每个用户可用的房屋。这些表的结构相同。

有没有一种方法可以在所有user.houses表之间不复制public.houses表数据?

我能够使用继承来确保user.houses表完全匹配public.houses表结构。现在,我也想对数据进行处理。

INSERT INTO public.houses id VALUES (1), (2) ;
INSERT INTO user_a.houses id VALUES (3) ;
INSERT INTO user_b.houses id VALUES (4) ;

SELECT id FROM user_b.houses ;

我希望输出为id:[1、2、4]

2 个答案:

答案 0 :(得分:0)

这个评论太长了。

通过为每个用户使用一个架构,您可能已经做出了错误的决定。这样做有一些合理的理由-安全是第一位的原因。如果您强烈要求将数据分开。另一个原因是,如果用户实际上使用了不同的数据库版本(他们自己的安装)。

也就是说,通常最好在一个数据库/架构中支持多个用户。这些表将标识每个实体的用户(重要的地方)。某些表(例如参考表)将在没有所有权的情况下共享。

您可以做的一件事就是创建视图。视图:

create view v_user_houses as
    select p.*
    from public.houses p
    union all
    select u.*
    from user.houses u;

每个用户都需要一个单独的视图。

另一种选择是将发布的房屋复制到所有的用户表中。当公共房屋发生任何变化时,您将把这些变化传播到用户房屋表。

答案 1 :(得分:0)

尝试一下

SELECT array_agg(a.id) FROM (
    select id from public.houses
    union all
    select id from user_a.houses
    union all
    select id from user_b.houses ) AS a