如何在模式之间同步PostgreSQL数据库结构

时间:2018-12-10 15:50:51

标签: postgresql schema multi-tenant

我正在构建一个拥有许多客户(超过200个)的应用程序,我们正在考虑使用PostgreSQL模式将他们分开。

现在,我的问题是,当我在一个表中进行更改(例如添加一列)时,如何获取所有其他模式以将其表结构同步到所需的表结构?

或者我该如何在Internet上查找?我没有发现太多。也许我缺少正确的关键字?

2 个答案:

答案 0 :(得分:0)

如果要复制相同的结构,则可能需要使用继承

https://www.postgresql.org/docs/11/ddl-inherit.html

CREATE TABLE cities (
    name            text,
    population      float,
    altitude        int     -- in feet
);

CREATE TABLE capitals (
    state           char(2)
) INHERITS (cities);

在这种情况下,您可以基于原始JhonCustomer表创建一个Customer表。如果Customer表更改,那么JhonCustomer也将更改。

但是我仍然认为您应该向表中添加custumer_id而不是创建200个模式

答案 1 :(得分:0)

Row Level Securitycustomer_id列将取决于我的处理方式。 我已使用此model where you trust the application来为合适的客户设置会话变量。实际上,这在应用程序本身中应该不会有太大变化,因为另一种方法将要求应用程序处理设置客户端的架构。

要了解有关RLS的更多信息,CrunchyData提供了一些不错的信息 一样 this post by Caleb Brewer

为什么不具有表继承的多个模式?

在如此众多的模式下,导航/探索数据库变得乏味。无论使用哪种工具(psql,PgAdmin等),都难以尝试查看/查找200多个列表中的模式。这会影响您的开发人员,管理员和分析人员,使他们的每一个生活都变得不那么有趣且生产力更低。这大大增加了维护成本。

第二:性能!父表的索引不会由其子表继承。如果要在每个模式都继承的列上建立索引,则需要在表的每个模式版本中显式创建这些索引。因此,一张需要3个索引的表现在需要200+ * 3个索引。需要删除一个索引...。这是删除该索引的200倍以上。

控制:“由于这个重要的客户现在需要它,当开发人员在客户模式中创建新表时会发生什么?找到这样的奇怪事物几乎是不可能的。这是维护成本可以成倍增加的另一个领域。

如果您坚持要为每个客户使用一个架构,table inheritance可能不会带来多大帮助。

自动化是最好的方法

如果您需要为每个客户部署一个架构,则自动部署应该是您的目标。即使您选择使用RLS并将所有数据保存在一组表中,自动化仍应是最高优先级。 AnsibleSqitch之类的工具在这方面可谓无价之宝。使用这种方法,您将使用设置为仅在部署时填充的模式(作为变量)的模式来编写DDL。这样,每个模式都将部署为数据库中具有所有对象的准确版本,包括表,视图和函数的索引和检查约束。