在自定义分片算法中,是否可以获取到表名?

有没有一种办法,可以让多个表共享一套规则?
比如A表的规则就是

  • 记录a → 表A_a,
  • 记录b → 表A_b

    就是记录x所对应的表名就是在原来的表名A后面加上"_x"

我现在的做法是只有一个分片算法,这个算法在遇到记录a就会返回"A_a",能不能把这个算法推广一下,在算法内部获取到逻辑表名,这样就可以用逻辑表名,连接我分片算法得到的分片名。把这个规则用到A表就是"A_…",B表就是"B_…"。
请问这个能否做到?

能否提供一个具体的示例说明下呢?现在怎么实现的自定义算法,还需要什么信息?

比如我现在有个表,为A,这个表,遇到team_id为a的时候,就要分配到A_a里面去,遇到team_id为b的时候,就要分配到A_b中去。这个我是写死在代码中的,这个算法就是个map,遇到a就是会返回"A_a",遇到b就是会返回"A_b"。可是我有很多个表都是这套规则,譬如还有个B表,因为我的代码写死了,返回的就是"A_…",这样的话我就要为B新建一套规则,但是其实map的内容是一样的。
我想能不能多个表,共享这套规则,因为他们的map都是一样的,比如A表过来,然后看到team_id为a,就拿着a映射的结果"_a",连接上表的名字"A",就得到了"A_a"。同样B表也使用这个算法,但是这次表名是B,所以返回的就是"B"连接上"_a",得到是"B_a"。这样所有的表都使用这个规则,TableX在team_id为a的情况下,得到的返回值都是"TableX_a"。

这个我感觉可以哈,和 t_order 改写为 t_order_0 应该是类似的做法,你是不想配置 actualDataNodes?

是的,我可能没有固定的actualDataNodes,而且是多个表共享一套规则。

我觉得核心的问题就是能否在doShardind()方法中获取到表的名字。

现在 PreciseShardingValue 中有个 DataNodeInfo 属性,这里面提取了分库和分表规则的信息,不过目前这个对象不支持配置,是在 TableRule 中取出数字后缀提取出来的,可能优化下就能支持你这个需求,@ VeejaLiu 你可以 debug 看下 DataNodeInfo 里面的值。

1 个赞

哦哦,谢谢大佬!现在的话,可能我只能写多套规则了?

京ICP备2021015875号