我正在尝试创建用户可以在地图上绘制的房屋的自定义列表。每个用户都可以创建房屋,或编辑他们创建的房屋。但是,所有用户必须拥有一套通用的房屋,并且不能对其进行编辑或删除。
每个用户将用户划分为一个架构,其中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]
答案 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