Rails Basecamp样式子域最佳实践

时间:2011-02-17 03:30:34

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

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

我已经查看了Robby RussleDHH's个想法(虽然它们都在Rails3之前)。

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

一些想法可能包括:

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

  2. 对于将其与子域 - Advantage 相关联的每个模型,
  3. One-to-many :through,无需向现有表添加subdomain_id外键列,将它们与其子关联域。 - 缺点,我的直觉是这样做有点矫枉过正。多个连接查询可能会变得复杂,并且可能会出现异花授粉错误。

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

  5. 你的想法?

2 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:1)

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

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

相关问题