Rails Basecamp样式子域最佳实践

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

我已经看过Robby Russle和DHH的想法(两者都是前Rails3)。

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

一些想法可能包括:

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

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

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

  4. 你的想法?

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

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

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

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