gpt4 book ai didi

ruby-on-rails - 如何使 ActiveRecord 与旧的分区/分片数据库/表一起工作?

转载 作者:行者123 更新时间:2023-12-04 05:46:01 27 4
gpt4 key购买 nike

首先感谢您的时间......在google,github和here上搜索之后,对大词(partition/shard/fedorate)更加困惑,我想我必须描述我遇到的具体问题并四处询问.

我公司的数据库处理海量的用户和订单,所以我们对数据库和表进行了多种拆分,部分描述如下:

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

基本概念是数据库和表是按照一个字段(不一定是主键)分开的,而且数据库太多,表太多,所以写或神奇地为每个数据库和一个模型生成一个database.yml config对于每个表是不可能的,或者至少不是最好的解决方案。

我查看了drnic的魔术解决方案,datafabric,甚至active record的源代码,也许我可以使用ERB生成database.yml并在过滤器周围进行数据库连接,也许我可以使用named_scope来动态决定表名找到,但更新/创建操作被限制为“self.class.quoted_table_name”,因此我无法轻松解决我的问题。甚至我也可以为每个表生成一个模型,因为它的数量最多可达 30 个。

但这不是 DRY!

我需要的是一个干净的解决方案,如以下 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

有人可以启发我吗?任何帮助将不胜感激~~~~

最佳答案

使用 DbCharmer 很容易实现情况二(仅更改数据库名称) .您需要创建您的 own sharding method在 DbCharmer 中,这将返回基于键的连接参数哈希。

其他两种情况不立即支持,但可以轻松添加到您的系统中:

  • 您实现了知道如何处理分片数据库中的数据库名称的分片方法,这将使您能够执行 shard_for(key)调用您的模型以切换数据库连接。
  • 你添加一个这样的方法:
    class MyModel < ActiveRecord::Base
    db_magic :sharded => { :sharded_connection => :my_sharding_method }

    def switch_shard(key)
    set_table_name(table_for_key(key)) # switch table
    shard_for(key) # switch connection
    end
    end
  • 现在你可以像这样使用你的模型:
    MyModel.switch_shard(key).first
    MyModel.switch_shard(key).count

    并且,考虑到您有 shard_for(key)switch_shard 返回的调用结果方法,你可以这样使用它:
    m = MyModel.switch_shard(key) # Switch connection and get a connection proxy
    m.first # Call any AR methods on the proxy
    m.count
  • 关于ruby-on-rails - 如何使 ActiveRecord 与旧的分区/分片数据库/表一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1659829/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com