很多人以为,只要用昵称当ID,比如把「小明2024」直接存进数据库主键,就天然唯一——毕竟人名不重样嘛。可现实是,系统可不认谁是谁,它只认字节和规则。
昵称不是身份证
「小明2024」这个昵称,可能被10个人同时注册:刚毕业的大学生、带娃的宝妈、自学编程的会计、刷短视频起号的店主……系统眼里,它们就是一串完全相同的字符串:"xiaoming2024"。数据库插入时,如果设了唯一索引,第二个人就会卡住报错:duplicate entry。
常见误区场景
某次做用户系统,开发同学直接把微信昵称(如「阿哲 🌟」)作为用户表 user_id 字段。上线三天,就有两人昵称一模一样(含空格和emoji),结果一个注册成功,另一个提示「账号已存在」,用户打电话来问:「我根本没注册过,怎么就被占了?」
真正靠谱的ID长啥样?
唯一ID得靠算法或底层机制保证,和昵称无关。比如:
uuid.uuid4() # 生成类似:f8a7e3b1-2c9d-4e5f-a1b2-c3d4e5f6a7b8
time.time_ns() # 纳秒级时间戳,配合机器ID(Snowflake)
DB自增ID # MySQL AUTO_INCREMENT,简单但有单点瓶颈这些才是经得起并发考验的ID来源。昵称?老老实实放在 nike_name 字段里,加个普通索引甚至不加索引都行。
非要拿昵称做ID?加个后缀也行
真想让ID看起来「有人味儿」,可以拼接:昵称 + 下划线 + 随机数(4位):"xiaoming2024_7a3f" 或 "xiaoming2024_8921"。
但注意:这依然要走查重逻辑,不能跳过唯一性校验——因为随机数也有撞上的可能,尤其量大时。
一句话:昵称是给人看的,ID是给机器认的。别指望名字自带防重属性,该上UUID就上UUID,该建索引就建索引。