最初に時間を割いていただきありがとうございます...グーグル、github、そしてここで検索した後、大きな単語(パーティション/シャード/フェドレート)についてもっと混乱しました、私は私が遭遇した特定の問題を説明し、周りに尋ねなければならないと思います。
私の会社のデータベースは大量のユーザーと注文を処理するため、データベースとテーブルをさまざまな方法で分割します。その一部を以下に説明します。
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
基本的な概念は、データベースとテーブルがフィールド(必ずしも主キーではない)に従って分離され、データベースとテーブルが多すぎるため、データベースとモデルごとに1つのdatabase.yml構成を作成または魔法のように生成することです。各テーブルについては不可能であるか、少なくとも最善の解決策ではありません。
drnicの魔法のソリューション、datafabric、さらにはアクティブレコードのソースコードを調べました。ERBを使用してdatabase.ymlを生成し、フィルター周辺でデータベース接続を行うことができます。また、named_scopeを使用してテーブル名を動的に決定することもできます。検索しますが、更新/作成操作は「self.class.quoted_table_name」にバインドされているため、問題を簡単に解決できませんでした。また、テーブルごとに1つのモデルを生成することもできます。これは、その量が最大で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
誰かが私を啓発できますか?どんな助けでも大歓迎です~~~~