数据库主键生成装置和数据库主键生成方法

文档序号:6377965阅读:206来源:国知局
专利名称:数据库主键生成装置和数据库主键生成方法
技术领域
本发明涉及计算机技术领域,具体而言,涉及一种数据库主键生成装置和一种数据库主键生成方法。
背景技术
在软件系统开发中,如果需要利用数据库系统来存储和管理数据,就无法回避数据库主键的设计问题。好的数据库主键设计,具有高效、易用和可靠的特点。目前,数据库主键的主流生成方法包括数据库自增字段方法和⑶ID (全局统一标识符)方法。自增字段方法由数据库自增类型字段来实现,由数据库自动生成和维护,并确保唯一性。GUID方法是利用机器硬件的唯一性特征(例如网卡MAC地址的唯一性)并结合生成时间,来确保在全球 范围内不会出现重复的数值。自增字段通常数据类型为Int或Biglnt,存储空间小且索引效率高。但使用时必须先插入数据库,才能确定ID值,这会造成编程时的很多不便。另外,自增字段的形式就是一个1、2、3、4这样的序列,没有任何实际意义,很不直观易用。而⑶ID方式生成的ID,如果按字符串方式存储,需要占用36个字节。如果按数据库特定类型存储,例如SqlServer的uniqueidentifier类型,需要占用16个字节,不仅占用空间大,而且索引的效率远较Int类型差。索引效率差一方面是因为索引键较长,另一方面是因为GUID本身是无序的,无法保证顺序生成的记录自然排序。COMB主键设计方案是对GUID无序问题的改进,方法是保留⑶ID的前10个字节,而用后6个字节表示⑶ID生成的时间,尽管做了这样的改进,COMB主键方案的性能仍然远较Int类型低。另一方面,一些传统的应用往往选择业务含义唯一的字段作为主键,例如账单编号Bill200808080001 (编号方式为前缀+YYYYMMDD+流水号)。这种形式的ID,远比毫无业务含义的自增整数和随机的GUID更为直观易用。ID如果做不到直观易用,会增大使用难度及维护成本。不过在今天,用业务字段做主键的方案已不被推荐,因为业务字段可能发生修改,而一旦修改主键将会带来一系列麻烦的问题。最后,随着云计算环境的普及,即便在企业的私有云环境中也需要考虑多数据中心分布的问题。主键设计是否支持分布式部署?是否支持数据迁移?也是需要解决的问题。显然,GUID方案可以保证分布式环境下主键依然唯一,但自增字段方案就无法满足要求。因此,需要一种数据库主键生成技术,使得数据库主键具有像业务编号那样直观易用的特点,并可支持分布式数据部署环境。

发明内容
本发明正是基于上述问题,提出了一种数据库主键生成技术,可生成高性能数据库主键,使得数据库主键具有像业务编号那样直观易用的特点,并可支持分布式数据部署环境。
有鉴于此,根据本发明的一个方面,提供了一种数据库主键生成装置,包括读取单元,读取预设的主键配置表,从所述主键配置表中获取数据中心的站点编号;主键生成单元,根据获取的站点编号读取主键分配表,获取所述主键分配表中记录的主键的最大值,根据所述主键的最大值得到当前可分配的主键的值,其中,所述主键包括数据中心的站点编号、生成主键的日期和流水号。由于主键包含数据中心的站点编号信息,因此,该数据库主键可支持分布式数据部署环境,另外该主键包括站点编号、生成日期和流水号,且流水号按顺序分配,因此,主键具有直观易用的特点。在上述技术方案中,优选的,所述读取单元还用于从所述主键配置表中读取默认分配数量;所述数据库主键生成装置还包括预 分配单元,从数据库中预先获取所述默认分配数量的主键,并将所述默认分配数量的主键放入内存中;所述主键生成单元还用于将所述主键分配表中所述主键的最大值与所述内存中的主键的最小值同步,在分配所述主键时,调用存储过程,将所述内存中的主键的最小值递增,以得到所述当前可分配的主键的值。为了避免每次分配主键时都需要与数据库的网络交互,在该技术方案中,预先从数据库中申请一定数量的主键值并缓存在内存中,只有当内存中的主键值完全被分配时,才与数据库进行下一次的交互。这样,如果内存中有可用主键值,则分配一个主键值的过程可瞬时完成,这极大地减少了网络及数据库的开销。在上述技术方案中,优选的,所述主键生成单元包括分解子单元,从所述主键的最大值中分解出日期信息;分配子单元,在判断出所述日期信息为当前日期及当前日期以前的日期时,将包含当前日期信息(今天)的主键的值作为所述当前可分配的主键的值。主键包含日期信息并且限定了每天可分配的主键值的数量,因此,主键分配表中主键的最大值,是指当前第一个可用的主键值(每次分配时可能是几千个主键值,但第一个可分配的主键值就是该最大值,然后依次分配),如果该最大值的日期是昨天的,说明包含今天日期的主键值还没有开始分配,那么就可将今天日期对应的主键值进行分配,如果今天对应的主键值还不够分配,就分配与明天对应的主键值。在上述技术方案中,优选的,所述分配子单元还用于在判断出所述日期信息等于所述当前日期,且包含所述当前日期的主键的值已全被分配时,将包含当前日期以后的日期信息的主键的值作为所述当前可分配的主键的值。即通过提前透支使用未来可用的主键值,以应对当天分配主键数量巨大的情况。如果该最大值是今天可分配的主键值中的最后一个,但不够分配,那么可分配与明天甚至是后天对应的主键值。在上述任一技术方案中,优选的,所述主键的类型包括整数类型。利用整数型,可以使主键存储空间小且索引效率高,可进一步提高主键的性能。根据本发明的另一方面,还提供了一种数据库主键生成方法,包括步骤202,读取预设的主键配置表,从所述主键配置表中获取数据中心的站点编号;步骤204,根据获取的站点编号读取主键分配表,获取所述主键分配表中记录的主键的最大值,根据所述主键的最大值得到当前可分配的主键的值,其中,所述主键包括数据中心的站点编号、生成主键的日期和流水号。
由于主键包含数据中心的站点编号信息,因此,该数据库主键可支持分布式数据部署环境,另外该主键包括站点编号、生成日期和流水号,且流水号按顺序分配,因此,主键具有直观易用的特点。在上述技术方案中,优选的,所述步骤202还包括从所述主键配置表中还读取默认分配数量,从数据库中预先获取所述默认分配数量的主键,并将所述默认分配数量的主键放入内存中;所述步骤204还包括将所述主键分配表中所述主键的最大值与所述内存中的主键的最小值同步,在分配所述主键时,调用存储过程,将所述内存中的主键的最小值递增,以得到所述当前可分配的主键的值。为了避免每次分配主键时都需要与数据库的网络交互,在该技术方案中,预先从数据库中申请一定数量的主键值并缓存在内存中,只有当内存中的主键值完全被分配时,才与数据库进行下一次的交互。这样,如果内存中有可用主键值,则分配一个主键值的过程可瞬时完成,这极大地减少了网络及数据库的开销。在上述技术方案中,优选的,所述步骤204还包括从所述主键的最大值中分解出 日期信息;若判断出所述日期信息为当前日期及当前日期以前的日期,则将包含当前日期信息的主键的值作为所述当前可分配的主键的值。主键包含日期信息并且限定了每天可分配的主键值的数量,因此,主键分配表中主键的最大值,是指当前第一个可用的主键值(每次分配时可能是几千个主键值,但第一个可分配的主键值就是该最大值,然后依次分配),如果该最大值的日期是昨天的,说明包含今天日期的主键值还没有开始分配,那么就可将今天日期对应的主键值进行分配,如果今天对应的主键值还不够分配,就分配与明天对应的主键值。在上述技术方案中,优选的,若判断出所述日期信息等于所述当前日期,且包含所述当前日期的主键的值已全被分配,则将包含当前日期以后的主键的值作为所述当前可分配的主键的值。即通过提前透支使用未来可用的主键值,以应对当天分配主键数量巨大的情况。如果该最大值是今天可分配的主键值中的最后一个,但不够分配,那么可分配与明天甚至是后天对应的主键值。在上述任一技术方案中,优选的,所述主键的类型包括整数类型。利用整数型,可以使主键存储空间小且索引效率高,可进一步提高主键的性能。根据本发明的技术方案,可获得高性能的数据库主键,使得主键既具有像业务编号一样直观易用的特点,又可支持分布式数据部署环境。


图I示出了根据本发明的实施例的数据库主键生成装置的框图;图2示出了根据本发明的一个实施例的数据库主键生成方法的流程图;图3示出了根据本发明的又一实施例的数据库主键生成方法的流程图;图4示出了根据本发明的实施例的中间层的Low-High算法的流程图。
具体实施例方式为了能够更清楚地理解本发明的上述目的、特征和优点,下面结合附图和具体实施方式
对本发明进行进一步的详细描述。在下面的描述中阐述了很多具体细节以便于充分理解本发明,但是,本发明还可以采用其他不同于在此描述的其他方式来实施,因此,本发明并不限于下面公开的具体实施例的限制。图I示出了根据本发明的实施例的数据库主键生成装置的框图。如图I所示,根据本发明的实施例的数据库主键生成装置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的编码方案如下I.使用BigInt整数类型的编码方案,如下表所示
权利要求
1.一种数据库主键生成装置,其特征在于,包括 读取单元,读取预设的主键配置表,从所述主键配置表中获取数据中心的站点编号; 主键生成单元,根据获取的站点编号读取主键分配表,获取所述主键分配表中记录的主键的最大值,根据所述主键的最大值得到当前可分配的主键的值,其中,所述主键包括数据中心的站点编号、生成主键的日期和流水号。
2.根据权利要求I所述的数据库主键生成装置,其特征在于,所述读取单元还用于从所述主键配置表中读取默认分配数量; 所述数据库主键生成装置还包括预分配单元,从数据库中预先获取所述默认分配数量的主键,并将所述默认分配数量的主键放入内存中; 所述主键生成单元还用于将所述主键分配表中所述主键的最大值与所述内存中的主键的最小值同步,在分配所述主键时,调用存储过程,将所述内存中的主键的最小值递增,以得到所述当前可分配的主键的值。
3.根据权利要求I所述的数据库主键生成装置,其特征在于,所述主键生成单元包括分解子单元,从所述主键的最大值中分解出日期信息; 分配子单元,在判断出所述日期信息为当前日期及当前日期以前的日期时,将包含当前日期信息的主键的值作为所述当前可分配的主键的值。
4.根据权利要求3所述的数据库主键生成装置,其特征在于,所述分配子单元还用于在判断出所述日期信息等于所述当前日期,且包含所述当前日期的主键的值已全被分配时,将包含当前日期以后的日期信息的主键的值作为所述当前可分配的主键的值。
5.根据权利要求I至4中任一项所述的数据库主键生成装置,其特征在于,所述主键的类型包括整数类型。
6.一种数据库主键生成方法,其特征在于,包括 步骤202,读取预设的主键配置表,从所述主键配置表中获取数据中心的站点编号; 步骤204,根据获取的站点编号读取主键分配表,获取所述主键分配表中记录的主键的最大值,根据所述主键的最大值得到当前可分配的主键的值,其中,所述主键包括数据中心的站点编号、生成主键的日期和流水号。
7.根据权利要求6所述的数据库主键生成方法,其特征在于,所述步骤202还包括从所述主键配置表中读取默认分配数量,从数据库中预先获取所述默认分配数量的主键,并将所述默认分配数量的主键放入内存中; 所述步骤204还包括将所述主键分配表中所述主键的最大值与所述内存中的主键的最小值同步,在分配所述主键时,调用存储过程,将所述内存中的主键的最小值递增,以得到所述当前可分配的主键的值。
8.根据权利要求6所述的数据库主键生成方法,其特征在于,所述步骤204还包括从所述主键的最大值中分解出日期信息; 若判断出所述日期信息为当前日期及当前日期以前的日期,则将包含当前日期信息的主键的值作为所述当前可分配的主键的值。
9.根据权利要求8所述的数据库主键生成方法,其特征在于,若判断出所述日期信息等于所述当前日期,且包含所述当前日期的主键的值已全被分配,则将包含当前日期以后的日期信息的主键的值作为所述当前可分配的主键的值。
10.根据权利要求6至9中任一项所述的数据库主键生成方法,其特征在于,所述主键的类型包括整数类型。
全文摘要
本发明提供了一种数据库主键生成装置,包括读取单元,读取预设的主键配置表,从主键配置表中获取数据中心的站点编号;主键生成单元,根据获取的站点编号读取主键分配表,获取主键分配表中记录的主键的最大值,根据主键的最大值得到当前可分配的主键的值,其中,主键包括数据中心的站点编号、生成主键的日期和流水号。根据本发明的技术方案,可获得高性能的数据库主键,使得主键既具有像业务编号一样直观易用的特点,又可支持分布式数据部署环境。本发明还提供一种数据库主键生成方法。
文档编号G06F17/30GK102880705SQ20121036796
公开日2013年1月16日 申请日期2012年9月28日 优先权日2012年9月28日
发明者张红斌, 黄卫 申请人:用友软件股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1