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

Postgresql 使用多个模式或按customerId表列实现多租户数据结构,postgresql,database-design,multi-tenant,Postgresql,Database Design,Multi Tenant,我正在开发多租户商店web应用程序(软件即服务),这将被许多客户使用。我只想使用一个数据库。如能在数据库中提供建议/反馈,我将不胜感激: 每个客户都有单独的模式。每当新客户注册时,我都创建单独的模式 所有客户的单一模式。以及使用customerId创建一个客户表,该表在所有其他表(如订单、付款等)中引用。每当新客户注册时,我都在customer表中创建一个条目 如果您想知道正在使用哪些技术: Postgres、Spring Boot MVC、REST、Maven、JPA 谢谢。这里有一些主要的权

我正在开发多租户商店web应用程序(软件即服务),这将被许多客户使用。我只想使用一个数据库。如能在数据库中提供建议/反馈,我将不胜感激:

  • 每个客户都有单独的模式。每当新客户注册时,我都创建单独的模式

  • 所有客户的单一模式。以及使用customerId创建一个客户表,该表在所有其他表(如订单、付款等)中引用。每当新客户注册时,我都在customer表中创建一个条目

  • 如果您想知道正在使用哪些技术: Postgres、Spring Boot MVC、REST、Maven、JPA


    谢谢。

    这里有一些主要的权衡。有了客户id,您的外键变得更加复杂(客户id可能是每个外键的一部分),这意味着额外的索引。这也意味着你必须有一些手段来实施这一限制。最大的问题是,应用程序中的bug很容易从其他客户那里泄露信息

    对于多个模式,您会遇到一个问题,即您有更多的表,这尤其会导致pg_转储的性能问题。然而,通过适当的搜索路径,要破坏其他客户机的数据就有点困难了。但是,这在连接池中很难使用


    总的来说,我认为模式方法更好,因为您总是可以通过按客户集划分来扩展,而且更好的安全性很重要。但是,这意味着您必须对搜索路径有很好的了解,并在每个数据库事务中将其设置为合理的值。

    感谢您的宝贵反馈。我们看到的另一个优势是,每个客户都将在一个单独的模式中拥有自己的数据,这在将来将是有益的。但是模式方法将在我的web应用程序上投入更多的工作。我们将只在tomcat上部署一个web应用程序,因此每当用户登录时,web应用程序都需要搜索它所属的模式。所以我们还需要一个公共模式中的共享表来完成这个发现。你不认为这对一个web应用来说是一种过度的杀伤力吗?它可能比正确地将它构建到每个查询中要省力。您还可以在中间件中缓存用户/模式映射。