Ano, schémata jsou řešením. Použijte jeden cluster PostgreSQL s jednou databází.
Vytvořte skupinu pro všechny uživatele aplikace:
CREATE ROLE app;
Vytvořte globální schéma „app“, kde budou fungovat všechny globální tabulky sdílených aplikací.
CREATE SCHEMA AUTHORIZATION app;
CREATE TABLE app.objects ( objectid int PRIMARY KEY );
ALTER TABLE app.objects OWNER TO app;
Vytvořte samostatného uživatele (bez práv superuživatele) pro každé z nasazení:
CREATE USER app01 IN ROLE app;
CREATE USER app02 IN ROLE app;
Volitelně místo IN ROLE app
, můžete těmto uživatelům udělit explicitní práva na vybrané objekty aplikace:
GRANT USAGE ON SCHEMA app TO app01;
GRANT SELECT on app.objects TO app01;
Vytvořte soukromá schémata, kde budou fungovat tabulky závislé na nasazení:
CREATE SCHEMA AUTHORIZATION app01;
CREATE SCHEMA AUTHORIZATION app02;
Nyní máte soukromé schéma pro každou nasazenou aplikaci; ale zároveň máte sdílený přístup ke globálním datům.
Co je hezké, je, že aplikace nemusí znát schéma. SELECT * FROM froobles
se ve výchozím nastavení převede na SELECT * FROM app01.froobles
, pokud jste připojeni jako app01
uživatel. Nemusíte zadávat název schématu.
Jako další opatření můžete použít dědičnost tabulky k rozšíření globálních objektů na základě jednotlivých nasazení:
CREATE TABLE app01.objects (
localattr1 int,
localattr2 text
)
INHERITS ( app.objects );