感謝您的時間第一......在谷歌,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