Совместное использование данных арендатора по схемам в мультитенантном PostgreSQL - PullRequest
0 голосов
/ 18 декабря 2018

В настоящее время я работаю над приложением, которое использует схемы 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).

Как мне реализовать эту функцию здесь?

1 Ответ

0 голосов
/ 22 декабря 2018

Существует несколько способов решения этой проблемы

Подход 1

  1. Создайте базу данных master для назначений (сущности) и создайте таблицу, котораясодержит список арендаторов, которым он предоставлен.
  2. Приведенные выше данные будут храниться в глобальной базе данных, и при совместном использовании они могут ссылаться / реплицироваться в базы данных арендатора.

Подход 2

  • В этой модели создайте назначение и отметьте его как разделяемое.Затем любое учреждение может найти из списка общих данных и клонировать / реплицировать данные для их использования
  • В этом случае есть некоторая сложность в обработке, например, когда данные объекта являются общими, их следует каким-то образом передатьобщей базы данных или для совместного использования с оставшимися арендаторами через сервисную шину, например, дизайн, но есть проблемы сложности и безопасности, которые, вероятно, будут здесь решаться.для конкретной модели.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...