ฉันเพิ่งทำสิ่งที่คล้ายกันสำหรับเพื่อนร่วมงาน โดยพื้นฐานแล้วฉันสร้างตารางที่ซ่อนอยู่ซึ่งมีหนึ่งแถวสำหรับคู่ (ผู้ใช้บทบาท) ที่มีข้อ จำกัด ที่เหมาะสม จากนั้นตารางผู้ใช้จะเป็นมุมมองของตารางที่ซ่อนอยู่ซึ่งมีบทบาททั้งหมดรวมอยู่ในอาร์เรย์ ฉันทำให้มันเป็นไปได้ที่จะแทรกลงในมุมมองโดยการเพิ่มกฎที่เหมาะสม นี่คือวิธี:
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=#
ฉันหวังว่าจะช่วย คุณสามารถทำให้มีประสิทธิภาพมากขึ้นและเพิ่มกฎเพิ่มเติมขึ้นอยู่กับความต้องการของคุณ