Да, схемы - это решение. Используйте один кластер 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 );