我已经建立了一个很好的网站系统,迎合了一个小利基市场的需求。在过去的一年里,我一直在通过使用Capistrano将软件的副本部署到我的Web服务器来销售这些网站。
在我看来,这些网站的唯一区别是数据库,CSS文件和用于个人客户端图形设计的一小部分图像。
其他一切都是一样的,或者应该是...现在我已经部署了大约20个这样的网站,用相同的代码更新它们变得很麻烦。这个问题只会变得更糟。
我想我应该重构这个系统,这样我就可以使用一组部署的Ruby代码,通过传入请求的URL动态选择正确的数据库等。
似乎有两种处理数据库的方法:
- 使用多个数据库,每个客户端一个
- 使用一个数据库,每个表中有一个client_id字段,还有一个额外的“client”表
多数据库方法目前对我来说是最简单的,因为我不必重构应用程序中的每个模型来将client_id字段添加到所有CRUD操作中。
然而,每次我想迁移数据库时,都要为几十个或几百个不同的数据库运行“rake db:migrate”,这将是一个麻烦。显然,这可以通过脚本来完成,但它闻起来不太好。
另一方面,每个客户端在“items”表中将有20 K-50 K项。当items表中有50万或100万个条目时,我担心全文搜索的速度。即使在client_id字段上有一个索引,我怀疑如果这些项被分隔到不同的客户端数据库中,搜索会更快。
如果任何人对处理这个问题的最佳方法有一个明智的意见,我很想听听。
3条答案
按热度按时间b09cbbtk1#
我决定使用多数据库方法。这对我来说是最简单的方法,因为我不需要重新编写整个应用程序。
我要做的是在application_controller中添加一个before_filter,这样它就适用于所有的控制器。比如这样:
然后,在
application_controller.rb
中,我将包含这样的内容:然后,像
example.com?client_id=12345
这样的URL将选择正确的数据库。由于我在Mongrel前面使用Apache作为代理,Apache将根据客户端的网站URL向所有请求添加正确的client_id。所以client_id实际上并不是用户看到的URL的一部分。它只会在Apache和Mongrel之间传递。我不确定我是否正确地解释了这一点,但它的工作和保持事情干净和简单。
如果我决定将来需要使用单个数据库,我可以重构所有代码。目前,这似乎是最简单的方法。
eoxn13cs2#
使用单独的数据库(包括您已经列出的数据库)有以下优点:
话虽如此,单DB解决方案可能更好:
jv4diomz3#
我会选择使用客户端ID的单个数据库--通过使用某种形式的基本模型,以及一个命名范围来将任何操作范围限定到该客户端的ID,您应该能够使重构不那么痛苦。
您可以使用索引库(如Ferret)或类似的沿着工具来处理全文搜索变慢的问题。这将是一个问题,无论如何,一旦一个客户端的数据库变得很大,所以你可能需要实现这两种方式。