表数据生成方法、装置及存储介质与流程

文档序号:29972864发布日期:2022-05-11 11:45阅读:123来源:国知局
表数据生成方法、装置及存储介质与流程

1.本技术实施例涉及信息技术领域,尤其涉及一种表数据生成方法、装置及存储介质。


背景技术:

2.在计算机软件测试和验证等应用场景中,经常需要为关系型数据库中的表生成测试数据。而表与表之间通常存在关联关系,例如,表与表的字段之间存在约束关联关系,在表数据生成过程中,需要根据表与表之间的关联关系,依照特定顺序生成表数据,导致表数据的生成具有强耦合关系,使得表数据的生成效率低下。


技术实现要素:

3.本技术实施例提供了一种表数据生成方法、装置及存储介质,可以提升表数据生成的效率。
4.第一方面,本技术实施例提供了一种表数据生成方法,包括:获取本次待生成表数据的配置信息,所述本次待生成表数据的配置信息包括表配置信息及表字段配置信息,所述表配置信息包括待生成数据量,所述表字段配置信息包括用于生成表数据的数据生成规则,所述数据生成规则包括表与表之间的约束关联关系,所述表数据为与表字段对应的数据;基于所述数据生成规则生成与所述待生成数据量对应的表数据。
5.本技术实施例中,通过对各个表内的字段设置对应的数据生成规则,由此可以使得各个表之间能够独立进行数据生成,无需依赖表与表之间的预先配置的关联关系,从而可以提升表数据生成的效率。
6.其中一种可能的实现方式中,本次待生成的表有多个,所述基于所述数据生成规则生成与所述待生成数据量对应的表数据包括:基于每个表的待生成数据量将所述本次待生成的表进行划分,得到多个簇,其中,每个簇包括一个或多个表;将所述多个簇分配至多个不同的线程,并基于所述数据生成规则对每个簇中的每个表进行数据生成,得到与每个表的待生成数据量对应的表数据,其中,一个簇对应一个线程。
7.本技术实施例中,根据待生成数据量对多个表进行簇的划分,并由不同的线程进行数据生成,可以发挥多线程的最优性能,从而可以提高数据生成的效率其中一种可能的实现方式中,当得到任意一个表的表数据后,将所述已生成表数据的表从内存中删除。
8.本技术实施例中,通过对已生成的表从内存中删除,可以减轻内存的占用,避免内存溢出。
9.其中一种可能的实现方式中,所述基于每个表的待生成数据量将所述本次待生成
的表进行划分,得到多个簇包括:获取每个表的字段总数;基于每个表的待生成数据量与字段总数的乘积将所述本次待生成的表进行划分,得到多个簇。
10.本技术实施例中,通过数据行数与字段总数的乘积计算待生成数据量,可以更准确的计算待生成数据量,从而可以更优的对待生成的表进行簇的划分,进而可以更优的发挥多线程的性能。
11.其中一种可能的实现方式中,所述数据生成规则包括随机数种子,所述随机数种子用于保证本次待生成的表的表数据与下次待生成的表的表数据不同。
12.本技术实施例中,通过在数据生成规则中设置随机数种子,可以保证每次生成的测试数据都不同,由此可以提高数据测试的效率。
13.其中一种可能的实现方式中,所述随机数种子为当前时刻的时间戳。
14.第二方面,本技术实施例提供一种表数据生成装置,包括:获取模块,用于获取本次待生成表数据的配置信息,所述本次待生成表数据的配置信息包括表配置信息及表字段配置信息,所述表配置信息包括待生成数据量,所述表字段配置信息包括用于生成表数据的数据生成规则,所述数据生成规则包括表与表之间的约束关联关系,所述表数据为与表字段对应的数据;生成模块,用于基于所述数据生成规则生成与所述待生成数据量对应的表数据。
15.其中一种可能的实现方式中,本次待生成的表有多个,上述生成模块还用于基于每个表的待生成数据量将所述本次待生成的表进行划分,得到多个簇,其中,每个簇包括一个或多个表;将所述多个簇分配至多个不同的线程,并基于所述数据生成规则对每个簇中的每个表进行数据生成,得到与每个表的待生成数据量对应的表数据,其中,一个簇对应一个线程。
16.其中一种可能的实现方式中,上述表数据生成装置还包括:删除模块,用于当得到任意一个表的表数据后,将所述已生成表数据的表从内存中删除。
17.其中一种可能的实现方式中,上述生成模块还用于获取每个表的字段总数;基于每个表的待生成数据量与字段总数的乘积将所述本次待生成的表进行划分,得到多个簇。
18.其中一种可能的实现方式中,所述数据生成规则包括随机数种子,所述随机数种子用于保证本次待生成的表的表数据与下次待生成的表的表数据不同。
19.其中一种可能的实现方式中,所述随机数种子为当前时刻的时间戳。
20.第三方面,本技术实施例提供一种计算机可读存储介质,该计算机可读存储介质中存储有计算机程序,当其在计算机上运行时,使得计算机执行如第一方面所述的方法。
21.第四方面,本技术实施例提供一种计算机程序,当上述计算机程序被计算机执行时,用于执行第一方面所述的方法。
22.在一种可能的设计中,第四方面中的程序可以全部或者部分存储在与处理器封装在一起的存储介质上,也可以部分或者全部存储在不与处理器封装在一起的存储器上。
附图说明
23.图1为关系型数据库中的表结构示意图;图2为本技术实施例提供的表数据生成方法的流程示意图;图3为本技术实施例提供的表数据生成装置的结构示意图。
具体实施方式
24.下面将结合本技术实施例中的附图,对本技术实施例中的技术方案进行描述。其中,在本技术实施例的描述中,除非另有说明,“/”表示或的意思,例如,a/b可以表示a或b;本文中的“和/或”仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,a和/或b,可以表示:单独存在a,同时存在a和b,单独存在b这三种情况。
25.以下,术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括一个或者更多个该特征。在本技术实施例的描述中,除非另有说明,“多个”的含义是两个或两个以上。
26.在计算机软件测试和验证等应用场景中,经常需要为关系型数据库中的表生成测试数据。而表与表之间通常存在关联关系,例如,表与表的字段之间存在约束关联关系,在表数据生成过程中,需要根据表与表之间的关联关系,依照特定顺序生成表数据,导致表数据的生成具有强耦合关系,使得表数据的生成效率低下。
27.图1为关系型数据库中的表结构。如图1所示,product表的pid字段和order表的product字段具有关联关系,transaction表中的tid字段和order表中的transaction字段具有关联关系。示例性的,上述关联关系可以是:在order表的transaction和transaction表的tid相同情况下,order表的orderdate应该小于transaction表的paymentdate,transaction表的amount应该等于product表的price和order表的productnumber相乘的结果。在数据生成过程中,受限于这些不同表字段间的约束关联关系,需要保证product表先于order表生成数据,order表先于transaction表生成数据。product表完成数据生成后,order表在数据生成过程中再去读取product表中的pid字段来生成自己的product字段,order表在完成数据生成后,transaction表再去读取order表和product中的数据,根据字段间的约束关系来生成tid,amout和paymentdate字段。
28.在表数据生成的过程中,需要预先配置数据库中表与表之间的字段的依赖关系,然后根据预先配置的依赖关系生成表数据。由于字段间的约束关联关系复杂多样,很难找到统一的方式进行配置并解析,且不易扩展,由此造成数据生成的效率低下。
29.基于上述问题,本技术实施例提出了一种表数据生成方法。
30.现结合图2对本技术实施例提供的表数据生成方法进行说明。
31.如图2所示为本技术实施例提供的表数据生成方法一个实施例的流程示意图,具体包括以下步骤:步骤201,获取本次待生成表数据的配置信息,本次待生成表数据的配置信息包括表配置信息及表字段配置信息,表配置信息包括待生成数据量,表字段配置信息包括用于生成表数据的数据生成规则,数据生成规则包括表与表之间的约束关联关系,表数据为与表字段对应的数据。
32.具体地,本次待生成表数据可以是本次将生成的表数据,本次待生成表数据可以是根据用户的需求生成的表数据。在具体实现时,用户的需求可以通过配置信息进行预先配置。示例性的,本次待生成表数据的配置信息可以包括表配置信息及表字段配置信息。其中,表配置信息用于对本次待生成的表的信息进行配置。例如,表配置信息可以包括本次待生成的表名信息及待生成数据量信息。其中,表名信息用于表征本次待生成的表的名称。待生成数据量信息用于表征本次待生成的表中所含的数据量。其中,待生成数据量可以通过行数表征。示例性的,待生成数据量为2000表示有待生成的2000行数据,每一行数据包括与表字段对应的数据。表1示例性的示出了表配置信息的配置格式。
33.表1 表名待生成数据量1product20002order300003transaction25000如表1所示,表配置信息中包括三个表名,分别为product、order及transaction。也就是说,本次将生成3个名称分别为product、order及transaction的表。其中,product表的待生成数据量为2000,也就是说,product表要生成2000行数据;order表的待生成数据量为30000,也就是说,order表要生成30000行数据;transaction表的待生成数据量为25000,也就是说,transaction表要生成25000行数据。
34.表字段配置信息用于对表字段信息进行配置。例如,表字段配置信息可以包括字段所属表信息、字段名称信息、数据生成规则信息。字段所属表信息用于表征当前字段所属的表;字段名称信息用于表征当前字段的名称;数据生成规则信息用于表征与当前字段对应的数据生成规则,数据生成规则还可以包括表与表之间的约束关联关系。以表1的表配置信息为例,表2示例性的示出了表字段配置信息的配置格式,其中,表2中的表字段所属的是表1中的表。
35.表2 字段所属表字段名称数据生成规则1productpidautoincrement(${i})2productpnamemockname()3productpricerandfloat(1,${0}+ascii(price))4orderoidautoincrement(${i})5ordertransactionrandstring(${i},ascii(transaction),20)6orderproductrandomint(1,${1}+ascii(product),1,2000)7orderproductnumberrandomint(1,${1}+ascii(productnumber),-1,-1)8orderorderdaterandomdate(1,${1}+ascii(orderdate),null,null)9transactiontidrandstring(${i},ascii(transaction),20)10transactionamountgettranamount([randomint(1,${0}+ascii(productnumber),-1,-1)],[randfloat(1,[randomint(1,${0}+ascii(product),1,2000)]+ascii(price))])11transactionpaymentdaterandomdate(1,${0},[randomdate(1,${0}+ascii(orderdate),null,null)],null)
如表2所示,product表包含3个字段,分别为:pid、pname及price。其中,与pid字段对应的数据生成规则为autoincrement(${i}),autoincrement为数据生成函数的名称,${i}表示数据行的索引,可以作为参数传递给数据生成函数。代码示例如下:public int autoincrement(int i){return i;
}与pname字段对应的数据生成规则为mockname(),pname字段与其他字段没有关联关系,可以通过mockname函数随机生成一个姓名即可。
[0036]
与price字段对应的数据生成规则为randfloat(1,${0}+ascii(price))。其中,randfloat函数用于生成一个随机浮点数,randfloat函数包括两个参数,第一个参数为整数,可以是自定义整数,例如1,也可以是${i}。第二参数中的${0}表示同行数据中的第一个字段的值,示例性的,由于pid为每一行数据的第一个字段,因此,该${0}可以是同行数据的pid字段的值。ascii(price)表示price字母中p,r,i,c,e对应的ascii值之和。可以理解的是,当每生成一条数据的price字段对应的值时,可以首先将参数中的${0}替换为该条数据中的第一个字段pid对应的值,然后,执行randfloat函数生成与price字段对应的值。
[0037]
再例如,transaction表中的与paymentdate字段对应的数据生成规则为randomdate(1,${0},[randomdate(1,${0}+ascii(orderdate),null,null)],null)。其中,[randomdate(1,${0}+ascii(orderdate),null,null)]用于生成与关联order表中的orderdate字段的值相同的值,并将orderdate字段的值作为生成日期的最小值,由此来保证paymentdate字段生成的日期值是大于关联order表中的orderdate的值,从而可以保证表与表之间的约束关联关系。可见,本技术实施例中,通过预设的数据生成规则可以独立的生成当前表的表数据,无需依赖已生成表中的表数据,由此可以降低表与表之间的耦合性,进而可以提高数据生成的效率。
[0038]
可以理解的是,其余表的字段的数据生成规则具体可以参考上述实施例,在此不再赘述。
[0039]
此外,需要说明的是,在每次生成price字段对应的数据时,由于都是基于同一行数据的pid字段的值,因此,每次生成price字段对应的数据都是相同的。其中,一次指的是生成所有待生成数据的数据量所对应的周期。示例性的,product表的待生成数据量为2000,若完成product表的2000行数据的生成后,则可以认为完成了本次的数据生成;若进入product表的下次的数据生成,则下次还是2000行数据。如果每次生成的数据相同,则测试或验证的效率就会降低。为了避免每次生成的数据相同,可以预先设置随机数种子globalseed,由此可以使得randfloat函数每次生成的数据都可以不相同。在具体实现时,该随机数种子可以是当前时刻的时间戳。代码示例如下:public float randfloat(int i,int seed){random random=new random(seed:globalseed+seed*i);return random.random.nextfloat();}步骤202,基于数据生成规则生成与待生成数据量对应的表数据。
[0040]
具体地,当获取到本次待生成表数据的配置信息后,可以根据本次待生成表数据的配置信息中的数据生成规则生成与待生成数据量对应的表数据。
[0041]
可以理解的是,在表数据生成的过程中,可以依次生成本次待生成的表,以表1中的表为例,可以依次生成product表、order表及transaction表。在生成任一表的表数据的过程中,可以根据数据生成规则生成与待生成数据量对应的表数据。以product表为例,product表包含pid、pname及price字段。由于product表的待生成数据量为2000,因此,根据
数据生成规则autoincrement(${i})可以生成2000条与pid字段对应的数据,根据数据生成规则mockname()可以生成2000条与pname字段对应的数据,根据数据生成规则randfloat(1,${0}+ascii(price)) 可以生成2000条与price字段对应的数据;由此可以获得product表的2000行数据,其中,每一行数据包括与pid、pname及price字段对应的数据,从而可以完成product表的表数据的生成。
[0042]
可见,当通过上述分别与pid、pname及price字段对应的数据生成规则生成与pid、pname及price字段对应的数据后,可以完成product表数据的生成。通过在配置信息中预设数据生成规则,可以无需依赖表与表之间的关联关系,可以独立的生成表数据,也无需根据表与表之间的关系预先设置复杂的约束关联关系,由此可以提高表数据的生成效率。order表数据及transaction表数据的生成方式具体可以参考上述product表数据的生成方式,在此不再赘述。当通过上述分别与oid、transaction、product、productnumber及orderdate字段对应的数据生成规则生成与oid、transaction、product、productnumber及orderdate字段对应的数据后,可以完成order表数据的生成,其中,order表可以包含30000行数据,每一行数据可以包含与oid、transaction、product、productnumber及orderdate字段对应的数据。当通过上述分别与tid、amount及paymentdate字段对应的数据生成规则生成与tid、amount及paymentdate字段对应的数据后,可以完成transaction表数据的生成,其中,transaction表可以包含25000行数据,每一行数据可以包含与tid、amount及paymentdate字段对应的数据。
[0043]
此外,为了进一步提高数据的处理效率,还可以将待生成的表进行簇的划分。在具体实现时,由于每个簇中的数据的处理是由单独的线程进行,因此,簇的划分的原则可以是根据簇中的数据量进行。示例性的,以表1中的表为例,product表的待生成数据量为2000,order表的待生成数据量为30000,transaction表的待生成数据量为25000。因此,可以将product表和transaction表划分为一个簇,例如簇1:{product,transaction},将order表单独划分为一个簇,例如簇2:{order}。此时,簇1的待生成数据量为2000+25000=27000,簇2的待生成数据量为30000,可见,簇1和簇2的待生成数据量为大体相当,由此可以将待生成数据量均匀的分配到线程中,例如,将簇1分配到线程1进行数据生成,将簇2分配到线程2进行数据生成,其中,线程1和线程2为不同的2个线程,由此可以利用多线程发挥较优的数据处理性能,从而可以提高数据生成的效率。可以理解的是,上述示例仅通过两个线程进行了示例性说明,但并不构成对本技术实施例的限定,在一些实施例中,还可以将多个表划分成多个簇,并将多个簇分配至多个线程中进行处理。
[0044]
需要说明的是,上述配置信息中的待生成数据量仅用于表征待生成的表中的数据的行数。而每一行数据中包括与字段对应的数据,如果两个表的字段数相当,则可以通过行数区分数据量,若两个表的字段数相差较大,则通过行数来区分数据量可能会带来误差。此时,可以将行数*字段数作为待生成数据量,由此可以更准确的区分数据量,从而可以更准确的根据数据量进行簇的划分,避免因为数据量不准确导致簇划分不准确,使得线程无法发挥较优的性能。
[0045]
进一步地,由于在现有技术中,当前表的表数据的生成是依赖于前序生成的表的,例如,表2的生成是依赖于表1的,表1已先于表2生成,此时,表1需要缓存在内存中,由此可以使得表2在生成时可以调用内存中的表1,如果内存中无法查询到表1,则会导致表2生成
失败,由此会造成内存的大量占用。尤其在大数据量生成的时候,由于会发生大量的表的内存占用,由此可能会导致内存溢出。因此,在本技术实施例中,由于每个表的生成都是独立的,表与表之间是没有依赖关系的,由此,可以直接将已生成的表存储至数据库,并可以将该表从内存中删除。也就是说,每当一个表的表数据生成之后,可以将该表存储至数据库,并可以将该表从内存中删除,无需将该表持续地缓存在内存中,由此可以避免对缓存的占用,提高内存的使用效率,避免内存溢出。
[0046]
图3为本技术表数据生成装置一个实施例的结构示意图,如图3所示,上述表数据生成装置30可以包括:获取模块31及生成模块32;其中,获取模块31,用于获取本次待生成表数据的配置信息,所述本次待生成表数据的配置信息包括表配置信息及表字段配置信息,所述表配置信息包括待生成数据量,所述表字段配置信息包括用于生成表数据的数据生成规则,所述数据生成规则包括表与表之间的约束关联关系,所述表数据为与表字段对应的数据;生成模块32,用于基于所述数据生成规则生成与所述待生成数据量对应的表数据。
[0047]
其中一种可能的实现方式中,本次待生成的表有多个,上述生成模块32还用于基于每个表的待生成数据量将所述本次待生成的表进行划分,得到多个簇,其中,每个簇包括一个或多个表;将所述多个簇分配至多个不同的线程,并基于所述数据生成规则对每个簇中的每个表进行数据生成,得到与每个表的待生成数据量对应的表数据,其中,一个簇对应一个线程。
[0048]
其中一种可能的实现方式中,上述表数据生成装置30还包括:删除模块33,用于当得到任意一个表的表数据后,将所述已生成表数据的表从内存中删除。
[0049]
其中一种可能的实现方式中,上述生成模块32还用于获取每个表的字段总数;基于每个表的待生成数据量与字段总数的乘积将所述本次待生成的表进行划分,得到多个簇。
[0050]
其中一种可能的实现方式中,所述数据生成规则包括随机数种子,所述随机数种子用于保证本次待生成的表的表数据与下次待生成的表的表数据不同。
[0051]
其中一种可能的实现方式中,所述随机数种子为当前时刻的时间戳。
[0052]
通过以上的实施方式的描述,所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
[0053]
在本技术实施例各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
[0054]
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本技术实施例的技术方案
本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)或处理器执行本技术各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:快闪存储器、移动硬盘、只读存储器、随机存取存储器、磁碟或者光盘等各种可以存储程序代码的介质。
[0055]
以上所述,仅为本技术的具体实施方式,但本技术的保护范围并不局限于此,任何在本技术揭露的技术范围内的变化或替换,都应涵盖在本技术的保护范围之内。因此,本技术的保护范围应以所述权利要求的保护范围为准。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1