Bor*_*oso 3 database ruby-on-rails multi-tenant
我即将使用Ruby on Rails创建一个应用程序,我想使用多个数据库,基本上是一个会计应用程序,每个用户将拥有多个公司.我想为每家公司创建一个数据库
我发现这篇文章http://programmerassist.com/article/302 但我想阅读更多关于这个问题的想法.我必须在MySQL和PosgreSQL之间做出决定,哪个数据库可能更适合我的问题.
处理多租户应用程序有多种选择.
首先,您可以向表中添加范围(如Chad Birch所建议 - 使用company_id).对于大多数用例,这很好.如果您正在处理安全/私有数据(例如会计信息),则需要非常小心您的测试以确保数据保持私密性.
您可以使用多个数据库运行系统.您可以拥有一个为每个客户端使用数据库的应用程序,或者您可以为每个客户端实际拥有一个单独的应用程序.为每个客户端运行一个数据库会在rails中略微减少数量,但这是可行的.根据您拥有的客户端数量和负载预期,我实际上建议您查看运行单个应用程序.通过对部署设置(capistrano,厨师,木偶等)的一些工作,您可以使这个过程非常简化.每个客户端都在一个完全独特的环境中运行,如果某个特定客户端具有高负载,您可以将它们转移到自己的服务器上.
如果使用PostgreSQL,您可以使用模式执行类似的操作. PostgresQL模式提供了一种非常方便的方法来平衡来自不同客户端的数据.数据库包含一个或多个命名模式,而模式又包含表.您需要为迁移和部署添加一些智能,但它确实很有效.
在Rails应用程序中,您可以将过滤器附加到打开或关闭当前用户架构的请求.
就像是:
before_filter :set_app
def set_app
current_app = App.find_by_subdomain(...)
schema = current_app.schema
set_schema_path(schema)
end
def set_schema_path(schema)
connection = ActiveRecord::Base.connection
connection.execute("SET search_path TO #{schema}, #{connection.schema_search_path}")
end
def reset_schema_path
connection = ActiveRecord::Base.connection
connection.execute("SET search_path TO #{connection.schema_search_path}")
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1977 次 |
| 最近记录: |