Rails + Postgres:多租户做得对吗?

时间:2013-05-21 16:06:11

标签: ruby-on-rails postgresql multi-tenant

我打算使用Rails构建一个应用程序。它使用Apartment gem和PostgreSQL来使用多租户。该应用将拥有用户,每个用户都有一个帐户。这意味着每个用户都拥有自己的PostgresSQL架构; users表位于默认架构中。

每个用户都有自己的架构中的客户列表。具有相同电子邮件(基本上是同一客户)的客户可以出现在多个模式中。我希望客户能够登录并查看与其关联的所有用户。我不能将customers表放在默认/公共模式中,因为它与不在默认模式中的其他表相关。

我认为我要做的是在公共架构中的客户和用户之间创建一个链接表。该表将包含客户的电子邮件和用户的ID。我的问题是我不明白这对Rails有多好。我想要实现的是customer.users

所以问题是:我该如何处理这个问题?

1 个答案:

答案 0 :(得分:1)

我建议您的用户(登录时,不是租户的一部分)和客户(它们分开存放,位于每个租户中)之间存在差异)。 用户表(可能附带其他表)可以保存从用户到架构/客户等的分配信息。我甚至不会使用外键来链接用户与租户中的表格相关的表格,只是为了让它们真正分开。

简而言之,用户表仅用于验证和授权。

更新:该问题描述了针对各个租户使用单独的数据库模式的多租户方法。在此设置中,我不会通过数据库外键用户客户链接,我不会一起查询它们。只需对用户进行身份验证,然后获取指定的租户。之后切换到租户。

如果您真的想在一次运行中查询两个项目(用户和客户),我不会使用单独的模式:一个模式,创建一个租户表,并将外键放入所有其他表(客户等)。在这种情况下,您甚至可以不使用单独的用户表,并且可以查询(单个)客户表。

更新2 :回答您的疑问问题:

您可以在PostgreSql的元数据中查询模式:

select schemaname from pg_tables where tablename = 'Customer'

这为您提供了包含客户表的所有模式。 使用该信息,您可以动态构建联合选择

select name from schema1.customer
union all
select name from schema2.customer
union all

[...repeat for all schemas...]

跨模式查询所有表。您可以使用 group by 来消除重复项。

相关问题