2017-10-18 68 views
1

我正在开发将被许多客户使用的多租户存储Web应用程序(软件即服务)。我只想使用一个数据库。我将不胜感激如何去这个数据库中的建议/反馈:使用多个模式或customerId表列实现多租户数据结构

  1. 为每一个客户是不同的模式。每当新客户注册时,我都会创建单独的模式。

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

柜面,如果你想知道正在使用什么样的技术: 的Postgres,春天引导MVC,REST,Maven的,JPA。

谢谢。

回答

1

这里有很大的折衷。使用客户ID的外键变得更加复杂(客户ID应该可能是每个外键的一部分),这意味着额外的索引。这也意味着你必须有一些强制执行这一限制的手段。最大的问题是应用程序中的错误可以很容易地向其他客户披露材料。

对于多个模式,你有一个问题,你有更多的表,这可能会导致特别是pg_dump的性能问题。但是,通过适当的搜索路径,危害其他客户的数据会有点困难。但是,这很难用于连接池。

一般来说,我认为模式方法更好,因为您可以随时按客户设置进行分区扩展,而更好的安全性非常重要。但是这意味着您必须对search_path有一个很好的理解,并将其设置为每个数据库事务的合理值。

+0

感谢您的宝贵意见。我们看到的另一个优势是,每个客户都将拥有独立数据库中的数据,这对未来将有利。但是模式方法会在我的网络应用程序中增加更多的工作。我们只会在tomcat上部署一个Web应用程序,因此无论何时用户登录,Web应用程序都需要搜索它所属的模式。所以我们还需要一个公共架构中的共享表格,它可以做到这一点。你不觉得这将是一个Web应用程序的矫枉过正? –

+0

这可能比将其构建到每个查询中的工作更少。您也可以将用户/模式映射缓存在中间件中。 –