数据库生成友好id的策略的讨论

水牛叔叔 发布于 2014/09/18 01:52
阅读 344
收藏 2

  1. 在关系型数据库中,使用自增id是小应用常用的id策略,这种方法生成的id是比较友好的,但是在插入数据时,程序还要读取一次数据库才能获取id,而且这种方法对日后分库分表很不利
  2. 还有一种方法是用uuid作为id,这种方法非常简单,但是生成的id太长,很不友好

我觉得友好的id还是很必要,比方说qq号就很友好,电话号码就很友好,甚至短的(注册较早)的qq号还有特殊的商业价值...

欢迎大家讨论下数据库的id策略,怎样才能方便的生成友好的id

加载中
0
Lunar_Lin
Lunar_Lin
"但是在插入数据时,程序还要读取一次数据库才能获取id,"    每次自增2000, 每个单线程程序一次性拿2000的ID出来存内存里慢慢用, 用完再去找数据库要.    程序意外挂掉时, 也不过是跳跃了一些的id.   2000根据自己的业务量来定.
分库分表很不利, 我没理解你......   ID除以余数  很方便.  UUID 才可怕吧.
水牛叔叔
水牛叔叔
不是说id造成分库分表有问题,而是说分库分表后id的产生变得有问题
水牛叔叔
水牛叔叔
回复 @Lunar_Lin : 谢谢你参与讨论,我学到了新的方案
Lunar_Lin
Lunar_Lin
@水牛叔叔 sorry, 是他说的1.2
Lunar_Lin
Lunar_Lin
回复 @水牛叔叔 : 这个服务进程自己预留ID的方案是楼下南陌说的方案1.1的改良版本. id池表做个容灾. 应付新浪微播量级的都不会有什么问题. 按10个分布式服务, 2000*10已经很大很大了. 平常的网站用户ugc和评论的量级, 感觉 10 * 100 或者 1* 100 应该够了.
Lunar_Lin
Lunar_Lin
回复 @水牛叔叔 : uuid 样子看起来呗. 没什么. 个人觉得还是32/64位的uint看起来最像ID.
下一页
0
南陌
南陌
1.专门建一个库/表分配全局唯一的ID.
2.每张表划分ID区域.
3.错位分配
4.组合ID.
以上是针对MySQL数据库在分库分表情况下生成全局ID的一些西想法.具体的操作方法可以参考我的blog: http://chaubeau.github.io/blog/2014/06/10/mysql-shardingzai-gao-bing-fa-xia-de-quan-ju-idsheng-cheng/
水牛叔叔
水牛叔叔
方案1.2挺和我心意的
水牛叔叔
水牛叔叔
这个方法不错
Will_awokE
Will_awokE
blog的背景图大白腿不错。
0
h
hao5ang
UUID就行吧. QQ号虽然友好,估计不是主键.
0
水牛叔叔
水牛叔叔
@南陌@Lunar_Lin ,你们好。 我现在想取一批id保存到内存里,然后慢慢用,用完了再取,也不用做容灾,因为我每次取表里的最大id,然后根据这个id用程序生成后续的递增id。这批id我打算存在普通的容器里,比如List之类的,这样做只要考虑多线程同步的问题。你们觉得这个方法可行吗?
Lunar_Lin
Lunar_Lin
回复 @水牛叔叔 : 可行的. 如果 以一个线程为单位去拿id的. 连多线程互斥也不用考虑了. 我不明白你说的内存数据同步. 这里只考虑id的话 应该够了.
水牛叔叔
水牛叔叔
我想到了一个问题:分布式下,内存数据的同步也是问题,还是要一个集中的存储地方
返回顶部
顶部