数据库 问个问题,怎么解决手机端程序生成主键冲突问题

piginzoo · 2012年06月22日 · 最后由 huacnlee 回复于 2012年06月26日 · 3688 次阅读

万能的坛,问个纠结的问题。

我们在做一个手机端 +rails 服务器的应用。

手机端用户创建的记录,需要主键值,如果用自增,将来传到服务器上,肯定会跟别的用户冲突。如果再加上外键关系,就乱上加乱。

我们考虑用 UUID,让各个用户的 id 不再一样,但是,UUID 是 char(36), 如果是 mysql 做主键会有性能问题,我们正在纠结这事,你们怎么解决的丫?

UUID 的问题: http://hi.baidu.com/thinkinginlamp/blog/item/c609d10979710e81d0581b60.html 对于InnoDB这种聚集主键类型的引擎来说,数据会按照主键进行排序,由于UUID的无序性,InnoDB会产生巨大的IO压力,此时不适合使用UUID做物理主键,可以把它作为逻辑主键,物理主键依然使用自增ID。

好吧,没有人跟帖,自己来解答一下吧: 首先解决 UUID 或者 GUID 是最好的解决办法,自增肯定是不行的: http://iphone2009.crowdvine.com/talk/presentation_file/5104/Grover_Syncing.pdf

第二,如果用 UUID,就不能建立主键,而只是建立一个索引了,因为唯一性(主键需要)会大大影响速度,UUID 本身就尽可能地保证唯一性了: http://kccoder.com/mysql/uuid-vs-int-insert-performance/

搞不清楚你的系统怎么设计的。。

#2 楼 @hooopo 其实很经典的一个问题,就是手机端创建了一个记录 A,又创建了记录 B,记录 A 外键关联到记录 B。然后 A 和 B 都要同步的服务器,然后别的手机端可以下载下来。这时候,使用 UUID,这样 A 和 B 的关联关系就可以保持住了。

基本上,我们就打算这样设计了,提供给大家做参考吧。

看着就是这个上传导入,下载导入的问题。。你这是怕手机创建记录的时候没联网么?

uuid 也不一定靠谱啊,比如有人伪造呢? 我建议手机归手机, web 归 web。 手机端建个索引项 ref。 手机同步到 web 的时候返回 web 端的 pk, 然后更新相应几列的 ref 。ref 为空则视为未同步列

#3 楼 @piginzoo 可以离线创建? 手机端的关联和服务器端的关联不需要有任何关系呀。

#4 楼 @bony 赞!就是支持离线的才出来的问题。

#5 楼 @clearJiang 恩,考虑过你说的方案,感觉具体实现时还是太复杂。 uuid 的重复我不太担心,它算法里包含了网卡,时间,还有 CPU 时钟序列等,重复概率是 170 亿分之一,我们的应用没有那么变态的严格的一致性要求,所以不太担心。

#6 楼 @hooopo 有关联的情况的,比如: 你发了一个图片上去,我下载下来了,插入到我的手机数据库表中, 然后,我断了网络。 然后,我对你的图片发表一个评论,这个时候,我在手机数据库中要创建这个评论记录和与图片记录的关联关系。 然后,我又联网了,我需要把我的这条评论记录同步到服务器上去。

我们现在面对的就是这样的一个场景。

客户端离线的时候对新建记录保存一个关系,同步到服务端后再把客户端关系转换成服务端关系,转换后回传到客户端更新状态。

这种方式如何?

#11 楼 @lanisle 我就是这个意思啊 客户端保存关系和同步状态 和什么 id 没一点关系

可以模仿 MongoDB ObjectId 的设计思路

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册