Postgresql 存储ID数组以及如何在选择输出上正确解包

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

这在一定程度上也可能是一个设计问题(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的新手,所以我正在研究,一些想法突然出现在我的脑海中——最新的、任意的和数组替换。所有的尖叫性能问题对我来说都是问题,但我可能错了(这是设计问题,存储阵列是否明智?)

我现在的问题是:

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

为什么不使用两个表(用户和组),而不是三个表?对于一对多关系,不需要链接表。只有User(id,name)和Group(User_id,随便什么)。可以做到这一点-我主要将两者分开,因为groupid将比其他字段更新得更频繁,它有助于其他查询的报告目的。这并不完全有帮助,但这给了我使用string_agg的技巧-这给了我解决方案!我会更新并接受它。现在,这不是一个选项-但我完全理解为什么我应该这样做。说来话长。但是谢谢你!
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;