利用序列减少软件测试开发技术之Oracle数据库开发工作量 数据库设计
关键字:序列 Oracle 数据库
序列是Oracle数据库中一个命名的顺序编号生成器。这个编号生成器能够以串行方式生成一系列的顺序整数。这个特性在数据库开发的过程中,经常会遇到。如果没有这个工具的话,那么只能够在前台应用程序控制。这不仅会增加应用系统的开发工作量,而且对于并发访问的情况难以控制。如多个用户同时新建一张单据时,就很难保证单据编号的唯一。故Oracle数据库的顺序编号生成器是数据库开发工程师的左膀右臂,具有很大的实用价值。具体来说,他可以解决用户的如下几个需求。
需求一:流水号的需求。
在信息化管理系统中,很多地方需要用到流水号。如有些企业物料编码是按照流水号来编写的。原材料按前后顺序用六个数字来表示,每次新建一个后都递增1。再如一个商场的前台订单管理系统,每张订单的变码原则可能就是按年月日+流水号的方式构成,每张销售订单一个编号。当天的销售订单从“000001”开始,一张销售订单一个编号,而且编号都是累加1的。而且商场可能有多个收款台,他们分布在商场的不同位置,甚至可能在不同的楼层。因此如果没有一个自动产生流水号的机制,就需要人工来完成这项工作。很明显这显然是不可能的。虽然也可以通过前台应用程序来控制。但是这也会增加代码的复杂程度,而且如果要实现多个收款台同时创建销售订单进行统一编号,则基本上不怎么可能。为此通过数据库据的顺序编号生成器来实现这个需求,使最合理的一个方式。
通过Oracle的序列功能,可以让数据库来自动地生成流水号。而且这个流水号即使在并发行操作下也不会重复,生成的速度比较快、使用方便。
需求二:利用序列当作主键、外键。
在信息化管理系统中,主键外键的应用很普遍。如在一个ERP系统的销售订单中,其订单ID就是一个主键,它唯一的标识了一张销售订单。这个字段对于终端用户来说没有实际的参考价值。但是对于应用程序或者数据库来说,这个字段则是非常关键的,因为他们就是根据这个ID来唯一的标识销售订单。通常情况下,只需要保证这个字段唯一即可,随便什么整数都可以。唯一性的要求听起来简单,但是如果要实现手工控制的话,具有一定的难度。最好的情况下,就是让系统来进行控制。
为此在Oracle数据库中就提出了序列这个功能。数据库管理员如果在数据库设计中,利用序列当作主键。让各个表都使用这个序列产生的整数作为主键,那么对于数据库的设计、编程、各种主外键关系建立都能够起到意想不到的作用。简单的说,就是序列可以成为数据库中相互独立表之间的黏合剂,把他们组合成一个统一的表结构。
以上两个只是从用户的角度来考虑序列的作用。那么下面如果成程序员的角度来考虑,会对序列提出哪些具体的要求呢?笔者总结了日常数据库开发过程中大家对序列提出的具体要求以及具体的解决方案,希望能够对大家有所帮助。
要求一:增量以10位单位递增。
通常情况下,序列是以1为单位递增的。如1001、1002、1003等等。但是有些时候,程序员希望这个增量以10(或者以任何一个整数)为单位递增。如在销售订单订单明细中,其各个项目就是以10为单位进行递增。这主要是为了后续的调整提供方便。不仅如此,在财务管理系统中也都有类似的要求。那么Oracle数据库的序列能否实现以10为单位或者以任何一个整数为递增单位呢?答案当然是肯定的。在创建序列的时候,默认情况下其递增单位为1。但是数据库管理员可以利用INCREMENT BY参数指定序列的增量,其默认值为1。如果程序员希望能够实现按10来递增的话,只要把这个参数设置为10即可。
这个参数不仅控制了递增的单位,而且还控制了递增的方向。即按从大到小递减还是按从小到大递增。如这个值设置为10,则其就是按10、20、30如此递增。如果这个数值设置为-10,其就是按10000(假设最大值为10000)、9990、99980等顺序递减。也就是说如果利用这个字段来做为表的关键字的话,那么这个关键字可以从大到小生成,也可以从小到大生成。