3

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

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

我想我会做的是在公共模式中创建客户和用户之间的链接表。该表将包含客户的电子邮件和用户的 ID。我的问题是我不明白这在 Rails 上的效果如何。我想要实现的是类似customer.users.

所以问题是:我应该如何解决这个问题?

4

2 回答 2

2

我创建了这个库来帮助我们解决这个问题

https://github.com/Dandush03/pg_rls

目前最著名的实现是 Apartment Gem(来自 Influitive)、ActiveRecordMultiTenant(来自 Citus)和 rails 6.1 way、DB sharding

在处理大量模式/数据库时,Apartment 和 rails 6.1 方法存在许多问题,主要是在您大多数运行规模迁移或必须更改表上的默认值时,这是因为您需要运行它每个租户的迁移,并且非常具有成本效益。从长远来看,Citus 的方法会变得昂贵。 

谢天谢地,PostgreSQL 在 pg V-9 上提供了一个很好的解决方案,但它有一些性能问题在 pg V-10 上得到了解决。这种方法允许您将特定表保留在“特殊 id”后面,稍后可以使用 pg 新工具对其进行分区

我的方法主要集中在 PG 以及他们如何建议您实现 RLS,并且我的大部分查询都是使用 SQL 语句执行的,这在处理迁移时的性能问题时会有所帮助。我试图将最好的 rails 与最好的 pg 函数混合在一起。

我的方法更好的是,当您开始运行特殊的 pg 搜索功能时,不会有任何问题,因为所有数据都是安全的并且在同一个数据库下。您还将获得以超级用户身份登录并获取统计信息的能力。

我可以继续,但我想我的观点很清楚,如果您愿意,我鼓励您查看 gem(可能仍然有一些错误需要处理,就像现在它只处理从子域设置租户)但它确实让我在我正在进行的项目中生活更轻松。如果我得到更多支持(比如),我会继续维护它并将其升级为更通用的工具

于 2021-10-19T12:05:58.167 回答
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来消除重复项。

于 2013-05-22T10:40:34.400 回答