多租户:单个数据库还是每个租户的数据库?

Multitenancy: Single database or database per tenant?

我们正处于新的多租户 SaaS 应用程序的规划阶段,并且已经到了决定点。在设计多租户应用程序时,是选择一个包含所有客户数据(使用 'customer_id' 列)的单一数据库更好,还是为每个客户拥有一个独立的数据库更好?无论数据库决策如何,所有租户都将 运行 脱离相同的代码库。

在我看来,拥有单独的数据库可以使备份/恢复更容易,但代价是增加了开发和升级的复杂性(升级 1 个数据库比升级 500 个数据库要容易得多)。如果情况允许,将单个客户拆分到单独的专用服务器也更容易/可能。同时,在尝试全面了解客户如何使用该软件时,汇总数据变得更加困难。

我们预计推出后至少一年的客户数量不会超过 250 个,但他们将是大客户,之后还会有更多客户跟进。

由于这是我们迈向 SaaS 的第一步,我们肯定希望从一开始就做到这一点。

评论有点长

在大多数情况下,您希望一个数据库在适当的表中具有单独的客户 ID 列。这使得维护应用程序变得更加容易。例如,在一个数据库中替换一个存储过程比在 250 个数据库中替换要容易得多。

在可扩展性方面,可能没有问题。如果您真的想要,您可以按客户端对表进行分区。

您希望每个客户端有一个单独的数据库有一些原因:

  • 访问控制:在数据库级别维护访问控制比在行级别容易得多。
  • 定制:如果您可以在单一环境中工作,那么为客户定制软件会容易得多。
  • 性能瓶颈:如果数据真的很大and/or系统上确实有大量事务,将数据库分布在不同的服务器上比维护一个庞大的数据库可能更简单(也更便宜) .

不过,考虑到可维护性和一致性,我认为默认应该是一个数据库。

顺便说一下,备份和恢复。如果客户需要此功能,您可能无论如何都想编写自定义脚本。尽管您可以使用数据库级备份和还原,但您可能有一些特殊需求,例如与未存储在数据库中的数据保持一致性。