В настоящее время я работаю над приложением, которое использует схемы PostgreSQL для мультитенантности (1 схема на каждого арендатора).
Теперь я столкнулся со следующей проблемой: я хочу установить отношения между записями из разныхсхемы (чтобы арендаторы могли использовать некоторые данные от других арендаторов).
Я сделал небольшой пример проекта, чтобы объяснить это лучше:
/*
sample project goal
----------------------
one school per schema
every school has students
every school has assignments
You can assign assignments to students. Those assignments can be from every school.
*/
/* reset */
DROP SCHEMA school1 CASCADE;
DROP SCHEMA school2 CASCADE;
/* create schemas */
CREATE SCHEMA school1;
CREATE SCHEMA school2;
/* create student tables */
CREATE TABLE school1.students(
id serial primary key NOT NULL,
name varchar NOT NULL,
unique(name)
);
CREATE TABLE school2.students(
id serial primary key NOT NULL,
name varchar NOT NULL,
unique(name)
);
/* fill student tables with sample data */
INSERT INTO school1.students ("name")
VALUES ('Max');
INSERT INTO school1.students ("name")
VALUES ('Sarah');
INSERT INTO school1.students ("name")
VALUES ('Jane');
INSERT INTO school2.students ("name")
VALUES ('David');
INSERT INTO school2.students ("name")
VALUES ('Lisa');
INSERT INTO school2.students ("name")
VALUES ('James');
/* create assignments tables */
CREATE TABLE school1.assignments(
id serial primary key NOT NULL,
title varchar NOT NULL,
unique(title)
);
CREATE TABLE school2.assignments(
id serial primary key NOT NULL,
title varchar NOT NULL,
unique(title)
);
/* fill assignment tables with sample data */
INSERT INTO school1.assignments ("title")
VALUES ('Assignment 01');
INSERT INTO school1.assignments ("title")
VALUES ('Assignment 02');
INSERT INTO school1.assignments ("title")
VALUES ('Assignment 03');
INSERT INTO school2.assignments ("title")
VALUES ('Assignment 04');
INSERT INTO school2.assignments ("title")
VALUES ('Assignment 05');
INSERT INTO school2.assignments ("title")
VALUES ('Assignment 06');
/* create assignments_students tables */
CREATE TABLE school1.assignments_students(
student_id int REFERENCES school1.students (id) ON UPDATE CASCADE ON DELETE CASCADE,
assignment_id int REFERENCES school1.assignments (id) ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT assignments_products_pkey PRIMARY KEY (assignment_id, student_id)
);
CREATE TABLE school2.assignments_students(
student_id int REFERENCES school2.students (id) ON UPDATE CASCADE ON DELETE CASCADE,
assignment_id int REFERENCES school2.assignments (id) ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT assignments_products_pkey PRIMARY KEY (assignment_id, student_id)
);
В этом примере приложения ученикам можно назначать толькозадания из той же школы.Я хочу, чтобы школы могли «делиться» некоторыми своими заданиями, чтобы ученики из других школ могли быть назначены на эти задания («Макс» назначен на «Назначение 01» и «Назначение 04»).
Когда я хочу создать внешние ключи для таблицы «многие ко многим», я должен назначить конкретную схему (REFERENCES school1.students (id)
).Это не то, чего я хочу, так как задание потенциально может прийти из любой другой школы (shema).
Как мне реализовать эту функцию здесь?