Postgresql 存储ID数组以及如何在选择输出上正确解包
这在一定程度上也可能是一个设计问题(PostgreSQL还没有遇到) 我有三个表-用户、组和用户组。用户组表示链接到0..X组id的1个用户id的组合 这些表和您想的一样简单(现在,构建这个东西): 用户:ID、名称等 组:ID、名称 用户组:用户ID,组ID int[] 现在,User_组中的GroupID字段是一个整数数组。例如,UserID 1的值为{1,2,10,19,28} 目标: 在我的UI中,我需要将该列表表示为组名(即:{Group1、Group2、Group10、Group19、Group28}) 所以,因为我是PostgreSQL的新手,所以我正在研究,一些想法突然出现在我的脑海中——最新的、任意的和数组替换。所有的尖叫性能问题对我来说都是问题,但我可能错了(这是设计问题,存储阵列是否明智?) 我现在的问题是:Postgresql 存储ID数组以及如何在选择输出上正确解包,postgresql,Postgresql,这在一定程度上也可能是一个设计问题(PostgreSQL还没有遇到) 我有三个表-用户、组和用户组。用户组表示链接到0..X组id的1个用户id的组合 这些表和您想的一样简单(现在,构建这个东西): 用户:ID、名称等 组:ID、名称 用户组:用户ID,组ID int[] 现在,User_组中的GroupID字段是一个整数数组。例如,UserID 1的值为{1,2,10,19,28} 目标: 在我的UI中,我需要将该列表表示为组名(即:{Group1、Group2、Group10、Group19
select
u.*,
g.group_ids
from users u
left join user_group g
on u.id = g.user_id
我正试图找出如何推进的部分:
select ug.group_id
from (select unnest(group_ids) group_id FROM user_group) as ug
left join groups g
on g.id = ug.group_id
这将(显然)为该人员关联的每个组ID增加一行
哪种方法最好?(就我个人而言,我希望用户表中有一列作为组(int数组),但您也可以选择)
它看起来像(我用了我头顶上的表名和字段名,比你的稍微修改):
更新:我可能误解了你的需要。也许你的意思是:
select u.*,
(select string_agg(g.name,',')
from groups g
inner join usergroups ug on ug.groupId = g.GroupId
where ug.UserId = u.UserID and
g.groupId = ANY( ug.groups )) as Groups
from users u;
在这里,您有一对多的关系: 用户(1)->(*)组 这种关系不需要链接定义的中间表。一对多关系用于在子表中具有外键(在本例中为组) 结果将是:
- 用户:id,name
- 组:id、名称、用户\u id
- 您可以将约束添加到数据库中,如下所示:
ALTER TABLE user add constraint fk_user FOREIGN KEY(user_id)REFERENCES group代码>
select u.*,
(select string_agg(g.name,',')
from groups g
inner join usergroups ug on ug.groupId = g.GroupId
where ug.UserId = u.UserID and
g.groupId = ANY( ug.groups )) as Groups
from users u;