Rails Basecamp样式子域最佳实践

Soo*_*uNe 7 ruby-on-rails multi-tenant ruby-on-rails-3

我的目标是为每个子域分别设置用户帐户.在任何情况下我都不想在子域之间进行异花授粉.

我已经看过Robby RussleDHH的想法(两者都是前Rails3).

控制器处理非常简单,我的问题是关于保持模型数据的分离.阻止user1查看user2数据的最佳方法是什么?

一些想法可能包括:

  1. subdomain_id为每个模型添加外键 - Advantage,简单的一对多关系可用于将每个模型范围限定为子域.- 缺点,这是数据和较大的应用程序逻辑之间非常紧密的耦合,这似乎是不合适的.

  2. One-to-many :through对于将其与子域相关联的每个模型 - Advantage,无需将subdomain_id外键列添加到将它们与其子域相关联的现有表中.- 缺点,我的直觉是,这是有点矫枉过正.多个连接查询可能会变得复杂,并且可能发生交叉传播错误.

  3. 每个子域的单独应用程序或数据库 - 优势,数据完全隔离.- 缺点是,需要管理/更新/保护/托管等大量单个应用程序/数据库.

  4. 你的想法?

Soo*_*uNe 7

选项5. Guy Naor的架构解决方案 - 优势,这让我大吃一惊.对rails很透明,完全数据分离,只有一个数据库,对于最初不是设计为多租户的应用程序非常有用.惊人.- 缺点,需要使用Postgres或其他支持模式的数据库(我还在使用PG),迁移时需要迭代现有的模式.

现在,这似乎是最好的方式.有什么重大缺点吗?


Mar*_*ijn 1

如果您确定对象与子域的关系始终是一对一的,我会选择选项 1。如果对象将来可能与多个子域相关,则必须选择选项 2。它会产生更多开销,但使用康康舞之类的东西时很容易管理。

由于你提到的原因,我会远离选项 3。Rails 不能很好地处理多个数据库,此外,在一个应用程序中使用多个数据库并不能保证比其他选项更高的安全性。