Tôi chỉ làm một cái gì đó tương tự cho một đồng nghiệp. Về cơ bản, tôi đã tạo một bảng ẩn chứa một hàng cho mỗi cặp (người dùng, vai trò) với các ràng buộc phù hợp. Bảng người dùng sau đó là một khung nhìn của bảng ẩn với tất cả các vai trò được tập hợp thành một mảng. Sau đó tôi đã có thể chèn vào chế độ xem bằng cách thêm một quy tắc thích hợp. Đây là cách thực hiện:
trailer=# create table harvester (id int unique, label text);
CREATE TABLE
trailer=# insert into harvester values (1,'grain'), (2,'cricket');
INSERT 0 2
trailer=# create table donkey (id int, others int references
harvester(id));
CREATE TABLE
trailer=# create unique index donkey_ears on donkey (id, others);
CREATE INDEX
trailer=# create view combine as select id, array_agg(others) as others
from donkey group by id;
CREATE VIEW
trailer=# create rule combine_insert as on insert to combine do instead
(delete from donkey where donkey.id=new.id;insert into donkey select
new.id,unnest(new.others) );
CREATE RULE
trailer=# insert into combine values (1,'{1,2}');INSERT 0 2
trailer=# select * from combine ;
id | others
----+--------
1 | {1,2}
(1 row)
trailer=# insert into combine values (1,'{1,2}');
INSERT 0 2
trailer=# select * from combine ;
id | others
----+--------
1 | {1,2}
(1 row)
trailer=# insert into combine values (2,'{1,2,3}');
ERROR: insert or update on table "donkey" violates foreign key
constraint "donkey_others_fkey"
DETAIL: Key (others)=(3) is not present in table "harvester".
trailer=#
Tôi hy vọng điều đó sẽ giúp. Bạn có thể làm cho nó hiệu quả hơn một chút và thêm nhiều quy tắc tùy theo yêu cầu của bạn.