【发布时间】:2019-05-18 19:53:09
【问题描述】:
我目前正在开发一个将 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)
);
在此示例应用程序中,只能为学生分配来自同一所学校的作业。我想要的是学校可以“共享”他们的一些作业,以便其他学校的学生可以分配到这些作业(“Max”分配给“Assignment 01”和“Assignment 04”)。
当我想在多对多表上创建外键时,我必须分配一个特定的模式 (REFERENCES school1.students (id))。这不是我想要的,因为作业可能来自任何其他学校 (shema)。
我将如何在此处实现此功能?
【问题讨论】:
标签: database postgresql multi-tenant