V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
flyingfz
V2EX  ›  问与答

讨论下:大家是怎么设计数据库主键的

  •  
  •   flyingfz · 2015-05-12 15:41:25 +08:00 · 1648 次点击
    这是一个创建于 3488 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这里说的是关系型数据库。
    貌似大部分人的意见是:
    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 、 >= 、 <= 的效率怎么样,但我使用的情况,貌似没有性能瓶颈。
    或者,可能我孤陋寡闻,还有其他的问题。
    不知道大家怎么评价这种主键形式?
    大家又是怎么设计数据库主键的?

    2 条回复    2015-05-12 16:05:13 +08:00
    reeco
        1
    reeco  
       2015-05-12 15:51:32 +08:00
    flyingfz
        2
    flyingfz  
    OP
       2015-05-12 16:05:13 +08:00
    3ks,看来还是要科学上网啊。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3070 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 14:45 · PVG 22:45 · LAX 06:45 · JFK 09:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.