这里说的是关系型数据库。
貌似大部分人的意见是:
1. Int或者BigInt类型, 自增
2. Varchar 类型, guid
但是,
第一种情形,如果高并发的情况,可能会出现重复的id ,
第二种情形,guid倒不会重复,但数据量比较大的时候,插入的性能会降低。(因为主键是聚集索引,是有顺序的)。
同时,不论上面哪种情况,都浪费了主键作为聚集索引的优势,即,很多时候会有查询指定时间段内的需求,按道理用聚集索引是效率最好的,但上述两种方式都无法使用聚集索引。
所以,我在一些项目里是这样设计数据库主键的:
类型是 varchar(50) , 值,是通过代码生成一个字符串,类似:
150512153023000ca577185ca5540d7921208a9bf87bebb
即:DateTime.Now.ToString("yyMMddHHmmssfff")+ Guid.NewGuid().ToString("N")
共47位长度。
这样的话,比如要查找昨天的数据,我可以用:
where primarykey between
'150511000000000////////////////////////////////' and '150511235959999}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}'
至于为啥是 / 和 } ,这是因为在acsii码里,/比所有的数字和字符小,}比所有的数字和字符大。
但是,也有不好的地方:1.长度有点大,2.不确定这种字符串的between 、 >= 、 <= 的效率怎么样,但我使用的情况,貌似没有性能瓶颈。
或者,可能我孤陋寡闻,还有其他的问题。
不知道大家怎么评价这种主键形式?
大家又是怎么设计数据库主键的?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.