专利名称:一种数据库存储数据的方法及装置的制作方法
技术领域:
本发明涉及数据库领域,尤其涉及一种数据库存储数据的方法及装置。
背景技术:
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。数据库产生于距今五十年前,随着信息技术和市场的发展,数据管理不再仅仅是存储和管理数据,而转变成用户所需要的各种数据管理的方式。数据库有很多种类型,从最简单的存储有各种数据的表格到能够进行海量数据存储的大型数据库系统都在各个方面得到了广泛的应用。在互联网行业中,企业面对的是庞大的数据以及海量的数据访问,因此数据库在互联网企业中的作用越来越重要。传统的数据库系统基于单台数据库对数据进行管理,但是随着企业的高速发展,使得业务应用对数据库的访问压力成几何级增长,单台数据库所带来的数据量和访问量瓶颈问题日益严重,基于单台数据库系统对数据进行管理的方式已经不能够适应飞速发展中的互联网产业的需求。为了解决单台数据库所带来的数据量和访问量瓶颈问题,必须将原来构建于单台数据库的业务逻辑进行切分,构建包括多台数据库的业务逻辑。一般的切分方法是按照逻辑表进行一些垂直的切分,即将一些大的表切分出来放在单独的数据库存储设备中,例如原单台数据库中存放10类业务的数据,其中第1类业务的数据量非常大,则将该第1类业务对应的数据存放到其他数据库,并相应的切分逻辑数据表。但是当一张逻辑数据表的数据量继续增长,到达单个数据库的瓶颈时,这种简单的切分方法依然面临数据量和访问量瓶颈问题。将一张逻辑表分为多个子库和子表,即分库和分表的核心目的是减少业务系统对单台数据库的依赖。但在整个存储业务系统中,一般分为前端负载均衡、应用存储设备和后端存储等几个主要部分。在这种比较普遍的结构中,应用存储设备和负载均衡都有比较成熟的技术和理论可以实现比较平滑的扩展,但由于数据本身是有状态的,因此数据库的扩展相对比较困难。现有技术中提供的数据库分库解决方案,可以将单个数据库切分为多个数据库, 在一定程度上解决了数据库扩展的问题。这种方案通常是按照一个查询量最高的字段进行取模操作。例如通常用户标识(uSer_id)为查询量最高的字段,根据User_id取模后的值, 决定这条数据最终应该写到哪个数据库中。例如将单个数据库内的数据分到16个数据库时,根据其uSer_id mod 16后的值,决定这条数据最终应该写到哪个数据库中。在对数据库进一步扩展时,这种简单的数据库分库方案将导致大批量的数据的rehash(重新哈希运算)。rehash就是对一组数据按照另外的值进行取模并分配的过程,例如,对1至100这100 个数,如果每个数都对10取模,那么100个数就可以根据计算的结果0 9,平均的分配到 10个虚拟的组里面去。但如果这个值要变大,如变到20,那么从1 100的所有数字对20 取模以后的值有很大一部分都和对10取模的结果不同,这100个数字也自然会被分配到和对10取模后不同的虚拟组里面去,这一过程就是rehash。对应于实际场景,如果原来有10个数据库,那么可以对某个值(例如userjd)对10取模,这样就可以将数据比较均衡的分配到10个数据库中。假设数据量继续增大,10个数据库已经不能够满足业务发展的需要, 需要再增加10个数据库,那么如果还希望平均的分配数据,就需要对以前已经分配到10个数据库中的数据根据当前数据库的数量20,进行重新分配。经过rehash后,大批量的数据都需要重新分配数据库。但是,这种大范围的数据迁移,即大量数据在数据库中的位置更新会导致存储设备负担加重、数据迁移复杂,并且在迁移过程中容易导致数据丢失。
发明内容
本申请提供了一种数据库存储数据的方法,以解决现有数据库扩展过程中,存储设备负担加重、数据迁移复杂,容易导致数据丢失的问题。本申请还提供了一种存储装置,以解决现有数据库扩展过程中,存储设备负担加重、数据迁移复杂,容易导致数据丢失的问题。本申请提供一种数据库存储数据的方法,包括将待存储的数据的标识信息对第一预设值进行第一次取模处理;根据第一次取模处理得到的值进行第一次求商处理;根据第一次求商处理得到的第一商值,在多个数据库内存储所述待存储的数据, 所述第一预设值大于所述数据库的个数。本申请还提供一种存储装置,包括取模模块,用于将待存储的数据的标识信息对第一预设值进行第一次取模处理;求商模块,用于根据所述第一次取模处理得到的值进行第一次求商处理;存储模块,用于根据所述第一次求商处理得到的第一商值,在多个数据库内存储所述待存储的数据,所述第一预设值大于所述数据库的个数。与现有技术相比,本申请至少具有以下优点本申请将待存储的数据的标识信息对预设值进行取模处理,并对取模处理得到的值进行求商处理,然后根据求商处理的结果将数据存储在不同数据库,由于数据库的个数小于预设值,通过这种方式可以使存储设备在取模处理时选择一个较大的预设值,然后再根据数据库的个数选择较小值对取模结果进行求商,根据求商的值将数据存储到多个数据库中,这种存储方式,在数据库的扩展过程中,只需对需要切分的数据库再次进行取模等步骤,根据计算出的值进行数据存储,对其他数据库无影响,避免了可能的rehash操作,存储设备负担小、数据迁移简单并且迁移过程中数据不易丢失,有效地实现了数据库的平滑扩展。
为了更清楚地说明本申请或现有技术中的技术方案,下面将对本申请或现有技术描述中所需要使用的附图作简单的介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。图1是本申请实施例一提供的数据库存储数据的方法流程示意图2是现有技术的分库方式示意图;图3是本申请实施例一中具体实现场景下数据库存储数据的方法的流程示意图;图4是本申请实施例一提供的分库方式示意图;图5是本申请实施例二提供的数据库切分的方法的流程示意图;图6是本申请实施例三提供的数据库切分的方法的流程示意图;图7是本申请实施例三中分库方式示意图;图8是本申请实施例五提供的数据库存储数据的方法的流程示意图;图9是本申请实施例中分库分表方法的示意图;图10-13是本申请实施例六提供的存储装置的结构示意图。
具体实施例方式下面将结合本申请中的附图,对本申请中的技术方案进行清楚、完整的描述,显然,所描述的实施例是本申请的一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其它实施例,都属于本申请保护的范围。此处需要说明的是,本申请实施例中的各步骤可以由单独一个具备计算存储能力的设备完成,如服务器或存储设备等执行,也可以由多个设备共同执行完成,例如由服务器与存储设备组合执行完成,即本申请实施例中利用服务器或存储设备等相同或者不同的存储装置,进行数据存储的过程仅仅是一个实现发明目的的具体实例,并不用于限制本申请的范围,可以根据实际需要灵活采用相同或者不同的设备完成本发明实施例的发明目的。实施例一本申请实施例一提供了一种数据库存储数据的方法,如图1所示,包括步骤101,将待存储的数据的标识信息对第一预设值进行第一次取模处理;步骤102,根据第一次取模处理得到的值进行第一次求商处理;步骤103,根据第一次求商处理得到的第一商值在多个数据库内存储所述待存储的数据,所述第一预设值大于所述数据库的个数。优选地,所述第一次求商处理的第一除数为所述数据库的个数。优选地,所述第一预设值为所述数据库的个数的整数倍数。优选地,根据所述第一次求商处理得到的第一商值在多个数据库内存储所述待存储的数据,具体可包括获取所述第一次求商处理得到的值的整数部分;根据所述第一次求商处理得到的值的整数部分,将待存储的数据存储于不同的数据库中。为了更清楚地阐述实施例一中数据库存储数据的方法,即数据库的分库方法,下面结合具体实现场景进行进一步详细介绍。首先介绍现有技术中的分库方式。现有技术的分库方式采用对标识(id)简单取模的分库方式。如图2所示,假设将数据划分到4个数据库中,则分库规则为id mod 4,其中的id为数据的标识信息,例如 User_id(用户标识)。对于0 20这21个值来说,数据在数据库内的分布如图2所示。其中,槽0 (id mod 4 = 0对应的数据库)中存储的数据遵循规则id mod 4 = 0,槽1中存储的数据遵循规则id mod 4 = 1,槽2中存储的数据遵循规则id mod 4 = 2,槽3中存储的数据遵循规则id mod 4 = 3。其中,槽是hash以后的结果值中的一个,如id mod 4,那么如果id为自然数,这个计算式最终只会有4个结果,也就是0、1、2、3,这四个结果的每一个都是一个槽。槽0中存储0、4、8、12、16、20六个数值,槽1中存储1、5、9、13、17五个数值,槽2中存储2、6、10、14、 18五个数值,槽3中存储3、7、11、15、19五个数值。在这种结构下,如果4个库变为8个库的时候,因为数据从对4取模变为对8取模, 所以大批量的数据都需要重新分配数据库,这会使迁移成本成倍增加。本申请实施例一提供的数据库存储数据的方法,如图3所示,其中,执行数据存储的设备以服务器为例,包括以下步骤步骤301,服务器对待存储的数据的标识信息进行取模处理。具体的,本申请实施例中数据库以设置在服务器中为例进行说明,即存储设备以服务器为例。本申请实施例中,待存储的数据包括服务器中原数据库内的数据,该原数据库需要切分为多个数据库,即进行分库处理。需要说明的是,待存储的数据并不限于原数据库内的数据,也可以是服务器新接收的需要存储的数据。下面以及后续实施例中待存储的数据均以原数据库内的数据为例进行说明,当然如果替换为服务器新接收的需要存储的数据, 则对应的实施方式仍然可以执行。服务器对原数据库内存储的数据的标识信息进行取模处理之前,需要设置取模所需的预设值,服务器对数据的标识信息进行取模处理具体为将数据的标识信息对预设值进行取模,该预设值大于分库后得到的新的数据库的个数,例如为分库后得到的数据库的个数的整数倍数。与上述图2对应,本申请实施例中以0-32这33个数划分到4个数据库内为例,则分库后得到的数据库的个数为4,预设的值为4的整数倍,以16为例。需要说明的是,该预设值还可以是8、32或者其他值,此处仅以16作为一具体实现方式进行介绍。服务器将0-32这33个数进行取模处理后得到0_15这16个值。步骤302,服务器根据取模处理得到的值进行求商处理。具体的,本申请实施例中,服务器对取模处理得到的值进行求商处理时所使用的除数,为分库后得到的数据库的个数。本申请实施例中该个数具体为4。服务器根据取模处理得到的值进行求商处理具体为将0-15这16个值分别除以4 得到整数部分为0-3的值,即图4中所示的(id Mod 16)/4得到的值的整数部分为0-3,为方便描述,在以下内容中直接写为(id Mod 16)/4 = 0-3。步骤303,服务器根据求商处理得到的值在分库后的数据库内存储数据。具体的,服务器存储步骤302中求商处理得到的值与原始数据的对应关系,本步骤中根据该对应关系在4个数据库内分别存储对应的0-32这33个数。如图4所示,其中槽 0中存储的数据遵循规则(id mod 16)/4 = 0,槽1中存储的数据遵循规则(id mod 16)/4 =1,槽2中存储的数据遵循规则(id mod 16)/4 = 2,槽3中存储的数据遵循规则(id mod 16) /4 = 3。其中,槽0中存储0 3、16 20共9个数值,槽1中存储4 7、21 24共8 个数值,槽2中存储8 11、25 28共8个数值,槽3中存储12 15、29 32共8个数
本申请实施例中,将待存储的数据的标识信息对预设值进行取模处理,并对取模处理得到的值进行求商处理,然后根据求商处理的结果将数据存储在小于预设值的个数的数据库中。由于数据库的个数小于预设值,通过这种方式可以使存储设备在取模处理时选择一个较大的预设值,然后再根据数据库的个数选择较小值对取模结果进行求商,从而将待存储的数据存储到多个数据库中,这种存储方式在进行数据库的扩展时,只需对由被切分的数据库存储的数据的标识信息进行计算处理即可,并根据计算出的值进行存储,对其他数据库并无影响,避免了对其他数据库中存储的数据的rehash操作,存储设备负担小、 数据迁移简单并且迁移过程中数据不易丢失,有效地实现了数据库的平滑扩展。实施例二如图5所示,本申请实施例二是在实施例一的基础上,对实施例一中的其所述多个数据库中的任一数据库进行的一种切分操作,即将所述多个数据库中的任一数据库切分为多个子数据库,具体包括以下步骤步骤104,将被切分的数据库内存储的数据的标识信息对第二预设值进行第二次取模处理;该第二预设值可以与第一预设值可以相同或者不同。步骤105,根据第二次取模处理得到的值,在多个子数据库内存储由被切分的数据库存储的数据。为了更清楚地阐述实施例二中数据库存储数据的方法,下面结合具体实现场景进行进一步详细介绍,其中,执行数据存储的设备以服务器为例。结合图4中所示的数据存储,假定此时槽0的数据容量不足,则本申请实施例中服务器可以只对该槽0进行分库处理。具体地,服务器对槽0中的数据的标识信息进行第二次取模处理,该第二次取模处理使用第二预设值,例如槽0中的数据的标识信息对2进行取模处理,根据取模结果将槽 0中的数据分配到两个子数据库内,当然还可以根据实际需要将槽0中的数据的标识信息对3、4或者其他数值取模,根据取模结果将槽0中的数据分配到多个子数据库内。本实施例二中,由被切分的数据库存储的数据包括由被切分的数据库已经存储的数据以及之前由实施例一计算出的由被切分的数据库存储的待存储的数据。即切分后,实施例一中确定的由被切分的数据库存储的待存储的数据,经过实施例二中的步骤后,被分别存储于对应的子数据库中。在此过程中,不需要对其他数据库中存储的数据进行处理,因此避免了对其他数据库中存储的数据的rehash操作。所述第二预设值可根据被切分的数据库所存储的数据的标识信息情况进行选择, 优选地,选择的第二预设值能够使得多个子数据库能够平均分配由被切分的数据库存储的数据。实施例三本申请实施例三同样是在实施例一的基础上,对实施例一中的其所述多个数据库中的任一数据库进行的一种切分操作,即将所述多个数据库中的任一数据库切分为多个子数据库,如图6所示,具体包括以下步骤步骤106,将由被切分的数据库存储的数据的标识信息对第三预设值进行第三次取模处理;
步骤107,对所述第三次取模处理的结果进行第二次求商处理;步骤108,根据第二次求商处理得到的第二商值,在多个子数据库内存储由被切分的数据库存储的数据。本实施例三中,由于实施例一在进行第一次取模处理时的第一预设值大于数据库个数,当实施例一中的任一数据库根据本实施例三切分时,通过第二次求商处理使该被切分的数据库内的数据重新存储,而其他数据库内的数据则可以不变。优选地,所述第三预设值与第一预设值相同。优选地,所述第二次求商处理的第二除数为所述第一除数除自身及1以外的约数。为了更清楚地阐述实施例三中数据库存储数据的方法,下面结合具体实现场景进行进一步详细介绍,其中,执行数据存储的设备以服务器为例。结合图4中所示的数据存储,假定此时槽0的数据容量不足,则本申请实施例中服务器可以只对该槽0进行分库处理。服务器将槽0中的数据的标识信息对第三预设值进行第三次取模处理,优选地, 该第三次取模处理的第三预设值同步骤301中取模处理的预设值相同。然后,对第三次取模的结果进行第二次求商处理,此处第二次求商处理的第二除数为步骤302中求商处理的除数的除其自身及1之外的约数,4的约数包括1、2和4,除自身及1之外后为2。即本实施例中该第二除数为2,根据该第二除数将槽0划分为2个子数据库。服务器进一步根据第二次求商处理得到的第二商值在2个子数据库内存储槽0内的数据。如图7所示,对槽0进行划分后,原槽0内的数据被分配到槽0_0和0_1中。本实施例三同样具备实施例二的优点,即在此过程中,不需要对其他数据库中存储的数据进行处理,避免了对其他数据库中存储的数据的rehash操作。并且经过本实施例三切分后的各子数据库,还可以根据实施例二或本实施例三中的方式进行进一步的切分, 采用本实施例三中的方式进行进一步的切分时,只要该第二除数还具备除自身及1之外后约数即可,并且在此过程中,同样地不需要对其他子数据库中存储的数据进行处理,避免了对其他子数据库中存储的数据的rehash操作,依此类推,可有效地实现数据库的平滑扩展。实施例四本实施例四是在实施例二和/或实施例三的基础上,在对所述多个数据库中的任一数据库进行切分操作后,增加一判断过程,即判断待存储的数据是否为属于被切分的数据库存储的数据,该判断过程具体包括将待存储的数据的标识信息对所述第一预设值进行第一次取模处理,根据第一次取模处理得到的值进行第一次求商处理;根据第一次求商处理的结果判断该待存储的数据是否属于所述被切分的数据库。 如果是,则执行实施例二或实施例三的步骤,将该待存储的数据存入对应的子数据库中。实施例四中,多个数据库内的某一个数据库需要进行切分时,通过预设条件的设置获知该某一个数据库内存储的数据,进而仅对该数据库内存储的数据进行迁移处理,即迁移到该数据库切分得到的多个子数据库内。具体的,以图4中槽0的扩展为例进行说明,则其预设条件为(id mod 16)/4 = 0,即首先判断数据是否为槽0内的数据,然后根据判断结果进行数据存储。具体可以表示为 如果落到(id mod 16)/4 = 0的槽内的这组数据被分配到多个子槽中,仅将槽0中存储的数据再进行切分,这样就可以解决rehash的问题。具体步骤如下首先,判断(id mod 16)/4的值是否等于0,如果是,计算(id mod 16)/2的值,根据(id mod 16)/2计算出的值,将对应id的待存储数据存储于对应的子槽中。这样就等于将原来在第0个槽内的数据,重新进行了切分,其中,只是槽0内的数据进行rehash,其余槽内的数据不受影响。在数据库内的数据持续的增长时,这种方法可以保证数据库的平滑扩展,并且在数据库切分时,只需要变动被由切分的数据库存储的数据即可。这种模式可以使用小型的服务器或存储设备来解决大型服务器或存储设备才能解决的问题。例如首先使用小型存储设备存储数据,随着存储数据的增多而需要进行数据库切分时,将由切分的数据库存储的数据存储于新增的服务器或存储设备中。这种方式,使得服务器或存储设备可以按当前需要设计,而不需要在一开始就预先采用大型服务器或存储设备,这大大降低了数据的存储成本。实施例五本申请实施例五中,根据数据库id生成的特点可以很清晰的得知,数据的增长是沿着时间线逐渐增长的,在上述实施例一至四的分库分表的基础上,还可以根据id的范围进行再一次的切分。如果id小于设定的阈值时,那么执行实施例一至四中任一实施例步骤;当id大于等于设定的阈值,可以执行新的存储方法。通过这样的模式,可以实现对旧数据存储模型的兼容,进一步增强了数据库的平滑扩展性。例如,假设实施例一至四中设定的第一预设值为16,即最大可以在不需要进行rehash的情况下,将数据存储于16个数据库中,当需要对16个数据库中的任何一个进行切分时,就需要使用rehash的方式了。为解决该问题,本实施例五在实施例一至四的基础上,提供如下技术方案。如图8所示,在将待存储的数据的标识信息对第一预设值进行第一次取模处理之前,执行以下步骤步骤100,判断所述待存储的数据的标识信息是否大于设定阈值;如果否,执行实施例一中的所述步骤101 ;如果是,执行步骤109 ;步骤109,存储该待存储的数据。所述步骤109中,对该待存储数据的存储可以采用现有技术实现。本实施例五中, 优选地,采用本实施例一至实施例四中一任一方法进行,只需要根据需要设定其相应的第一预设值、第一除数、第二预设值、第二除数等值即可。进一步优选地,所述相应的第一预设值为实施例一中所述第一预设值的倍数。。这样可保证数据存储方式的一致性,方便存储此部分标识信息大于设定阈值的数据的数据库的平滑扩展。例如,同样以数据的标识信息userjd为例,设定第一预设值为16,第一预设值的倍数以2为例,当然还可以根据需要设置为其他倍数。第一预设值的2倍数为32,假设id 是逐渐自增的,即随着时间的变化,id逐渐增大。设定阈值为10000000000,需要说明的是, 该第一预设值、阈值可以根据实际需要灵活设置,本实施例中设置的值仅为实现本实施例中的方法所使用的一种具体实现方式。具体步骤如下步骤1001,判断user_id的值是否小于等于10000000000,如果是,执行步骤1002 ; 否则执行步骤1003 ;
步骤1002,将原数据库内存储的数据的标识信息对第一预设值进行第一次取模处理,取模方式为id mod 16,即对应实施一中的步骤101,并执行其后的步骤;步骤1003,将原数据库内存储的数据的标识信息对预设值的倍数32进行取模处理,此时,取模方式为id mod 32,根据取模处理的结果进行数据存储。所述步骤1003中可以根据实施例一至实施例四中任一实施例描述的方式对取模后的结果进行处理,并进行数据存储;还可以直接根据取模处理的结果进行数据存储,即将取模处理的结果与数据对应,根据取模处理的结果将数据存储到不同的数据库内。例如当取模方式为id mod 32时,取模结果为0-31,服务器将数据存储到32个划分后的数据库内。实施例六本申请实施例中提供的分库方法同时还可以辅以分表方法,该分表方法的具体实现与实施例一至实施例五中的分库方法相似,即根据数据标识信息进行取模处理以及求商处理,根据求商处理的结果将不同的数据标识信息存储到不同的目标表中,如图9所示,其中第一次计算得到的下标对应的标志为数据库的标志,第二次计算得到的下标所对应的标志为数据库内的目标表。其中的键(key)和值(val)对应于本申请实施例六中的数据标识信息和求商处理后的结果,分库规则和分表规则为实施例一至实施例五中任一实施例描述的方式,即目标表可以采用与数据库切分相同的方式进行切分。例如,实施例一中在多个数据库内存储待存储的数据时,对于向任一数据库内存储的数据进行第四次取模处理,根据第四次取模处理得到的值进行第三次求商处理,根据第三次求商处理的值将数据存储到不同的目标表。优选的,第四次取模处理和第三次求商处理分别与第一次取模处理和第一次求商处理相同。当目标表需要切分时,则可以根据实施例二或三中所述的方法进行切分,例如根据实施例二中所述的方法对目标表内存储的数据进行第二次取模处理后,根据取模处理的结果切分目标表;或者根据实施例三中所述的方法对目标表内存储的数据进行第三次取模处理和第二次求商处理,根据第二次求商处理的结果切分目标表。实施例七本申请实施例六提供一种存储装置,如图10所示,包括取模模块11,用于将待存储的数据的标识信息对第一预设值进行第一次取模处理;求商模块12,用于根据所述第一次取模处理得到的值进行第一次求商处理;存储模块13,用于根据所述第一次求商处理得到的第一商值,在多个数据库内存储所述待存储的数据,所述第一预设值大于所述数据库的个数。优选地,所述第一次求商处理的第一除数为所述数据库的个数;所述第一预设值为所述数据库的个数的整数倍数。进一步地,所述取模模块11还用于当对所述多个数据库中的任一数据库进行切分操作时,将由被切分的数据库存储的数据的标识信息对第二预设值进行第二次取模处理;相应的,所述存储模块12还用于根据第二次取模处理得到的值,在多个子数据库内存储由被切分的数据库存储的数据。所述取模模块11还用于当对所述多个数据库中的任一数据库进行切分操作时, 将由被切分的数据库存储的数据的标识信息对第三预设值进行第三次取模处理;
相应的,所述求商模块12还用于对所述第三次取模处理的结果进行第二次求商处理,所述第二次求商处理的第二除数为所述第一除数除自身及1以外的约数;相应的,所述存储模块13还用于根据第二次求商处理得到的第二商值,在多个子数据库内被切分的数据库存储的数据。如图11所示,该装置还包括判断模块14,用于在对所述多个数据库中的任一数据库进行切分操作后,通过所述取模模块将待存储的数据的标识信息对所述第一预设值进行所述第一次取模处理,通过所述求商模块根据第一次取模处理得到的值进行第一次求商处理,并根据第一次求商处理的结果判断该数据是否属于由所述被切分的数据库存储的数据。如图12所示,所述存储模块13包括获取子模块131,用于获取所述第一次求商处理得到的值的整数部分;存储子模块132,用于根据所述第一次求商处理得到的值的整数部分将待存储的数据存储到不同的数据库。如图13所示,该设备还包括判断模块14,用于判断所述待存储的数据的标识信息是否大于阈值;所述取模模块11还用于当所述判断结果为否时,将所述待存储的数据的标识信息对所述第一预设值进行第一次取模;当所述判断结果为是时,将所述待存储的数据的标识信息对所述第一预设值的倍数进行第一次取模处理。所述取模模块11还用于对于向任一数据库内存储的数据进行第四次取模处理; 相应的,所述求商模块12还用于根据所述第四次取模处理得到的值进行第三次求商处理;所述存储模块13还用于根据所述第三次求商处理的值将数据存储到不同的目标表。本申请实施例中,通过存储装置对待存储的数据进行取模处理,并将取模后的结果进行求商处理,根据求商处理得到的值在分库后的数据库内存储原数据库内存储的数据,实现了数据库的切分处理,解决数据库的平滑扩展问题。通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到本发明可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。本领域技术人员可以理解附图只是一个优选实施例的示意图,附图中的模块或流程并不一定是实施本发明所必须的。本领域技术人员可以理解实施例中的装置中的模块可以按照实施例描述进行分布于实施例的装置中,也可以进行相应变化位于不同于本实施例的一个或多个装置中。上述实施例的模块可以合并为一个模块,也可以进一步拆分成多个子模块。上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。以上公开的仅为本发明的几个具体实施例,但是,本发明并非局限于此,任何本领域的技术人员能思之的变化都应落入本发明的保护范围。
权利要求
1.一种数据库存储数据的方法,其特征在于,包括将待存储的数据的标识信息对第一预设值进行第一次取模处理; 根据第一次取模处理得到的值进行第一次求商处理;根据第一次求商处理得到的第一商值,在多个数据库内存储所述待存储的数据,所述第一预设值大于所述数据库的个数。
2.如权利要求1所述的方法,其特征在于,所述第一次求商处理的第一除数为所述数据库的个数; 所述第一预设值为所述数据库的个数的整数倍数。
3.如权利要求1所述的方法,其特征在于,还包括将所述多个数据库中的任一数据库切分为多个子数据库的步骤,将由被切分的数据库存储的数据的标识信息对第二预设值进行第二次取模处理;根据第二次取模处理得到的值,在多个子数据库内存储由被切分的数据库存储的数据。
4.如权利要求1所述的方法,其特征在于,还包括将所述多个数据库中的任一数据库切分为多个子数据库的步骤,将由被切分的数据库存储的数据的标识信息对第三预设值进行第三次取模处理;对所述第三次取模处理的结果进行第二次求商处理,所述第二次求商处理的第二除数为所述第一除数除自身及1以外的约数;根据第二次求商处理得到的第二商值,在多个子数据库内存储由被切分的数据库存储的数据。
5.如权利要求3或4所述的方法,其特征在于,所述将所述多个数据库中的任一数据库切分为多个子数据库的步骤之后,还包括将待存储的数据的标识信息对所述第一预设值进行所述第一次取模处理,并根据第一次取模处理得到的值进行第一次求商处理;根据第一次求商处理的结果判断该待存储的数据是否属于所述被切分的数据库。
6.如权利要求1-4中任一项所述的方法,其特征在于,根据所述第一次求商处理得到的第一商值在多个数据库内存储所述待存储的数据,包括获取所述第一次求商处理得到的值的整数部分;根据所述第一次求商处理得到的值的整数部分,将待存储的数据存储于不同的数据库中。
7.如权利要求1-4中任一项所述的方法,其特征在于,将待存储的数据的标识信息对预设值进行第一次取模处理之前,还包括判断所述待存储的数据的标识信息是否大于阈值;当所述判断结果为否时,执行将待存储的数据的标识信息对所述第一预设值进行第一次取模处理的步骤;当所述判断结果为是时,将所述待存储的数据的标识信息对所述第一预设值的倍数进行第一次取模处理。
8.如权利要求1-4中任一项所述的方法,其特征在于,所述在多个数据库内存储所述待存储的数据包括对于向任一数据库内存储的数据进行第四次取模处理,根据所述第四次取模处理得到的值进行第三次求商处理,根据所述第三次求商处理的值将数据存储到不同的目标表。
9.一种存储装置,其特征在于,包括取模模块,用于将待存储的数据的标识信息对第一预设值进行第一次取模处理; 求商模块,用于根据所述第一次取模处理得到的值进行第一次求商处理; 存储模块,用于根据所述第一次求商处理得到的第一商值,在多个数据库内存储所述待存储的数据,所述第一预设值大于所述数据库的个数。
10.如权利要求9所述的存储装置,其特征在于,所述第一次求商处理的第一除数为所述数据库的个数; 所述第一预设值为所述数据库的个数的整数倍数。
11.如权利要求9所述的存储装置,其特征在于,所述取模模块还用于当对所述多个数据库中的任一数据库进行切分操作时,将由被切分的数据库存储的数据的标识信息对第二预设值进行第二次取模处理;所述存储模块还用于根据第二次取模处理得到的值,在多个子数据库内存储由被切分的数据库存储的数据。
12.如权利要求9所述的存储装置,其特征在于,所述取模模块还用于当对所述多个数据库中的任一数据库进行切分操作时,将由被切分的数据库存储的数据的标识信息对第三预设值进行第三次取模处理;所述求商模块还用于对所述第三次取模处理的结果进行第二次求商处理,所述第二次求商处理的第二除数为所述第一除数除自身及1以外的约数;所述存储模块还用于根据第二次求商处理得到的第二商值,在多个子数据库内被切分的数据库存储的数据。
13.如权利要求11或12所述的存储装置,其特征在于,还包括判断模块,用于在对所述多个数据库中的任一数据库进行切分操作后,通过所述取模模块将待存储的数据的标识信息对所述第一预设值进行所述第一次取模处理,通过所述求商模块根据第一次取模处理得到的值进行第一次求商处理,并根据第一次求商处理的结果判断该数据是否属于由所述被切分的数据库存储的数据。
14.如权利要求9-12中任一项所述的存储装置,其特征在于,所述存储模块包括 获取子模块,用于获取所述第一次求商处理得到的值的整数部分;存储子模块,用于根据所述第一次求商处理得到的值的整数部分将待存储的数据存储到不同的数据库。
15.如权利要求9-12所述的存储装置,其特征在于,还包括 判断模块,用于判断所述待存储的数据的标识信息是否大于阈值;所述取模模块还用于当所述判断结果为否时,将所述待存储的数据的标识信息对所述第一预设值进行第一次取模;当所述判断结果为是时,将所述待存储的数据的标识信息对所述第一预设值的倍数进行第一次取模处理。
16.如权利要求9-12所述的存储装置,其特征在于,所述取模模块还用于对于向任一数据库内存储的数据进行第四次取模处理; 所述求商模块还用于根据所述第四次取模处理得到的值进行第三次求商处理;所述存储模块还用于根据所述第三次求商处理的值将数据存储到不同的目标表。
全文摘要
本申请公开了一种数据库存储数据的方法和装置。本申请中,将待存储的数据的标识信息对预设值进行取模处理,并对取模处理得到的值进行求商处理,然后根据求商处理的结果将数据存储在不同数据库,由于数据库的个数小于预设值,通过这种方式可以使存储设备在取模处理时选择一个较大的预设值,然后再根据数据库的个数选择较小值对取模结果进行求商,根据求商的值将数据存储到多个数据库中,这种存储方式,在数据库的扩展过程中,只需对需要切分的数据库再次进行取模等步骤,根据计算出的值进行数据存储,对其他数据库无影响,避免了可能的rehash操作,存储设备负担小、数据迁移简单并且迁移过程中数据不易丢失,有效地实现了数据库的平滑扩展。
文档编号G06F17/30GK102262626SQ20101018036
公开日2011年11月30日 申请日期2010年5月24日 优先权日2010年5月24日
发明者王晶昱 申请人:阿里巴巴集团控股有限公司