CN102880705A - 数据库主键生成装置和数据库主键生成方法 - Google Patents
数据库主键生成装置和数据库主键生成方法 Download PDFInfo
- Publication number
- CN102880705A CN102880705A CN2012103679640A CN201210367964A CN102880705A CN 102880705 A CN102880705 A CN 102880705A CN 2012103679640 A CN2012103679640 A CN 2012103679640A CN 201210367964 A CN201210367964 A CN 201210367964A CN 102880705 A CN102880705 A CN 102880705A
- Authority
- CN
- China
- Prior art keywords
- major key
- date
- database
- value
- primary key
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提供了一种数据库主键生成装置,包括:读取单元,读取预设的主键配置表,从主键配置表中获取数据中心的站点编号;主键生成单元,根据获取的站点编号读取主键分配表,获取主键分配表中记录的主键的最大值,根据主键的最大值得到当前可分配的主键的值,其中,主键包括数据中心的站点编号、生成主键的日期和流水号。根据本发明的技术方案,可获得高性能的数据库主键,使得主键既具有像业务编号一样直观易用的特点,又可支持分布式数据部署环境。本发明还提供一种数据库主键生成方法。
Description
技术领域
本发明涉及计算机技术领域,具体而言,涉及一种数据库主键生成装置和一种数据库主键生成方法。
背景技术
在软件系统开发中,如果需要利用数据库系统来存储和管理数据,就无法回避数据库主键的设计问题。好的数据库主键设计,具有高效、易用和可靠的特点。目前,数据库主键的主流生成方法包括数据库自增字段方法和GUID(全局统一标识符)方法。自增字段方法由数据库自增类型字段来实现,由数据库自动生成和维护,并确保唯一性。GUID方法是利用机器硬件的唯一性特征(例如网卡MAC地址的唯一性)并结合生成时间,来确保在全球范围内不会出现重复的数值。
自增字段通常数据类型为Int或BigInt,存储空间小且索引效率高。但使用时必须先插入数据库,才能确定ID值,这会造成编程时的很多不便。另外,自增字段的形式就是一个1、2、3、4这样的序列,没有任何实际意义,很不直观易用。而GUID方式生成的ID,如果按字符串方式存储,需要占用36个字节。如果按数据库特定类型存储,例如SqlServer的uniqueidentifier类型,需要占用16个字节,不仅占用空间大,而且索引的效率远较Int类型差。索引效率差一方面是因为索引键较长,另一方面是因为GUID本身是无序的,无法保证顺序生成的记录自然排序。COMB主键设计方案是对GUID无序问题的改进,方法是保留GUID的前10个字节,而用后6个字节表示GUID生成的时间,尽管做了这样的改进,COMB主键方案的性能仍然远较Int类型低。
另一方面,一些传统的应用往往选择业务含义唯一的字段作为主键,例如账单编号Bill200808080001(编号方式为前缀+YYYYMMDD+流水号)。这种形式的ID,远比毫无业务含义的自增整数和随机的GUID更为直观易用。ID如果做不到直观易用,会增大使用难度及维护成本。不过在今天,用业务字段做主键的方案已不被推荐,因为业务字段可能发生修改,而一旦修改主键将会带来一系列麻烦的问题。
最后,随着云计算环境的普及,即便在企业的私有云环境中也需要考虑多数据中心分布的问题。主键设计是否支持分布式部署?是否支持数据迁移?也是需要解决的问题。显然,GUID方案可以保证分布式环境下主键依然唯一,但自增字段方案就无法满足要求。
因此,需要一种数据库主键生成技术,使得数据库主键具有像业务编号那样直观易用的特点,并可支持分布式数据部署环境。
发明内容
本发明正是基于上述问题,提出了一种数据库主键生成技术,可生成高性能数据库主键,使得数据库主键具有像业务编号那样直观易用的特点,并可支持分布式数据部署环境。
有鉴于此,根据本发明的一个方面,提供了一种数据库主键生成装置,包括:读取单元,读取预设的主键配置表,从所述主键配置表中获取数据中心的站点编号;主键生成单元,根据获取的站点编号读取主键分配表,获取所述主键分配表中记录的主键的最大值,根据所述主键的最大值得到当前可分配的主键的值,其中,所述主键包括数据中心的站点编号、生成主键的日期和流水号。
由于主键包含数据中心的站点编号信息,因此,该数据库主键可支持分布式数据部署环境,另外该主键包括站点编号、生成日期和流水号,且流水号按顺序分配,因此,主键具有直观易用的特点。
在上述技术方案中,优选的,所述读取单元还用于从所述主键配置表中读取默认分配数量;所述数据库主键生成装置还包括:预分配单元,从数据库中预先获取所述默认分配数量的主键,并将所述默认分配数量的主键放入内存中;所述主键生成单元还用于将所述主键分配表中所述主键的最大值与所述内存中的主键的最小值同步,在分配所述主键时,调用存储过程,将所述内存中的主键的最小值递增,以得到所述当前可分配的主键的值。
为了避免每次分配主键时都需要与数据库的网络交互,在该技术方案中,预先从数据库中申请一定数量的主键值并缓存在内存中,只有当内存中的主键值完全被分配时,才与数据库进行下一次的交互。这样,如果内存中有可用主键值,则分配一个主键值的过程可瞬时完成,这极大地减少了网络及数据库的开销。
在上述技术方案中,优选的,所述主键生成单元包括分解子单元,从所述主键的最大值中分解出日期信息;分配子单元,在判断出所述日期信息为当前日期及当前日期以前的日期时,将包含当前日期信息(今天)的主键的值作为所述当前可分配的主键的值。
主键包含日期信息并且限定了每天可分配的主键值的数量,因此,主键分配表中主键的最大值,是指当前第一个可用的主键值(每次分配时可能是几千个主键值,但第一个可分配的主键值就是该最大值,然后依次分配),如果该最大值的日期是昨天的,说明包含今天日期的主键值还没有开始分配,那么就可将今天日期对应的主键值进行分配,如果今天对应的主键值还不够分配,就分配与明天对应的主键值。
在上述技术方案中,优选的,所述分配子单元还用于在判断出所述日期信息等于所述当前日期,且包含所述当前日期的主键的值已全被分配时,将包含当前日期以后的日期信息的主键的值作为所述当前可分配的主键的值。即通过提前透支使用未来可用的主键值,以应对当天分配主键数量巨大的情况。
如果该最大值是今天可分配的主键值中的最后一个,但不够分配,那么可分配与明天甚至是后天对应的主键值。
在上述任一技术方案中,优选的,所述主键的类型包括整数类型。利用整数型,可以使主键存储空间小且索引效率高,可进一步提高主键的性能。
根据本发明的另一方面,还提供了一种数据库主键生成方法,包括:步骤202,读取预设的主键配置表,从所述主键配置表中获取数据中心的站点编号;步骤204,根据获取的站点编号读取主键分配表,获取所述主键分配表中记录的主键的最大值,根据所述主键的最大值得到当前可分配的主键的值,其中,所述主键包括数据中心的站点编号、生成主键的日期和流水号。
由于主键包含数据中心的站点编号信息,因此,该数据库主键可支持分布式数据部署环境,另外该主键包括站点编号、生成日期和流水号,且流水号按顺序分配,因此,主键具有直观易用的特点。
在上述技术方案中,优选的,所述步骤202还包括:从所述主键配置表中还读取默认分配数量,从数据库中预先获取所述默认分配数量的主键,并将所述默认分配数量的主键放入内存中;所述步骤204还包括:将所述主键分配表中所述主键的最大值与所述内存中的主键的最小值同步,在分配所述主键时,调用存储过程,将所述内存中的主键的最小值递增,以得到所述当前可分配的主键的值。
为了避免每次分配主键时都需要与数据库的网络交互,在该技术方案中,预先从数据库中申请一定数量的主键值并缓存在内存中,只有当内存中的主键值完全被分配时,才与数据库进行下一次的交互。这样,如果内存中有可用主键值,则分配一个主键值的过程可瞬时完成,这极大地减少了网络及数据库的开销。
在上述技术方案中,优选的,所述步骤204还包括:从所述主键的最大值中分解出日期信息;若判断出所述日期信息为当前日期及当前日期以前的日期,则将包含当前日期信息的主键的值作为所述当前可分配的主键的值。
主键包含日期信息并且限定了每天可分配的主键值的数量,因此,主键分配表中主键的最大值,是指当前第一个可用的主键值(每次分配时可能是几千个主键值,但第一个可分配的主键值就是该最大值,然后依次分配),如果该最大值的日期是昨天的,说明包含今天日期的主键值还没有开始分配,那么就可将今天日期对应的主键值进行分配,如果今天对应的主键值还不够分配,就分配与明天对应的主键值。
在上述技术方案中,优选的,若判断出所述日期信息等于所述当前日期,且包含所述当前日期的主键的值已全被分配,则将包含当前日期以后的主键的值作为所述当前可分配的主键的值。即通过提前透支使用未来可用的主键值,以应对当天分配主键数量巨大的情况。
如果该最大值是今天可分配的主键值中的最后一个,但不够分配,那么可分配与明天甚至是后天对应的主键值。
在上述任一技术方案中,优选的,所述主键的类型包括整数类型。利用整数型,可以使主键存储空间小且索引效率高,可进一步提高主键的性能。
根据本发明的技术方案,可获得高性能的数据库主键,使得主键既具有像业务编号一样直观易用的特点,又可支持分布式数据部署环境。
附图说明
图1示出了根据本发明的实施例的数据库主键生成装置的框图;
图2示出了根据本发明的一个实施例的数据库主键生成方法的流程图;
图3示出了根据本发明的又一实施例的数据库主键生成方法的流程图;
图4示出了根据本发明的实施例的中间层的Low-High算法的流程图。
具体实施方式
为了能够更清楚地理解本发明的上述目的、特征和优点,下面结合附图和具体实施方式对本发明进行进一步的详细描述。
在下面的描述中阐述了很多具体细节以便于充分理解本发明,但是,本发明还可以采用其他不同于在此描述的其他方式来实施,因此,本发明并不限于下面公开的具体实施例的限制。
图1示出了根据本发明的实施例的数据库主键生成装置的框图。
如图1所示,根据本发明的实施例的数据库主键生成装置100包括:读取单元102,读取预设的主键配置表,从主键配置表中获取数据中心的站点编号;主键生成单元104,根据获取的站点编号读取主键分配表,获取主键分配表中记录的主键的最大值,根据主键的最大值得到当前可分配的主键的值,其中,主键包括数据中心的站点编号、生成主键的日期和流水号。
由于主键包含数据中心的站点编号信息,因此,该数据库主键可支持分布式数据部署环境,另外该主键包括站点编号、生成日期和流水号,且流水号按顺序分配,因此,主键具有直观易用的特点。
在上述技术方案中,优选的,读取单元102还用于从主键配置表中读取默认分配数量;数据库主键生成装置100还包括:预分配单元106,从数据库中预先获取默认分配数量的主键,并将默认分配数量的主键放入内存中;主键生成单元104还用于将主键分配表中主键的最大值与内存中的主键的最小值同步,在分配主键时,调用存储过程,将内存中的主键的最小值递增,以得到当前可分配的主键的值。
为了避免每次分配主键时都需要与数据库的网络交互,在该技术方案中,预先从数据库中申请一定数量的主键值并缓存在内存中,只有当内存中的主键值完全被分配时,才与数据库进行下一次的交互。这样,如果内存中有可用主键值,则分配一个主键值的过程可瞬时完成,这极大地减少了网络及数据库的开销。
在上述技术方案中,优选的,主键生成单元104包括分解子单元1042,从主键的最大值中分解出日期信息;分配子单元1044,在判断出日期信息为当前日期及当前日期以前的日期时,将包含当前日期信息(今天)的主键的值作为当前可分配的主键的值。
主键包含日期信息并且限定了每天可分配的主键值的数量,因此,主键分配表中主键的最大值,是指当前第一个可用的主键值(每次分配时可能是几千个主键值,但第一个可分配的主键值就是该最大值,然后依次分配),如果该最大值的日期是昨天的,说明包含今天日期的主键值还没有开始分配,那么就可将今天日期对应的主键值进行分配,如果今天对应的主键值还不够分配,就分配与明天对应的主键值。
在上述技术方案中,优选的,分配子单元1044还用于在判断出日期信息等于当前日期,且包含当前日期的主键的值已全被分配时,将包含当前日期以后的日期信息的主键的值作为当前可分配的主键的值。即通过提前透支使用未来可用的主键值,以应对当天分配主键数量巨大的情况。
如果该最大值是今天可分配的主键值中的最后一个,但不够分配,那么可分配与明天甚至是后天对应的主键值。
在上述任一技术方案中,优选的,主键的类型包括高效的整数类型。利用整数型,可以使主键存储空间小且索引效率高,可进一步提高主键的性能。
图2示出了根据本发明的一个实施例的数据库主键生成方法的流程图。
如图2所示,根据本发明的实施例的数据库主键生成方法,包括:步骤202,读取预设的主键配置表,从主键配置表中获取数据中心的站点编号;步骤204,根据获取的站点编号读取主键分配表,获取主键分配表中记录的主键的最大值,根据主键的最大值得到当前可分配的主键的值,其中,主键包括数据中心的站点编号、生成主键的日期和流水号。
由于主键包含数据中心的站点编号信息,因此,该数据库主键可支持分布式数据部署环境,另外该主键包括站点编号、生成日期和流水号,且流水号按顺序分配,因此,主键具有直观易用的特点。
在上述技术方案中,优选的,步骤202还可以包括:从主键配置表中还读取默认分配数量,从数据库中预先获取默认分配数量的主键,并将默认分配数量的主键放入内存中;步骤204还可以包括:将主键分配表中主键的最大值与内存中的主键的最小值同步,在分配主键时,调用存储过程,将内存中的主键的最小值递增,以得到当前可分配的主键的值。
为了避免每次分配主键时都需要与数据库的网络交互,在该技术方案中,预先从数据库中申请一定数量的主键值并缓存在内存中,只有当内存中的主键值完全被分配时,才与数据库进行下一次的交互。这样,如果内存中有可用主键值,则分配一个主键值的过程可瞬时完成,这极大地减少了网络及数据库的开销。
在上述技术方案中,优选的,步骤204还可以包括:从主键的最大值中分解出日期信息;若判断出日期信息为当前日期及当前日期以前的日期,则将包含当前日期信息的主键的值作为当前可分配的主键的值。
主键包含日期信息并且限定了每天可分配的主键值的数量,因此,主键分配表中主键的最大值,是指当前第一个可用的主键值(每次分配时可能是几千个主键值,但第一个可分配的主键值就是该最大值,然后依次分配),如果该最大值的日期是昨天的,说明包含今天日期的主键值还没有开始分配,那么就可将今天日期对应的主键值进行分配,如果今天对应的主键值还不够分配,就分配与明天对应的主键值。
在上述技术方案中,优选的,若判断出日期信息等于当前日期,且包含当前日期的主键的值已全被分配,则将包含当前日期以后的主键的值作为当前可分配的主键的值。即通过提前透支使用未来可用的主键值,以应对当天分配主键数量巨大的情况。
如果该最大值是今天可分配的主键值中的最后一个,但不够分配,那么可分配与明天甚至是后天对应的主键值。
在上述任一技术方案中,优选的,主键的类型包括高效的整数类型。利用整数型,可以使主键存储空间小且索引效率高,可进一步提高主键的性能。
接下来结合图3和图4来详细说明根据本发明的实施例。
一.ID编码方案(本实施例中的ID即主键值)
高性能的数据库主键方案要求ID使用整数类型,本专利的创新之处在于将三类不同的信息,通过位移的方式包含在一个整型ID中。依据使用64位长整数还是32位整数,对ID的编码方案如下:
1.使用BigInt整数类型的编码方案,如下表所示:
BigInt整数类型在SQLServer数据库中占用8个字节,可表达2的63次方大小,10进制格式下可表达19位长度的数字。上例的编码方案使用了其中的17位。
各段的含义具体说明如下:
1)数据中心段:SiteID,即数据中心的站点编号,长度为2位。由于首位不能选择0,因此SiteID的编号为10~99,即一共可以支持90个站点。
2)日期段:生成ID的日期,编码格式为YYYYMMDD。
3)流水段:从0开始顺序加1的流水号,7位长度可以支持每天1000万个流水号。
按上述编码方案生成的主键实例如下:
1)10200808080000000:这是编号10的站点在2008年8月8号生成的第1个流水ID。
2)11201203300009999:这是编号11的站点在2012年3月30号生成的第1万个流水ID。
依据实际系统的不同,可以对各段的长度进行适当调整。
2.使用Int整数类型的编码方案,如下表所示:
Int整数类型在SQLServer数据库中占用4个字节,可表达2的31次方大小,10进制格式下可表达10位长度的数字。由于整体长度有限,3位长度的流水号只支持每天1000个流水号,这只适用于小型系统。不过在应用中并不会出现无法分配ID的情况,因为本发明所采用的流水号溢出策略允许今天生成的ID透支占用明天的ID号。
二.ID分配算法
入口参数为AllocCount,代表本次需要分配的ID数量。出口参数为StartSN,代表返回的第1个可用的ID。本次分配的ID范围为StartSN到StartSN+AllocCount–1。
ID分配算法参见图3,在步骤302,读取主键配置表,获取主键配置表中数据中心的站点号(SiteID)和默认分配数量(IntervalNum,该默认分配数量为内存中主键池的容量)。该主键配置表(ID配置表)的形式可如下表所示:
SiteID | IntervalNum |
10 | 100000 |
该ID配置表只有一条记录,存储SiteID和IntervalNum。IntervalNum代表默认的ID分配数量,默认设置为10万。若调用分配ID的算法,则参数AllocAccount为-1,则按IntervalNum进行分配。
在步骤304,若检查出站点号不存在,则报异常,终止该流程。
在步骤306,读取主键分配表,获取最大主键值对应的记录。
主键分配表可如下表所示:
SerialDate | StartSN |
2011-08-01 00:00:00.000 | 10201108010148100 |
2011-08-02 00:00:00.000 | 10201108020010700 |
2011-08-03 00:00:00.000 | 10201108030001300 |
2011-08-04 00:00:00.000 | 10201108040106200 |
2011-08-05 00:00:00.00 | 10201108050104900 |
2011-08-06 00:00:00.000 | 10201108060059700 |
2011-08-07 00:00:00.000 | 10201108070020600 |
2011-08-08 00:00:00.000 | 10201108080020600 |
从上表中可以看出,主键分配表(ID分配表)记录每天的ID分配情况,StartSN代表当天下一个可分配的ID号。从上面的示例可知,在2011年8月1日这天,共分配了14万8100个ID;而在2011年8月3日这天,仅仅只分配了1300个ID。最后一条记录即最大主键值对应的记录。
在步骤308,分解出该最大主键记录包含的日期信息,与今日(当前日期)做比较。
在步骤310,若为空或小于今日,则说明尚未生成当天的分配记录,流水号从0开始分配当天的主键值,并将分配的最大主键值加1插入到主键分配表中。假设今天的日期是2011-8-9,发现上表中最大主键值包含的日期信息(2011-8-8)小于今日,则说明今天的主键值还未分配,因此,流水号从0开始分配当天的主键值,假设分配了200个,那么第200个的主键值为10201108090000199,将该主键值加1插入主键分配表中,说明当天下一个可用的主键值为10201108090000200。
在步骤312,若已用完当天的主键值,则需要透支未来的主键值日期并顺序后延,生成对应的分配记录插入到主键分配表中。
流水号溢出处理策略:
以17位的ID编码方案为例,每天共有1千万个ID供分配。如果今天1千万个ID均已分配出去,继续分配将导致流水号溢出,进位到日期段部分。计算的结果,相当于在今天透支使用明天的ID号。如果明天的1千万个ID又被全部用掉,则继续透支使用下一天的ID号。以此类推。一旦流水号溢出情况发生,则ID分配表中除了有当天的分配记录外,还会增加连续几天的分配记录。
另一方面,在流水号溢出情况发生后,如果分配ID的速率下降,则可能会连续几天沿用某天的可用ID号,直至时间推移到需要产生新的ID分配记录为止。
举例说明如下:
假设8月1号有巨大的ID分配需求,共需2千5百万个ID,则在8月1号当天就会生成8月1号、8月2号和8月3号三条ID分配记录。如果8月2号和8月3号都只需要分配1百万个ID,那么分配ID时都会从8月3号剩下的5百万个可用ID中分配。当8月3号结束的时候,会剩下3百万个ID没有使用。当8月4号来临的时候,分配的节奏就将再次同步,会在ID分配表中生成8月4号的分配记录并开始正常的分配过程。
在步骤314,若不是步骤310和步骤312的情况,则直接对找到的最大主键记录递增主键值,新的主键值代表对应日期下一个可分配的主键值。在上面的示例中,假设当天还需分配50个主键值,由于当天的主键值还未用完,而当天下一个可用的主键值为10201108090000200,那么在分配主键值时,可从10201108090000200递增,分配的最后一个主键值为10201108090000249。
下面说明中间层的Low-High算法:
如果每个ID的分配都需要一次与数据库的网络交互,查找ID分配表,走一遍ID分配算法的话,那肯定会存在性能问题。本发明在中间层提供统一的IDGenerator类,内部通过Low-High算法实现高效的ID分配过程。该中间层的Low-High算法可参见图4。
如图4所示,ID分配池的管理只需要LowID和HighID两个整型变量,在初始时,两个变量的值为零,当从数据库中申请到默认分配数量的主键值时,LowID的值被赋予该默认分配数量主键值中的最小值,HighID的值被赋予该默认分配数量主键值中的最大值。
在步骤402,在分配主键值时,判断LowID是否小于HighID,若是,则进入步骤404,若否,说明内存ID分配池中的主键已被分配完,进入步骤406。
在步骤404,LowID比HighID小,说明主键值还未分配完,可分配内存ID分配池中对应的主键值,在递增时,直接进入步骤410,每递增一个,返回一个LowID的值。若分配完,则进入步骤406。
在步骤406,调用存储过程实现ID分配算法。
在步骤408,初始化ID分配池,使LowID的值与主键分配表中当天下一个可用的主键值保持同步,HighID的值为当天下一个可用的主键值加上默认分配数量(在本实施例中为10万)。
中间层的IDGenerator调用存储过程时,传递参数AllocAccount=-1,这会使得ID分配算法使用ID配置表中的默认步长来作为一次性分配的ID数量。在主键配置表中,IntervalNum的默认值为10万,这意味着内存中ID分配池的大小最大为10万个。IDGenerator每次分配一个ID,仅需要把LowID指针加1即可,分配可瞬时完成,毫无开销。只有当LowID增长到等于HighID时,也就是池中10万个ID全部都分配掉了,才会触发一次与数据库的交互,请求从数据库分配新的10万个ID。
在本发明的中间层的数据库主键生成装置中引入Low-High算法可带来显著的性能优势:
1.ID分配池的大小可以通过ID配置表进行配置,默认可容纳例如10万个ID。
2.如果ID分配池中有可用ID,则分配一个ID的过程可瞬时完成。因此,只有当10万个ID全部分配完毕,需要重新初始化ID池时,才会有一次与数据库的交互,这极大地减少了网络及数据库的开销。
3.ID池的管理只需要LowID和HighID两个整型变量,无须将各个实际的ID放置到池中,几乎没有额外的开销。
下面说明ID分配的事务管理策略。
ID分配算法需要包装在独立的事务中,不能随外部调用者的事务回滚。因为ID的分配过程,就是一个将StartSN即下一个可用ID不断加大的过程,这个过程不可逆。如果StartSN随当前事务回滚,则可能出现StartSN所指示的ID值已经被其它没有发生回滚的事务用掉了的情况,这就会导致ID分配错乱,出现数据库主键重复的问题。
在中间层很容易实现ID分配算法并包装在独立的事务中,但需要考虑存储过程也存在ID分配需求的情况,ID分配算法需要能被存储过程所调用。如果将ID分配算法封装在普通的存储过程中,那么在SqlServer这样的数据库系统中会有问题,因为存储过程无法定义自治事务,其事务环境只能与外部调用者相同。解决方案是将ID分配算法包装到CLR存储过程中,利用CLR存储过程来实现自治事务。
以上结合附图详细说明了根据本发明的技术方案,本发明主要在三个方面取得了突出的技术效果:
1)高性能
高性能体现在两个层面,一是数据库主键生成装置自身具备高性能,二是生成的主键在数据库系统层面具备高性能。数据库主键生成装置的主控算法位于中间层,默认情况下10万个ID分配都是在内存中瞬时完成。只有内存中10万个ID全部分配完毕,才需要有一次与数据库的交互,重新初始化ID池。ID分配算法用存储过程实现,时间在2毫秒以内。数据库系统层面的高性能体现在三个方面:
首先,ID以BigInt类型存储,这比GUID方式占用磁盘空间少了一半。ID除了用做数据库主键外,还被大量用做数据库外键。在真实的ERP软件系统中,此项改进就可减少30%以上的磁盘空间占用。同时,数据库IO的效率就会得到有效提高。
其次,整数类型的索引效率远较字符串类型高,因为索引键长度小且无须逐个字符进行比较。这是性能方面极为关键的一项特性。
最后,BigInt方式生成的ID是有序的,也有利于提高索引的效率。
2)直观易用
通过ID编码方案,让整数形式的ID,包含了日期和流水号的信息。这种形式的ID,与业务编号类似,具备直观易用的特点,可以减轻使用及维护的代价。
3)支持分布式部署
如果系统是由多个分布式部署的数据中心构成,或者存在数据迁移及集成的需求,本发明可以保证分布式环境下的ID唯一性。让整数形式的ID,具备GUID全局唯一的效果。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (10)
1.一种数据库主键生成装置,其特征在于,包括:
读取单元,读取预设的主键配置表,从所述主键配置表中获取数据中心的站点编号;
主键生成单元,根据获取的站点编号读取主键分配表,获取所述主键分配表中记录的主键的最大值,根据所述主键的最大值得到当前可分配的主键的值,其中,所述主键包括数据中心的站点编号、生成主键的日期和流水号。
2.根据权利要求1所述的数据库主键生成装置,其特征在于,所述读取单元还用于从所述主键配置表中读取默认分配数量;
所述数据库主键生成装置还包括:预分配单元,从数据库中预先获取所述默认分配数量的主键,并将所述默认分配数量的主键放入内存中;
所述主键生成单元还用于将所述主键分配表中所述主键的最大值与所述内存中的主键的最小值同步,在分配所述主键时,调用存储过程,将所述内存中的主键的最小值递增,以得到所述当前可分配的主键的值。
3.根据权利要求1所述的数据库主键生成装置,其特征在于,所述主键生成单元包括分解子单元,从所述主键的最大值中分解出日期信息;
分配子单元,在判断出所述日期信息为当前日期及当前日期以前的日期时,将包含当前日期信息的主键的值作为所述当前可分配的主键的值。
4.根据权利要求3所述的数据库主键生成装置,其特征在于,所述分配子单元还用于在判断出所述日期信息等于所述当前日期,且包含所述当前日期的主键的值已全被分配时,将包含当前日期以后的日期信息的主键的值作为所述当前可分配的主键的值。
5.根据权利要求1至4中任一项所述的数据库主键生成装置,其特征在于,所述主键的类型包括整数类型。
6.一种数据库主键生成方法,其特征在于,包括:
步骤202,读取预设的主键配置表,从所述主键配置表中获取数据中心的站点编号;
步骤204,根据获取的站点编号读取主键分配表,获取所述主键分配表中记录的主键的最大值,根据所述主键的最大值得到当前可分配的主键的值,其中,所述主键包括数据中心的站点编号、生成主键的日期和流水号。
7.根据权利要求6所述的数据库主键生成方法,其特征在于,所述步骤202还包括:从所述主键配置表中读取默认分配数量,从数据库中预先获取所述默认分配数量的主键,并将所述默认分配数量的主键放入内存中;
所述步骤204还包括:将所述主键分配表中所述主键的最大值与所述内存中的主键的最小值同步,在分配所述主键时,调用存储过程,将所述内存中的主键的最小值递增,以得到所述当前可分配的主键的值。
8.根据权利要求6所述的数据库主键生成方法,其特征在于,所述步骤204还包括:从所述主键的最大值中分解出日期信息;
若判断出所述日期信息为当前日期及当前日期以前的日期,则将包含当前日期信息的主键的值作为所述当前可分配的主键的值。
9.根据权利要求8所述的数据库主键生成方法,其特征在于,若判断出所述日期信息等于所述当前日期,且包含所述当前日期的主键的值已全被分配,则将包含当前日期以后的日期信息的主键的值作为所述当前可分配的主键的值。
10.根据权利要求6至9中任一项所述的数据库主键生成方法,其特征在于,所述主键的类型包括整数类型。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210367964.0A CN102880705B (zh) | 2012-09-28 | 2012-09-28 | 数据库主键生成装置和数据库主键生成方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210367964.0A CN102880705B (zh) | 2012-09-28 | 2012-09-28 | 数据库主键生成装置和数据库主键生成方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102880705A true CN102880705A (zh) | 2013-01-16 |
CN102880705B CN102880705B (zh) | 2015-09-02 |
Family
ID=47482031
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201210367964.0A Active CN102880705B (zh) | 2012-09-28 | 2012-09-28 | 数据库主键生成装置和数据库主键生成方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102880705B (zh) |
Cited By (21)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104765789A (zh) * | 2015-03-24 | 2015-07-08 | 深圳祥云信息科技有限公司 | 一种数据库主键的生成方法和装置 |
CN104809222A (zh) * | 2015-04-30 | 2015-07-29 | 北京奇艺世纪科技有限公司 | 一种id生成方法及装置 |
CN104915353A (zh) * | 2014-03-13 | 2015-09-16 | 中国电信股份有限公司 | 分布式数据库下全局主键生成方法和系统 |
CN105072160A (zh) * | 2015-07-17 | 2015-11-18 | 联动优势科技有限公司 | 一种流水号生成方法、装置及服务器 |
CN105447183A (zh) * | 2015-12-12 | 2016-03-30 | 天津南大通用数据技术股份有限公司 | Mpp架构数据库集群序列系统及序列管理方法 |
CN105488215A (zh) * | 2015-12-12 | 2016-04-13 | 天津南大通用数据技术股份有限公司 | Mpp架构数据库集群序列系统及序列管理方法 |
CN105608165A (zh) * | 2015-12-21 | 2016-05-25 | 用友网络科技股份有限公司 | 一种分布式数据库主键生成的方法和系统 |
CN105630991A (zh) * | 2015-12-25 | 2016-06-01 | 北京奇虎科技有限公司 | Id自动生成方法及装置 |
CN105808559A (zh) * | 2014-12-29 | 2016-07-27 | 深圳市金蝶中间件有限公司 | 处理数据冲突的方法及装置 |
CN107133285A (zh) * | 2017-04-18 | 2017-09-05 | 北京北信源软件股份有限公司 | 一种分布式主键生成方法与装置 |
CN107247734A (zh) * | 2017-05-05 | 2017-10-13 | 上海斐讯数据通信技术有限公司 | 一种分布式数据库主键生成方法及系统 |
CN108256019A (zh) * | 2018-01-09 | 2018-07-06 | 顺丰科技有限公司 | 数据库主键生成方法、装置、设备及其存储介质 |
CN108694218A (zh) * | 2017-04-12 | 2018-10-23 | 大唐移动通信设备有限公司 | 一种数据写入及读取的方法和装置 |
CN109165256A (zh) * | 2017-06-28 | 2019-01-08 | 阿里巴巴集团控股有限公司 | 一种配置数据中心的方法和系统 |
CN109241177A (zh) * | 2018-07-12 | 2019-01-18 | 四川大学 | 一种适用于分布式系统的数据库主键生成方法 |
CN109241193A (zh) * | 2018-09-26 | 2019-01-18 | 联想(北京)有限公司 | 分布式数据库的处理方法和装置,及服务器集群 |
CN109582666A (zh) * | 2018-09-29 | 2019-04-05 | 阿里巴巴集团控股有限公司 | 数据主键生成方法、装置、电子设备及存储介质 |
CN110109912A (zh) * | 2018-01-15 | 2019-08-09 | 北京京东尚科信息技术有限公司 | 一种标识符生成方法和装置 |
CN110334092A (zh) * | 2019-06-14 | 2019-10-15 | 福建天泉教育科技有限公司 | 分布式id生成方法、存储介质 |
CN110825737A (zh) * | 2019-10-18 | 2020-02-21 | 支付宝(杭州)信息技术有限公司 | 索引创建和数据查询方法、装置及设备 |
CN111708831A (zh) * | 2020-05-12 | 2020-09-25 | 北京奇艺世纪科技有限公司 | 全局主键生成方法、装置 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101533414A (zh) * | 2009-04-15 | 2009-09-16 | 阿里巴巴集团控股有限公司 | 一种数据库记录唯一标识符生成的方法及装置 |
CN101661509A (zh) * | 2009-09-29 | 2010-03-03 | 金蝶软件(中国)有限公司 | 一种生成数据库表主键字段的方法及装置 |
CN102156717A (zh) * | 2011-03-25 | 2011-08-17 | 中国有色矿业集团有限公司 | 一种将实体对象映射到数据库中的方法及装置 |
CN102419754A (zh) * | 2010-09-27 | 2012-04-18 | 金蝶软件(中国)有限公司 | Etl中数据主键号的生成方法及计数器 |
-
2012
- 2012-09-28 CN CN201210367964.0A patent/CN102880705B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101533414A (zh) * | 2009-04-15 | 2009-09-16 | 阿里巴巴集团控股有限公司 | 一种数据库记录唯一标识符生成的方法及装置 |
CN101661509A (zh) * | 2009-09-29 | 2010-03-03 | 金蝶软件(中国)有限公司 | 一种生成数据库表主键字段的方法及装置 |
CN102419754A (zh) * | 2010-09-27 | 2012-04-18 | 金蝶软件(中国)有限公司 | Etl中数据主键号的生成方法及计数器 |
CN102156717A (zh) * | 2011-03-25 | 2011-08-17 | 中国有色矿业集团有限公司 | 一种将实体对象映射到数据库中的方法及装置 |
Cited By (24)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104915353B (zh) * | 2014-03-13 | 2018-03-23 | 中国电信股份有限公司 | 分布式数据库下全局主键生成方法和系统 |
CN104915353A (zh) * | 2014-03-13 | 2015-09-16 | 中国电信股份有限公司 | 分布式数据库下全局主键生成方法和系统 |
CN105808559A (zh) * | 2014-12-29 | 2016-07-27 | 深圳市金蝶中间件有限公司 | 处理数据冲突的方法及装置 |
CN104765789A (zh) * | 2015-03-24 | 2015-07-08 | 深圳祥云信息科技有限公司 | 一种数据库主键的生成方法和装置 |
CN104809222A (zh) * | 2015-04-30 | 2015-07-29 | 北京奇艺世纪科技有限公司 | 一种id生成方法及装置 |
CN104809222B (zh) * | 2015-04-30 | 2018-04-10 | 北京奇艺世纪科技有限公司 | 一种id生成方法及装置 |
CN105072160A (zh) * | 2015-07-17 | 2015-11-18 | 联动优势科技有限公司 | 一种流水号生成方法、装置及服务器 |
CN105447183A (zh) * | 2015-12-12 | 2016-03-30 | 天津南大通用数据技术股份有限公司 | Mpp架构数据库集群序列系统及序列管理方法 |
CN105488215A (zh) * | 2015-12-12 | 2016-04-13 | 天津南大通用数据技术股份有限公司 | Mpp架构数据库集群序列系统及序列管理方法 |
CN105608165A (zh) * | 2015-12-21 | 2016-05-25 | 用友网络科技股份有限公司 | 一种分布式数据库主键生成的方法和系统 |
CN105630991A (zh) * | 2015-12-25 | 2016-06-01 | 北京奇虎科技有限公司 | Id自动生成方法及装置 |
CN105630991B (zh) * | 2015-12-25 | 2019-11-01 | 北京奇虎科技有限公司 | Id自动生成方法及装置 |
CN108694218A (zh) * | 2017-04-12 | 2018-10-23 | 大唐移动通信设备有限公司 | 一种数据写入及读取的方法和装置 |
CN107133285A (zh) * | 2017-04-18 | 2017-09-05 | 北京北信源软件股份有限公司 | 一种分布式主键生成方法与装置 |
CN107247734A (zh) * | 2017-05-05 | 2017-10-13 | 上海斐讯数据通信技术有限公司 | 一种分布式数据库主键生成方法及系统 |
CN109165256A (zh) * | 2017-06-28 | 2019-01-08 | 阿里巴巴集团控股有限公司 | 一种配置数据中心的方法和系统 |
CN108256019A (zh) * | 2018-01-09 | 2018-07-06 | 顺丰科技有限公司 | 数据库主键生成方法、装置、设备及其存储介质 |
CN110109912A (zh) * | 2018-01-15 | 2019-08-09 | 北京京东尚科信息技术有限公司 | 一种标识符生成方法和装置 |
CN109241177A (zh) * | 2018-07-12 | 2019-01-18 | 四川大学 | 一种适用于分布式系统的数据库主键生成方法 |
CN109241193A (zh) * | 2018-09-26 | 2019-01-18 | 联想(北京)有限公司 | 分布式数据库的处理方法和装置,及服务器集群 |
CN109582666A (zh) * | 2018-09-29 | 2019-04-05 | 阿里巴巴集团控股有限公司 | 数据主键生成方法、装置、电子设备及存储介质 |
CN110334092A (zh) * | 2019-06-14 | 2019-10-15 | 福建天泉教育科技有限公司 | 分布式id生成方法、存储介质 |
CN110825737A (zh) * | 2019-10-18 | 2020-02-21 | 支付宝(杭州)信息技术有限公司 | 索引创建和数据查询方法、装置及设备 |
CN111708831A (zh) * | 2020-05-12 | 2020-09-25 | 北京奇艺世纪科技有限公司 | 全局主键生成方法、装置 |
Also Published As
Publication number | Publication date |
---|---|
CN102880705B (zh) | 2015-09-02 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102880705A (zh) | 数据库主键生成装置和数据库主键生成方法 | |
CN102968498B (zh) | 数据处理方法及装置 | |
CN110110006A (zh) | 数据管理方法及相关产品 | |
CN101661509B (zh) | 一种生成数据库表主键字段的方法及装置 | |
CN105099951B (zh) | 一种资源调度方法及管理设备 | |
CN102985909B (zh) | 为良好分格的对象提供高扩展性网络存储的方法和设备 | |
CN104731799B (zh) | 内存数据库管理装置 | |
CN102930062A (zh) | 一种数据库快速水平扩展的方法 | |
CN103559032B (zh) | 嵌入式系统对象管理的装置及方法 | |
CN104050248B (zh) | 一种文件存储系统及存储方法 | |
CN103701726B (zh) | 一种核心交换机的接口索引管理方法及系统 | |
CN104317742A (zh) | 一种优化空间管理的自动精简配置方法 | |
CN105183561A (zh) | 一种资源分配方法和系统 | |
CN102819599A (zh) | 在一致性哈希数据分布基础上构建层次目录的方法 | |
CN103207920A (zh) | 一种元数据并行采集系统 | |
CN106557427A (zh) | 共享内存数据库的内存管理方法及装置 | |
CN110362380A (zh) | 一种面向网络靶场的多目标优化虚拟机部署方法 | |
CN103338274A (zh) | 树形泛在网络中面向路由的地址分配方法 | |
CN103886104A (zh) | 一种适用于电力系统的分布式实时数据库管理系统及实现方法 | |
CN106528265A (zh) | 基于分布式san存储架构的虚拟机管理方法及系统 | |
CN113835823A (zh) | 资源调度方法和装置、电子设备、计算机可读存储介质 | |
CN106897458A (zh) | 一种面向机电设备数据的存储及检索方法 | |
CN105138632A (zh) | 一种文件数据组织管理方法及文件管理服务器 | |
CN103985075A (zh) | 一种医院成本的分摊方法 | |
CN105049475B (zh) | 大规模社区的数据高效存储优化方法及系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
C56 | Change in the name or address of the patentee | ||
CP03 | Change of name, title or address |
Address after: 100094 Haidian District North Road, Beijing, No. 68 Patentee after: Yonyou Network Technology Co., Ltd. Address before: 100094 Beijing city Haidian District North Road No. 68, UFIDA Software Park Patentee before: UFIDA Software Co., Ltd. |