【问题标题】:Share tenant data across schemas in multi-tenant PostgreSQL在多租户 PostgreSQL 中跨模式共享租户数据
【发布时间】: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


    【解决方案1】:

    有几种方法可以处理这个问题

    方法 1

    1. 创建分配(实体)的主数据库,并创建一个表,其中包含与之共享的租户列表。
    2. 上述数据将驻留在全局数据库中,共享时可以引用/复制到租户的数据库中。

    方法 2

    • 在此模型中,创建一个作业并将其标记为可共享。然后,任何机构都可以从共享数据列表中找到并克隆/复制数据以供其使用
    • 处理这种情况有一些复杂性,例如当共享实体数据时,应该以某种方式将其带到公共数据库或通过类似设计的服务总线与其余租户共享,但存在复杂性和安全性问题可能会在这里处理。

    集思广益上述方法并分享您对特定模型的任何问题。

    【讨论】:

      猜你喜欢
      • 2014-03-21
      • 2014-01-16
      • 2012-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多