使用多个模式或customerId表列实现多租户数据结构

时间:2017-10-18 23:16:24

标签: postgresql database-design multi-tenant

我正在开发多租户商店Web应用程序(软件即服务),将被许多客户使用。我想只使用一个数据库。我很感激有关如何在数据库中进行此操作的建议/反馈:

  1. 为每个客户分别设计模式。每当新客户注册时,我都会创建单独的架构。

  2. 所有客户的单一架构。并使用在所有其他表中引用的customerId创建CUSTOMER表(例如,订单,付款等)。每当新客户注册时,我都会在CUSTOMER表中创建一个条目。

  3. 如果您想了解正在使用的技术,请注意: Postgres,Spring Boot MVC,REST,Maven,JPA。

    感谢。

1 个答案:

答案 0 :(得分:1)

这里有一些主要的权衡。使用客户ID,您的外键变得更加复杂(客户ID可能应该是每个外键的一部分),这意味着额外的索引。这也意味着您必须有一些方法来强制执行此限制。最大的问题是,您的应用程序中的错误很容易泄露来自其他客户的资料。

对于多个模式,您遇到的问题是您有更多的表,这可能会导致pg_dump的性能问题。但是,通过适当的搜索路径,破坏其他客户端的数据会有点困难。但是,这对连接池来说更难使用。

总的来说,我认为架构方法更好,因为您可以通过按客户集划分来扩展,更好的安全性非常重要。但是,这意味着您必须对search_path有一个很好的理解,并在每次数据库事务上将其设置为合理的值。