Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

当分片策略不走主键路由时,为什么采用笛卡尔积作为ShardingKey #3

Open
sirius-tzq opened this issue Sep 12, 2023 · 2 comments

Comments

@sirius-tzq
Copy link

如果分片策略走的是主键路由,那么就会利用workerId路由
如果分片策略不走主键路由(主键路由失败或是sharding-columns不含主键),程序会采用分片组合字段路由: doShardingValuesByShardingColumns。该方法返回值是这些非主键值的笛卡尔积。

我想了解为什么采用这种策略,而非基因法或是映射法?

@makemyownlife
Copy link
Owner

我认为这里也是基因法。
比如订单id的生成 workerId 也是按照用户id来生成的。 有些场景,查询用户订单列表 ,传递用userId,通过用户id就可以获取workerID 。
之所以使用笛卡尔积,比如分片字段有两个 比如 userId , areaId 的场景。

@sirius-tzq
Copy link
Author

感谢回复,主键路由时的确是根据workID路由的,这和基因法类似。但是非主键路由时却并没有发挥基因法的作用。

当我尝试只利用order_id查询t_ent_order_detail表时,发现order_id不会走分片策略,这是可以预料的,因为入库的时候就没根据order_id分片。
而这也是我想说的,order_id作为连接所有表的重要字段,即使对于t_ent_order_detail和t_ent_order_item来说,order_id不是主键,我们在分片时也应该根据order_id来分片。实际上,以上两个表是用id,ent_id分片的。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants