【问题标题】:Rails Basecamp style subdomains best practiceRails Basecamp 样式子域最佳实践
【发布时间】:2011-06-28 19:53:31
【问题描述】:

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

我已经查看了 Robby Russle 和 DHH's 的想法(不过两者都是 Rails3 之前的版本)。

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

一些想法可能包括:

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

  2. One-to-many :through 对于将其与子域关联的每个模型 - 优势,无需将 subdomain_id 外键列添加到将它们与其子域关联的现有表中。 - 缺点,我的直觉是,这太过分了。多个连接查询可能会变得复杂,并且可能会出现交叉授粉错误。

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

  4. 你的想法?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 5 年后我自己的帖子的补充:公寓 gem (github.com/influitive/apartment) 提供了一种非常有用的方法来向 Rails 应用程序添加多租户。一段时间以来,它一直是我们的首选方法(使用 Postgres 模式),而且效果非常好。
    【解决方案2】:

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

    目前这似乎是最好的方法。有什么大的缺点吗?。

    【讨论】:

    • +1 用于 PG 模式。我一直在 Django 中使用它,效果很好,并且即将用 Rails 深入研究它。据我所知,Rails 3 制作了子域much easier(不再需要插件),所以这几乎是不费吹灰之力。当然,你也可以用子目录代替子域。
    • 很高兴听到一点鼓励。似乎每个人(包括 37 个信号)都在使用“范围”方法。 IMO,如果您的应用中有一个非常丰富的模型生态系统并且有多个关系,那将变得非常复杂。
    • 我正在使用范围方法,但希望我能先看到这一点。
    猜你喜欢
    • 2014-03-15
    • 1970-01-01
    • 2020-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多