Sí, los esquemas son la solución. Use un solo clúster de PostgreSQL, con una sola base de datos.
Crea un grupo para todos los usuarios de la aplicación:
CREATE ROLE app;
Cree un esquema de "aplicación" global, donde vivirán todas las tablas de aplicaciones compartidas globales.
CREATE SCHEMA AUTHORIZATION app;
CREATE TABLE app.objects ( objectid int PRIMARY KEY );
ALTER TABLE app.objects OWNER TO app;
Cree un usuario independiente (sin derechos de superusuario) para cada una de las implementaciones:
CREATE USER app01 IN ROLE app;
CREATE USER app02 IN ROLE app;
Opcionalmente, en lugar de IN ROLE app
, puede otorgar derechos explícitos para estos usuarios en objetos de aplicaciones seleccionados:
GRANT USAGE ON SCHEMA app TO app01;
GRANT SELECT on app.objects TO app01;
Cree esquemas privados, donde vivirán las tablas dependientes de la implementación:
CREATE SCHEMA AUTHORIZATION app01;
CREATE SCHEMA AUTHORIZATION app02;
Ahora tiene un esquema privado para cada aplicación implementada; pero al mismo tiempo tienes acceso compartido a datos globales.
Lo bueno es que la aplicación no tiene que ser compatible con esquemas. SELECT * FROM froobles
se resolverá por defecto en SELECT * FROM app01.froobles
, si está conectado como app01
usuario. No tiene que especificar el nombre del esquema.
Como medida adicional, puede utilizar la herencia de tablas para ampliar los objetos globales según la implementación:
CREATE TABLE app01.objects (
localattr1 int,
localattr2 text
)
INHERITS ( app.objects );