merci pour votre temps d'abord ... après toute la recherche sur google, github et ici, et a obtenu plus confus au sujet des grands mots (partition/tesson/fedorate), je me dis que je dois décrire le problème spécifique que j'ai rencontré et Demande autour de toi.Comment faire fonctionner ActiveRecord avec des bases de données/tables partitionnées/partagées héritées?
Mes bases de données de l'entreprise traite des utilisateurs massifs et les commandes, donc nous avons divisé les bases de données et des tables de différentes manières, certains sont décrits ci-dessous:
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
Le concept de base est que les bases de données et tables sont séparées acording à un champ (pas nessissarily la clé primaire), et il y a trop de bases de données et trop de tables, de sorte que l'écriture ou la génération magique d'une database.yml config pour chaque base de données et un modèle pour chaque table n'est pas possible ou du moins pas la meilleure solution . J'ai examiné les solutions magiques de drnic, et datafabric, et même le code source d'enregistrement actif, peut-être que je pourrais utiliser ERB pour générer database.yml et faire une connexion de base de données autour du filtre, et peut-être que je pourrais utiliser named_scope le nom de la table pour trouver, mais les opérations de mise à jour/création sont limitées à "self.class.quoted_table_name" de sorte que je ne pourrais pas facilement résoudre mon problème. Et même je pourrais générer un modèle pour chaque table, parce que sa quantité est jusqu'à 30 plus.
Mais ce n'est tout simplement pas sec!
Ce que je besoin est une solution propre comme le DSL suivante:
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
Quelqu'un peut-il me illuminera? Toute aide serait grandement appréciée ~~~~
Merci pour votre solution détaillée, c'est très éclairant. Pourtant, il semble qu'il y ait un problème fatal: set_table_name est une méthode de classe, et son influence est à l'échelle de la classe, je ne peux pas l'étendre à l'objet spécifique. C'est pourquoi je pense à quelque chose de plus interne, comme "générer par magie un modèle pour chaque table" qui semble être utilisé dans votre solution magique (travaillant toujours à comprendre la source de DbCharmer). Si possible, je voudrais l'ajouter dans DbCharm, mais il y a un autre problème fatal, DbCharmer n'a pas de tests unitaires ... Alors, comment puis-je éviter de casser quelque chose pendant le processus? – Utensil
DbCharmer prend en charge la commutation de connexion étendue. Vous pouvez toujours faire MyModel.on_db (: foo) {...} ou MyModel.switch_shard (key) {...} et cela ne ferait que changer de connexion dans un bloc. Comme pour les tests, il y a un projet séparé avec des spécifications (presque 100% couvrant le code de la gemme): https://github.com/kovyrin/db-charmer-sandbox – kovyrin