是的,模式就是解决方案。使用单个 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 );