自定义主键生成策略

写一篇关于数据库主键生成的文章,大家共同研究一下。

首先,确定应用场景。多个程序访问同一个数据库,每个程序生成的主键是不会重复的,那么数据也会相对独立。

其次,确定数据类型。数据库的主键,往往都采用数字做主键,但也有采用字符串的。

    个人理解,数据库对数字的定位速度要远高于字符串的定位速度,所以,优先选用数字作为主键。

再次,确定生成规则。生成规则为了不重复一般都是两种思路,一种是自增序列,另一种是随机散列。

    随机散列,具有代表性的就是UUID的生成策略,无论你怎么搞,每次都是全球唯一的主键值。

    自增序列,最常用的就是自增加一的方式,后来又被改进为高低值得方式,高位共享自增,低位独享自增,高低结合成为主键。


下面具体来介绍一下,我的想法:

整形数据,一般都是4字节的,表示的最大值是2147483647,一共就10个有效位,位数较少。

选用长整形数据,一般都是8字节的,表示的最大值是9223372036854775807,有19个有效位。

我们可以把这19位数,分成3个部分,一部分用来表示程序(或系统)的ID,一部分用来表示时间,另一部分表示自增序列。

    表示程序ID的部分,我们取高2位来表示,取值范围在[10,91]之间(扩展,最多再添加 [0,9] 这十个数进去),一般情况下,一个数据库能访问的程序也在80个以内了。

    表示时间的部分,我们把程序当前的时间,按照“yyMMddHHmmssSSS”的格式转成内容是数字的字符串(其中“S”表示毫秒,只取前两位,舍弃第三位,不足的补0占位)。

    表自增序列的部分,是一个自增序列,增量为1,范围在[0,999]之间。

一般情况下,同一个时间周期(10毫秒)不会产生超过1000个ID的数据,但是,在极端情况下有这种情况发生,所以,要求ID生产器保持上一次生成ID的时间,

如果同一个时间周期内,超量了,则把上一次的生成时间,向后推一个周期(10毫秒),在生成ID的时候,当前时间和上次生成时间做比较,

哪个大用哪个(用时间靠后的)。如果当前时间比上次生成时间大,并且大得超过一个周期(10毫秒),那么,重置自增序列的部分为0,这样保证了自增序列不会爆掉。


总体思路是:

1.程序ID,保证不同程序可以生成各自的主键;

2.时间序列,保证在时间上面的差异性,不同时间生成不同的ID;

3.自增序列,保证同一时间不同的主键,序列爆满、时间顺延。

4.先将上述三个部分转换成字符串,之后统一转换成长整形数字。


你可能感兴趣的:(数据库)