尝试给orm新增唯一索引,最后还是决定不加了

前言

有群友比较想要orm可以设置唯一索引,方便类似给账号做绑定手机号,绑定邮箱这种需求,其实对于这类需求,我是建议新建一个表做对应映射关系,但是又考虑到,如果能在原本的表建唯一索引,或许做这类需求要简单从容许多。虽然这又会给orm增长一些的复杂度,但是我抱着试一试的心态,开始对本就复杂的orm解剖重构,先把耦合的索引代码抽离独立,方便主键,唯一索引一起用,然后新增唯一索引,接通了查询,写了查询的测试,这时候我觉得一切都很顺利,感觉唯一索引是可以添加的。直到有一天晚上睡觉的时候,突然想起,类似绑定手机号这类需求,新增的账号一开始可能没有绑定手机号,就需要有NULL值,但是orm从设计之初到现在,都是不许NULL值的出现的,业务没有填值的项,都会给0或者空串的默认值,为了兼容NULL值,需要做大量改到,索引兼容空串,处理联合索引某个为空的情况,写业务也需要考虑字段为唯一索引字段为nil的情况,这涉及到大量的改到,增加了过多的复杂度,影响到了可维护性,打破了orm长期使用带来的稳定性,所以我决定还是不加了。

多表方案

这里说一下使用多表方案解决这类需求。

账号表

1
2
3
4
5
6
7
8
9
10
local adapter = ormadapter_mysql:new("admin")
local orm_obj = ormtable:new("account")
:string32("account")
:int64("player_id")
:int8("sex")
:string32("nickname")
:string32("phone") --手机号
:set_keys("account")
:set_cache(500,500) --5秒保存一次
:builder(adapter)

手机号映射

1
2
3
4
5
6
7
local adapter = ormadapter_mysql:new("admin")
local orm_obj = ormtable:new("phone")
:string32("phone")
:string32("account")
:set_keys("phone")
:set_cache(500,500) --5秒保存一次
:builder(adapter)

这样就可以通过phone找到对应account了。


尝试给orm新增唯一索引,最后还是决定不加了
https://huahua132.github.io/2025/03/22/skynet_fly_ss/orm_unique_index/
作者
huahua132
发布于
2025年3月22日
许可协议