2013-05-21 41 views
2

我打算使用Rails构建一个应用程序。它使用Apartment gem和PostgreSQL来实现多租户。该应用程序将有用户,每个用户都有一个帐户。这意味着每个用户都拥有自己的PostgresSQL模式;用户表位于默认架构中。Rails + Postgres:多租户做对了吗?

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

我想我会做的是在公共架构中创建客户和用户之间的链接表。该表格将包含客户的电子邮件和用户的ID。我的问题是,我不明白这将如何与Rails一起工作。我想实现的是类似customer.users

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

+1

您似乎在说有些用户是租户,有些用户是客户。 (由于客户可以登录,因此他们是用户的某种意义上的)。并且希望客户能够跨所有租户进行查询,因为用户和客户之间的映射存储在特定于租户的架构中。但是,这不是多租户架构应该预防*的那种事情吗? –

+0

@ MikeSherrill'Catcall'谢谢你的回答。我花了几天的时间思考,并且我意识到,就我而言,多租户有更多的缺点而不是优点。我将在没有多租户的情况下构建我的Rails应用程序。 –

回答

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...] 

查询跨架构中的所有表。您可以通过使用组来消除重复项。

+0

我不明白你的观点...用户<=>客户是多对多的关系,但客户表格处于不同的模式。我需要Rails做的事情是查询所有模式(我认为),这就是我不知道该怎么做的...... –