苦于写了很多重复代码,想了解一下大家在 Go 的项目里面是怎么用 GORM (或者其他 MySQL 客户端,不限 ORM / Raw SQL )来实现分表读写的?
例如 user_tab_00000000 - user_tab_00000199,一共 200 张表,按 user_id % 200 来分表。
了解过的方案:
- DAO 层(或操作 DB 层)时根据传入参数计算,相关代码会出现在每个 Query 方法,例如
CreateUser()、GetUserByUserID()、UpdateUserByUserID() - 挂载插件,init 时定义、注册分表字段、分表算法等等,DAO 层无特殊处理(就像在操作单表一样),实际执行的时候被改写,例如应用里执行
SELECT * FROM user_tab WHERE user_id = 199最终会被改写成SELECT * FROM user_tab_00000199 WHERE user_id = 199发往 MySQL ; - 应用层外挂载 MySQL 的代理,类似 ShardingSphere 这种,流程跟方案 2 类似,只是改写由外部中间件完成。
个人感觉方案 2 是个挺好的思路但是 Go 里面好像没有什么特别好用的中间件。