我们的网络应用程序类似于 - 用户可以创建群组(也可以请求成为群组成员)、提问、回答等。它仍处于开发阶段。我想要做的是紧密结合一些表。
例如- 每当新成员加入一个组时(即当该表正在更新时),应检查他/她是否是有效用户,或者每当有人在组中提出问题时,在将问题插入表之前,它应该检查该用户是否是该组的成员等。
我不能使用外键进行这些检查,因为组 mmbers 是以这种方式存储的
group_id members
mygroup member1,member2,member3
group001 member2,member10,member2,..<br>
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,它们是通过分隔逗号存储的。所以我不能放置外键约束。
我不想在每个 servlet 中进行这些检查。我想在插入时在数据库本身中执行它们。请告诉我如何进行此操作?
谢谢你。
该唯一明智的解决办法是标准化模型,摆脱那些可怕的逗号分隔值。然后您可以使用适当的外键。
就像是:
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)
归档时间: |
|
查看次数: |
137 次 |
最近记录: |