postgresql 中的紧密耦合表

Ash*_*win 0 postgresql

我们的网络应用程序类似于 - 用户可以创建群组(也可以请求成为群组成员)、提问、回答等。它仍处于开发阶段。我想要做的是紧密结合一些表。
例如- 每当新成员加入一个组时(即当该表正在更新时),应检查他/她是否是有效用户,或者每当有人在组中提出问题时,在将问题插入表之前,它应该检查该用户是否是该组的成员等。
我不能使用外键进行这些检查,因为组 mmbers 是以这种方式存储的

group_id    members

mygroup     member1,member2,member3
group001    member2,member10,member2,..<br>
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它们是通过分隔逗号存储的。所以我不能放置外键约束。

不想在每个 servlet 中进行这些检查。我想在插入时在数据库本身中执行它们。请告诉我如何进行此操作?
谢谢你。

a_h*_*ame 5

唯一明智的解决办法是标准化模型,摆脱那些可怕的逗号分隔值。然后您可以使用适当的外键。

就像是:

create table users
(
    user_id   serial not null primary key,
    user_name text not null
);

create table groups
(
    group_id   serial not null primary key,
    group_name text not null
);

create table members  
(
    user_id  integer not null,
    group_id integer not null,
    primary key (user_id, group_id),
    foreign key (user_id) references users (user_id),
    foreign key (group_id) references groups (group_id)
);
Run Code Online (Sandbox Code Playgroud)

如果出于某种原因,您希望使用逗号分隔的列表(为了显示方便),您始终可以创建一个返回以下内容的视图:

create view v_members
as
select g.group_id, 
       g.group_name, 
       string_agg(u.user_name) as group_members
from members m
  join users u on u.user_id = m.user_id
  join groups g on g.group_id = m.group_id
group by g.group_id, g.group_name
;
Run Code Online (Sandbox Code Playgroud)

  • 好吧,如果你坚持保留一个糟糕的模型,那就去做吧。但请注意。 (2认同)