【问题标题】:How to sync PostgreSQL database structures between schemas如何在模式之间同步 PostgreSQL 数据库结构
【发布时间】:2019-05-11 13:23:16
【问题描述】:

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

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

或者我如何在 Internet 上查找此内容?我没有找到太多。也许我错过了正确的关键字?

【问题讨论】:

  • 你不想有 200 个模式。相反,您将 costumer_id 添加到您的表中。

标签: postgresql schema multi-tenant


【解决方案1】:

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

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);

在这种情况下,您可以在原始Customer 表的基础上创建一个JhonCustomer 表。如果Customer 表发生变化,那么JhonCustomer 也会发生变化。

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

【讨论】:

  • 我的一位同事担心性能问题。这比使用模式慢吗?
  • 没有。 Schemas 就像将文件存储在不同的文件夹中一样。在不同文件夹中拆分文件不会获得性能。
  • 性能绝对是这种情况下的一个问题,即索引继承这一事实,这是一个大问题。
  • @RustProofLabs 如果您阅读我的评论,我已经建议他不要这样做。但是 OP 询问他如何做到这一点,我建议 inherit 作为解决方案。我不知道什么是 OP 要求,因为这个问题非常广泛。
  • @MarcBackes 为了清楚起见,我尝试回答您如何同步模式。如果您想提高应用程序的性能,多个模式不会帮助您,就像多个文件夹不会提高文件访问速度一样。如果您需要性能方面的帮助,我建议您创建一个包含更多信息的不同问题,以便我们为您提供帮助。
【解决方案2】:

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。通过这种方式,每个架构都被部署为具有所有对象在您的数据库中的精确版本,包括表、视图和函数的索引和检查约束。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-22
    • 2018-01-25
    • 2019-01-09
    • 2017-07-31
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-31
    相关资源
    最近更新 更多