Да, схемите са решението. Използвайте един PostgreSQL клъстер с една база данни.
Създайте група за всички потребители на приложението:
CREATE ROLE app;
Създайте глобална схема за „приложение“, където ще живеят всички глобални таблици на споделени приложения.
CREATE SCHEMA AUTHORIZATION app;
CREATE TABLE app.objects ( objectid int PRIMARY KEY );
ALTER TABLE app.objects OWNER TO app;
Създайте отделен потребител (без права на суперпотребител) за всяко от внедряванията:
CREATE USER app01 IN ROLE app;
CREATE USER app02 IN ROLE app;
По желание, вместо IN ROLE app
, можете да предоставите изрични права на тези потребители върху избрани обекти на приложение:
GRANT USAGE ON SCHEMA app TO app01;
GRANT SELECT on app.objects TO app01;
Създайте частни схеми, където ще живеят зависещите от внедряването таблици:
CREATE SCHEMA AUTHORIZATION app01;
CREATE SCHEMA AUTHORIZATION app02;
Сега имате лична схема за всяко разгърнато приложение; но в същото време имате споделен достъп до глобални данни.
Хубавото е, че приложението не трябва да е наясно със схемата. SELECT * FROM froobles
по подразбиране ще разреши на SELECT * FROM app01.froobles
, ако сте свързани като app01
потребител. Не е необходимо да посочвате име на схема.
Като допълнителна мярка можете да използвате наследяване на таблица за разширяване на глобални обекти на базата на всяко разполагане:
CREATE TABLE app01.objects (
localattr1 int,
localattr2 text
)
INHERITS ( app.objects );