一般用户表的用户 ID,是不是设计成字符串的比较多

2023-03-01 13:17:49 +08:00
 cjbi

如题,请说明理由,表关联也是用字符串吗?

4617 次点击
所在节点    数据库
59 条回复
LeegoYih
2023-03-01 14:24:14 +08:00
@superedlimited MongoDB 的 ObjectId 也是根据 Timestamp 和 MachineID 自增的 bigint ,只不过它是 12 字节 96 位的整数,用字符串方便展示
superedlimited
2023-03-01 14:32:33 +08:00
@LeegoYih #21 谢谢,我查了一下文档,原来它是 16 进制的数字。我是直接用的 mongodb 的免费 cloud 数据库,还没仔细看文档。
vitoliu
2023-03-01 14:34:57 +08:00
BIGINT 毋庸置疑,具体生成规则,看用户 ID 包含不包含对外业务含义,包含对外业务含义生成规则不能包含趋势递增。
xuanbg
2023-03-01 14:37:17 +08:00
我选择雪花 ID 。用字符串是什么鬼? UUID ?
Chad0000
2023-03-01 15:04:42 +08:00
@melkor
有太多系统到废弃那天用户到不了那么多。自增没什么不好。
Chad0000
2023-03-01 15:09:09 +08:00
@chendy
@cjbi
@op351

有种叫 hashid 的技术你可以了解一下,安全起见你还可以将数组化[id, randomId]这样,第 1 个是真正的 Id ,后面那个是验证码。
acvrock
2023-03-01 15:15:07 +08:00
BIGINT +1,UID 大概率是其他业务表的索引,越短越好,最好趋势递增
但是不能简单的自增,否则用户规模会被外部猜测出来,或者被扫描爆破
pkoukk
2023-03-01 15:19:22 +08:00
内部系统用数据库自增
对外系统用雪花,UUID 太长了,占存储太多了,而且最主要的坑是如果拿 uuid 当主键,插入性能太差了
虽然用户不太可能用户注册有太高并发,但是如果你需要用备份恢复一个库或者增加一个从库的时候就要疯
chendy
2023-03-01 15:26:00 +08:00
@Chad0000 学习了,原来有现成的东西可以用
allinoneok
2023-03-01 15:30:51 +08:00
如果你的 ID 需要写入 cookie 并加密就选择随机生成 id
melkor
2023-03-01 15:40:59 +08:00
@Chad0000 直接用雪花成本也不算高,关键是一旦要 sharding 那就很痛苦了,成本太高
RICKEYGONG
2023-03-01 15:47:34 +08:00
Guid userId = new Guid();
leeraya
2023-03-01 15:52:56 +08:00
bigint 够够的
b821025551b
2023-03-01 15:53:26 +08:00
@melkor 雪花成本应该是最高的,在大部分引擎下,无序主键会导致查询性能降低,以及空间浪费
youisme
2023-03-01 15:57:23 +08:00
@b821025551b 雪花算法是有序的
afstyle
2023-03-01 16:03:16 +08:00
@b821025551b 建议你好好看看雪花 id 算法
Ashore
2023-03-01 16:08:18 +08:00
你离职了以后都不会有那么多的用户的。放心吧
cnbattle
2023-03-01 16:10:56 +08:00
推荐雪花 id , 需要注意的数 如果前端是 js ,json str 转 json 对象 数字 大于 17 位时会丢失精度 得前端或后端特殊处理下
karloku
2023-03-01 16:14:10 +08:00
字符串的索引性能不行, 作为主键还是用整型好

不管是 mongodb 的 ObjectId 还是 UUID 本质上也只是被表示为 16 进制的定长 bits, 在数据库里可以用 binary(12) 或者 binary(16) 存取. mysql8 里有直接用于转换字符串的函数 `UUID_TO_BIN()` / `BIN_TO_UUID()` 和生成用的 `UUID()` . postgres 则是直接支持 uuid 类型的字段, 支持在 sql 里用字符串进行写入和查询.
不需要满足可排序性的时候可以用 uuidv4. 需要满足可排序性的时候可以用 mongodb 的 ObjectId 和 128 位的 ulid.
litchinn
2023-03-01 16:16:29 +08:00
准确来说,雪花算法那个叫单调递增。
参与的有一个项目,最开始是自增,但是后面有个客户有个需求,他部署了两套系统,A 、B ,但是每天要将 B 系统的数据全部同步到 A ,然而这些数据里有关联 id ,于是只能改成雪花算法生成的 id ,bigint
也用过字符串类型的 id ,但是因为没办法单调递增且自己 debug 很不方便所以个人并不喜欢
目前使用雪花算法 id ,数据库 bigint 并且设置自增

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/920125

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX