我正在构建一个拥有许多客户(超过200个)的应用程序,我们正在考虑使用PostgreSQL模式将他们分开。
现在,我的问题是,当我在一个表中进行更改(例如添加一列)时,如何获取所有其他模式以将其表结构同步到所需的表结构?
或者我该如何在Internet上查找?我没有发现太多。也许我缺少正确的关键字?
答案 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 Security和customer_id
列将取决于我的处理方式。
我已使用此model where you trust the application来为合适的客户设置会话变量。实际上,这在应用程序本身中应该不会有太大变化,因为另一种方法将要求应用程序处理设置客户端的架构。
要了解有关RLS的更多信息,CrunchyData提供了一些不错的信息 一样 this post by Caleb Brewer。
在如此众多的模式下,导航/探索数据库变得乏味。无论使用哪种工具(psql
,PgAdmin等),都难以尝试查看/查找200多个列表中的模式。这会影响您的开发人员,管理员和分析人员,使他们的每一个生活都变得不那么有趣且生产力更低。这大大增加了维护成本。
第二:性能!父表的索引不会由其子表继承。如果要在每个模式都继承的列上建立索引,则需要在表的每个模式版本中显式创建这些索引。因此,一张需要3个索引的表现在需要200+ * 3个索引。需要删除一个索引...。这是删除该索引的200倍以上。
控制:“由于这个重要的客户现在需要它,当开发人员在客户模式中创建新表时会发生什么?找到这样的奇怪事物几乎是不可能的。这是维护成本可以成倍增加的另一个领域。
如果您坚持要为每个客户使用一个架构,table inheritance可能不会带来多大帮助。
如果您需要为每个客户部署一个架构,则自动部署应该是您的目标。即使您选择使用RLS并将所有数据保存在一组表中,自动化仍应是最高优先级。 Ansible和Sqitch之类的工具在这方面可谓无价之宝。使用这种方法,您将使用设置为仅在部署时填充的模式(作为变量)的模式来编写DDL。这样,每个模式都将部署为数据库中具有所有对象的准确版本,包括表,视图和函数的索引和检查约束。