开发者社区> 问答> 正文

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

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

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

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

展开
收起
kun坤 2020-06-07 16:44:34 506 0
1 条回答
写回答
取消 提交回答
  • "但是在插入数据时,程序还要读取一次数据库才能获取id,"    每次自增2000, 每个单线程程序一次性拿2000的ID出来存内存里慢慢用, 用完再去找数据库要.    程序意外挂掉时, 也不过是跳跃了一些的id.   2000根据自己的业务量来定.
    分库分表很不利, 我没理解你......   ID除以余数  很方便.  UUID 才可怕吧.
    ######不是说id造成分库分表有问题,而是说分库分表后id的产生变得有问题######回复 @Lunar_Lin : 谢谢你参与讨论,我学到了新的方案######@水牛叔叔 sorry, 是他说的1.2######回复 @水牛叔叔 : 这个服务进程自己预留ID的方案是楼下南陌说的方案1.1的改良版本. id池表做个容灾. 应付新浪微播量级的都不会有什么问题. 按10个分布式服务, 200010已经很大很大了. 平常的网站用户ugc和评论的量级, 感觉 10 * 100 或者 1 100 应该够了.######回复 @水牛叔叔 : uuid 样子看起来呗. 没什么. 个人觉得还是32/64位的uint看起来最像ID.######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挺和我心意的######这个方法不错######blog的背景图大白腿不错。######UUID就行吧. QQ号虽然友好,估计不是主键.######@南陌@Lunar_Lin ,你们好。 我现在想取一批id保存到内存里,然后慢慢用,用完了再取,也不用做容灾,因为我每次取表里的最大id,然后根据这个id用程序生成后续的递增id。这批id我打算存在普通的容器里,比如List之类的,这样做只要考虑多线程同步的问题。你们觉得这个方法可行吗?######回复 @水牛叔叔 : 可行的. 如果 以一个线程为单位去拿id的. 连多线程互斥也不用考虑了. 我不明白你说的内存数据同步. 这里只考虑id的话 应该够了.######我想到了一个问题:分布式下,内存数据的同步也是问题,还是要一个集中的存储地方

    2020-06-07 16:44:38
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
DTCC 2022大会集锦《云原生一站式数据库技术与实践》 立即下载
阿里云瑶池数据库精要2022版 立即下载
2022 DTCC-阿里云一站式数据库上云最佳实践 立即下载