我应该使用多个数据库吗?

时间:2010-03-09 23:32:53

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

我即将使用Ruby on Rails创建一个应用程序,我想使用多个数据库,基本上是一个会计应用程序,每个用户都有多个公司。我想为每家公司创建一个数据库

我发现了这篇文章http://programmerassist.com/article/302 但我想阅读更多关于这个问题的想法。 我必须在MySQL和PosgreSQL之间做出决定,哪个数据库可能更适合我的问题。

4 个答案:

答案 0 :(得分:6)

处理多租户应用程序有多种选择。

首先,您可以在表格中添加范围(如Chad Birch所建议 - 使用company_id)。对于大多数用例,这很好。如果您正在处理安全/私有的数据(例如会计信息),您需要非常小心测试以确保数据保持私密。

您可以使用多个数据库运行系统。您可以拥有一个为每个客户端使用数据库的应用程序,或者您可以为每个客户端实际拥有一个单独的应用程序。为每个客户端运行一个数据库会在rails中略微减少数量,但这是可行的。根据您拥有的客户端数量和负载预期,我实际上建议您查看运行单个应用程序。通过对部署设置(capistrano,厨师,木偶等)的一些工作,您可以使这个过程非常简化。每个客户端都在一个完全独特的环境中运行,如果某个特定客户端具有高负载,您可以将它们转移到自己的服务器上。

如果使用PostgreSQL,您可以使用模式执行类似操作。 PostgresQL schemas提供了一种非常方便的方法来平衡来自不同客户端的数据。数据库包含一个或多个命名模式,而模式又包含表。您需要为迁移和部署添加一些智能,但它确实很有效。

在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

答案 1 :(得分:1)

关于多个数据库的答案问题是,他们来自对多个数据库没有需求或经验的人。第二个问题是某些数据库不允许在多个数据库之间切换,包括允许用户进行自己的备份和恢复,并包括扩展以将某些用户指向不同的数据服务器。这是一个有用视频的链接 http://aac2009.confreaks.com/06-feb-2009-14-30-writing-multi-tenant-applications-in-rails-guy-naor.html

此链接将有助于使用Postgresql进行Ruby on Rails。

我目前有一个多租户,多数据库,多用户(许多登录到具有不同访问级别的同一租户),并且是一个在线SaaS应用程序。实际上有两个应用程序在会计类别中,另一个是银行业务。两个应用程序都基于相同的结构和方法。客户端用户(租户)可以在该用户的登录下切换数据库。代理商用户(如税务会计师)只能在其客户的数据库之间切换。超级用户可以切换到任何数据库。有一个数据字典,即只有一个位置,其中定义了表和列。有全球数据和本地数据。全局数据,例如每个人都可以使用的主帐户图表(只读)。本地数据是用户的数据库。新用户可以获得主数据库的克隆。有多个克隆可供选择。超级用户可以维护克隆数据库。

问题是它在COBOL中并使用ISAM文件并使用CGI方法。问题在于:a)人们认为COBOL已经过时,b)受过培训的人,c)价格和d)在线帮助。否则它会起作用,我很高兴。

所以我正在研究用什么替代它以及什么是雷区。

答案 2 :(得分:0)

它已经过去了,其中的决定是使用PostgreSQL模式,制作多租户应用程序,我有一个名为common的模式,其中存储了相关数据。

# app/models/organisation.rb
class Organisation < ActiveRecord::Base
  self.table_name = 'common.organisations'
  # set relationships as usual
end

# app/models/user.rb    
class User < ActiveRecord::Base
  self.table_name = 'common.users'
  # set relationships as usual
end

然后,对于迁移,我已经使用这个优秀的教程完成了这项工作。 http://timnew.github.com/blog/2012/07/17/use-postgres-multiple-schema-database-in-rails/使用它,这比我在其他地方看到的更好,甚至Ryan Bates在轨道广播上的表现。

创建新组织后,将使用组织的子域名创建新架构。我过去曾经读过,使用不同的模式并不是一个好主意,但这取决于你正在做的工作,这个应用程序几乎没有任何社交成分,所以它很适合。

答案 3 :(得分:-1)

不,你不应该使用多个数据库。

我不太确定会给你什么建议,看起来你对数据库设计有一些非常基本的误解,你可能想先了解数据库的基础知识,然后再继续。

您很可能只想在表格中添加“公司ID”类型列,以确定特定记录所属的公司。

相关问题