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

3

我正打算使用Ruby on Rails创建一个应用程序,希望可以使用多个数据库。这基本上是一个会为每个用户拥有多个公司的会计应用程序。我想要为每个公司创建一个数据库

我找到了这篇文章:http://programmerassist.com/article/302 但我想读更多关于这个问题的看法。我必须在MySQL和PosgreSQL之间做出决定,哪个数据库可以更好地解决我的问题。

4个回答

6
处理多租户应用有几种选择。
首先,您可以向表中添加作用域(如Chad Birch所建议的使用company_id)。对于大多数用例,这是可以的。如果您处理的数据是安全/私有的(例如会计信息),则需要非常小心地进行测试,以确保数据保持私有。
您可以使用多个数据库运行系统。您可以有一个单独的应用程序,为每个客户端使用一个数据库,或者您实际上可以为每个客户端拥有一个单独的应用程序。为每个客户端运行数据库在rails中有点违反常规,但它是可行的。根据您拥有的客户端数量和负载预期,我实际上建议查看运行单独应用程序的情况。通过对部署设置(capistrano、chef、puppet等)进行一些工作,您可以使此过程非常流畅。每个客户端都在完全独特的环境中运行,如果特定客户端具有高负载,则可以将其分离到自己的服务器上。
如果使用PostgreSQL,您可以使用模式(schemas)进行类似的操作。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
多个数据库的答案来自于那些没有需求或经验的人时,就会出现问题。第二个问题是有些数据库根本不允许在多个数据库之间切换,包括允许用户自己备份和恢复以及缩放到将某些用户指向不同的数据服务器。这里有一个有用的视频链接http://aac2009.confreaks.com/06-feb-2009-14-30-writing-multi-tenant-applications-in-rails-guy-naor.html,该链接将有助于使用Ruby on Rails和PostgreSQL。
我目前拥有一个多租户、多数据库、多用户(同一租户下有多个不同访问级别的登录)的在线SaaS应用程序,实际上有两个应用程序,一个是会计类的,另一个是银行业务。这两个应用程序都建立在相同的结构和方法上。客户用户(租户)可以在该用户的登录下切换数据库。代理用户(如税务会计师)只能为其客户之间切换数据库。超级用户可以切换到任何数据库。有一个数据字典,即仅有一个地方定义表格和列。有全局数据和本地数据。全局数据如主账户图表对每个人都可读取(只读)。本地数据是用户的数据库。新用户可以获得主数据库的克隆。有多个克隆可供选择。超级用户可以维护克隆数据库。
问题是它是基于COBOL语言制作的,使用ISAM文件和CGI方法。其中的问题是:a)有一种认识认为COBOL已过时,b)很难找到接受培训的人员,c)价格高昂,d)在线帮助。否则,它可以正常运行,我对此很满意。
因此,我正在研究用什么来替代它,但这是一个雷区。

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 在 railscasts 上做的方式都要好。

当创建一个新组织时,会创建一个名为该组织子域名的新模式。过去我曾经读到过不建议使用不同的模式,但这取决于你所做的工作,这个应用几乎没有社交组件,所以很适合。


-1

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

但我不确定该给你什么建议,似乎你对数据库设计有一些基本的误解,你可能需要先学习数据库的基础知识,然后再深入研究。

你最有可能只需要在表中添加一个“公司ID”类型的列,以标识特定记录属于哪个公司。


使用多个数据库为什么不是一个好主意? - Toby Hede
1
我的意思是,提供数据完整性和安全性是一种非常常见的策略。 - Toby Hede
@Chad:仅仅告诉别人去自学,而没有提供任何具体的信息,这显得相当不友善。至少提供一个链接会有所帮助。话虽如此,考虑到问题缺乏细节,你最后一段还是比较合理的,但总体来说,这个回答并不是很有帮助。 - aaaidan
我理解你的意思,关系中有一个company_id是有道理的,但问题在于公司的数据与其他公司的数据没有关联。我更担心的是当我有很多公司和它们各自的索引时,查询会变慢。我现在对扩展不感兴趣,我知道这可能是更好的解决方案,但我将在需要时进行扩展。 - Boris Barroso
1
@Boris - “但是我会在需要的时候进行扩展”... 这些话在项目开始时被很多人说过。当然,任何继承这个项目并试图在后期使其扩展的人说的话可能会有所不同!从一开始就做对,你的应用程序将能够长久存在。 - RQDQ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接