我正在学习multi-tenant应用程序以及如何使用PostgreSQL的模式。
研究这个主题,我最终找到了an article,其中作者描述了在多租户应用程序中使用PostgreSQL模式时的糟糕体验。主要问题是迁移性能不佳以及数据库资源的高使用率。
似乎只有一个模式(在租户之间共享表)会比为每个租户分配一个模式产生更好的性能。但我觉得很奇怪。我认为相反,因为较小的表上的索引往往比较大的表上的索引更轻。
如果在很多小表(在多个模式中)中分隔数据,而不是将数据分成几个大表(在单个模式中),为什么性能会更差?
答案 0 :(得分:46)
性能不一定差。正如文章所解释的那样,根据您的应用程序设计和工作负载,有一些特定条件会使架构方法变得更好或更差。让我解释一下“租户架构”与“共享表”方法之间的权衡:
当您拥有相对较少数量的相当大的租户时,租户架构是最佳选择。一个例子是会计应用程序,只有付费订阅用户。使其成为更好表现选项的事情包括:
使其成为表现不佳的选择包括:
租户架构是否对迁移/架构更改有害,实际上取决于您的工作方式。对于快速推出通用模式更改很不好,但有利于将模式更改部署为跨租户的逐步部署。
shared-table 可以更好地适用于拥有大量租户的情况,而且很多租户的数据非常少。这方面的一个例子是社交媒体移动应用程序,它允许免费帐户,因此有数千个被遗弃的帐户。使共享表模型有益的其他因素包括:
共享表的主要缺点是需要将租户过滤条件附加到应用程序层中的每个查询。这也有问题,因为:
那么哪种模式“表现更好”实际上取决于哪种权衡会伤害你最坏的情况。
还有一个混合模型,“租户视图”,其中实际数据存储在共享表中,但每个应用程序连接使用security barrier views来查看数据。这有一些每个模型的权衡。首先,它具有租户模式模型的安全优势,并具有两种模型的一些性能缺陷。