感谢您的时间第一......在谷歌,github和这里搜索之后,并且对大词(分区/分片/ fedorate)感到困惑,我认为我必须描述我遇到的具体问题,问问周围。如何使ActiveRecord与传统的分区/分片数据库/表一起工作?
我公司的数据库中有大量的用户和订单交易,于是将通过各种方式的数据库和表,一些描述如下:
way database and table name shard by (maybe it's should be called partitioned by?)
YZ.X db_YZ.tb_X order serial number last three digits
YYYYMMDD. db_YYYYMMDD.tb date
YYYYMM.DD db_YYYYMM.tb_ DD date too
的基本概念是,数据库和表分隔acording到现场(并不是主键),并且数据库太多,表格太多,因此,为每个数据库写入或奇迹般地生成一个database.yml配置文件,而为每个表格创建一个模型是不可能的,或者至少不是最佳的解决方案。我研究了drnic的魔术解决方案,datafabric,甚至是活动记录的源代码,也许我可以使用ERB生成database.yml,并在过滤器中执行数据库连接,也许我可以使用named_scope动态决定查找表的名称,但更新/创建操作被限制为“self.class.quoted_table_name”,以便我不能轻易地解决问题。我甚至可以为每个表格生成一个模型,因为它的数量最多可达30个。
但这只是不干!
我需要的是像下面的DSL一个干净的解决方案:
class Order < ActiveRecord::Base
shard_by :order_serialno do |key|
[get_db_config_by(key), #because some or all of the databaes might share the same machine in a regular way or can be configed by a hash of regex, and it can also be a const
get_db_name_by(key),
get_tb_name_by(key),
]
end
end
可有人微启我吗?任何帮助将不胜感激~~~~
感谢您的详细解决方案,它非常有用。然而,似乎有一个致命的问题:set_table_name是一个类方法,它的影响是整个类的,我无法将其范围限定在特定的对象。 这就是为什么我正在考虑更多内部的东西,比如“为每个表奇迹般地生成一个模型”,这似乎在您的魔法解决方案中使用(仍在努力了解DbCharmer的来源)。 如果可能,我想将它添加到DbCharm中,但还有另外一个致命的问题,DbCharmer没有单元测试......那么我怎样才能避免在这个过程中破坏某些东西呢? – Utensil 2011-10-22 09:59:57
DbCharmer支持范围内的连接切换。您始终可以执行MyModel.on_db(:foo){...}或MyModel.switch_shard(key){...},它只会切换块中的连接。至于测试,有一个单独的项目与规格(几乎100%覆盖宝石的代码):https://github.com/kovyrin/db-charmer-sandbox – kovyrin 2011-10-23 15:51:21