具体实施方式
为了使本领域技术人员更好地理解本申请中的技术方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行详细地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员所获得的所有其他实施例,都应当属于本申请保护的范围。
为了解决针对多种类型的数据分别创建数据表存储所带来的问题,本申请提供的方案是:创建一种通用的数据表,在数据存储过程中,首先根据通用数据表的结构,对各种结构的源数据进行统一的结构转换,然后将转换后的数据写入通用数据表。
不同类型的源数据具有不同的属性,相应的数据结构也各不相同,例如,一张用于存储学生信息的数据表可能包括:学号、姓名、入学年份、所在班级等字段,而一张用于存储教师信息的数据表可能包括:教师编号、姓名、入职时间、职称等级、任教科目等字段,为了对具有不同结构的数据进行统一存储,本申请所设计的通用数据表仅包含一个内容字段,利用该内容字段来存储源数据多个字段的内容。
为了消除各种类型源数据之间的字段类型和字段数量差异,需要在获取到源数据后,将多列数据结构转换为单列数据结构,也就是说,源数据经转换后每行仅有一个字段、一个数值,即每行都是单值数据。在这个单值数据中,需要体现出源数据各列的键值对信息。具体而言,针对源数据的每一行,需要将该行各列的字段名称以及对应数值写到一个字符串中,同时需要在字符串中提供分割标识以区分各个字段,这个字符串即为单值数据的数值。
在实际应用中,JSON(JavaScript Object Notation,JavaScript对象表示法)格式的数据可以很好地满足上述需求,在JavaScript规范中,一个对象表示为用“{}”括号对括起来的内容,数据结构为{key:value,key:value,...}的键值对结构,其中key为对象的属性,value为对应的属性值,不同属性之间用逗号分隔。例如,一条学生信息数据和一条教师信息数据,可以分别用JSON格式表示如下:
{"教师编号":"4001","姓名":"张山","入职时间":"2005.5","职称等级":"一级","任教科目":"语文"}
{"学号":"2014111001","姓名":"王明","入学年份":"2014","所在班级":"3班"}
可以看出,两条源数据的字段类型、字段数量都不相同,经转换后统一为字符串形式的单值数据,采用这种方式,在通用数据表中仅使用一个内容字段就可以存储任意类型、任意数量字段的源数据内容。
可以理解的是,JSON只是一种较为通用且能够满足本申请数据存储要求的特定格式,实际应用中,只要单值数据的格式能够满足将多个字段的键值合并存储在一个字段的要求即可,例如XML格式、HTML格式,或者某种自定义的KEY-VALUE格式等等,因此内容字段采用JSON格式并不应该理解为对本申请方案的限定。
为了对各条数据进行标识,除了内容字段外,在通用数据表中还应包含主键(primary key)字段。在数据表中,主键可以用来唯一确定表中的一行数据,主键可以由一个字段组成,也可以由多个字段组成。本申请提供的通用数据表,既可以使用自身独立的标识字段作为主键,例如简单递增ID序列,或是采用特定算法生成的ID编号等等;也可以利用源数据中的字段作为主键。例如,各种类型的源数据,一般都具备自己的标识字段,例如学生信息中的“学号”、教师信息中的“教师编号”、普通个人身份信息中的“身份证号码”、企业信息中的“工商注册号”……等等,可以将这些字段抽象为编号类字段作为通用数据表的主键。
考虑到通用数据表中的数据来自不同的源数据,仅使用一个编号类字段可能不足以对通用数据表的数据进行标识,这种情况下还需要在通用数据表中添加其他主键字段,例如添加一个“数据类型”字段用于区分不同的数据来源,该字段对应的值可以是例如“学生信息”、“教师信息”、“车辆信息”、“物流信息”等形式,根据实际需求,还可以进一步细化到例如“A学校学生信息”、“B学校教师信息”、“X公司车辆信息”等形式。当然,如果有必要可以添加更多的主键字段。
考虑后续使用的方便性,还可以在通用数据表中添加一些索引字段,用来存储一些使用频率较高的数据,例如“姓名”“企业名称”……等等,这些数据本身可能并不具有唯一标识作用,但是又经常会在数据检索时用到,这类数据也可以作为单独的字段数据存储在通用数据表中。索引字段也可以是一个抽象出来的字段,例如“名称”,根据实际需求,索引字段也可以有多个。
从功能上看,主键字段用于标识,索引字段用于方便使用,因此索引字段允许为空。就某个特定字段而言,其作用并不一定是绝对的,本领域技术人员可以根据实际需求,灵活设计通用数据表中的字段,表1示出了一种典型的通用数据表字段设计方案:
字段 |
说明 |
ID |
标识字段 |
实体名称 |
如姓名、公司名称等 |
实体编号 |
如身份证号、工商注册号等 |
实体编号类型 |
如“身份证”、“驾驶证”、“营业执照”等 |
数据类型 |
如“某校学生信息”、“某单位供应商信息”等 |
数据内容 |
|
表1
根据表1所示的通用数据表字段,可以认为“ID”为主键字段,“实体名称”、“实体编号”、“实体编号类型”、“数据类型”为索引字段,而事实上“实体编号”和“数据类型”两个字段的组合也可以起到主键的作用。可见,某些字段在表中既可以起到主键字段的功能,也可以起到索引字段的功能。
本申请所提供的通用数据表,可以将各种不同类型的源数据存储在同一数据表中。在实际应用中,还可以基于一定的分类原则,设计多张通用数据表,例如针对不同的实体类型,分别设计用于存储“人”信息的数据表、用于存储“公司”信息的数据表、用于存储“物”信息的数据表、用于存储“事件”信息的数据表、等等。从而更有针对性地根据不同实体的数据结构特点设计通用数据表的字段,并且适当的分类也更有利于数据的管理。当然,根据实际需求,还可以采用其他的分类原则,例如按照数据应用领域划分涉及通用数据表等等,但是分类的数量不宜过多,否则就失去了“统一管理”的初衷。从这个意义上讲,本申请中的“将不同类型的数据存储在同一数据表中”,是在特定范围内的相对概念,不应简单理解为只允许存在一张数据表。
基于上述的通用数据表设计方案,本申请提供一种数据存储方法,用于将多种不同类型的数据存储在同一数据表中,图1所示为该方法的流程图:
在S101,获得待存储的源数据;
在S102,将源数据的各行数据分别转换为单值数据,其中每个单值数据值中应携带该行源数据各列的键值对信息,并且列与列之间可以区分。考虑到通用性,这里可以使用JSON格式。
在S103,将转换后的各行单值数据写入通用数据表的内容字段,并为各行单值数据写入对应的主键字段值以用于标识。
根据通用数据表的实际设计,主键字段可以有一个也可以有多个,并且主键字段数值既可以是通用数据表管理侧独立生成,也可以直接复制源数据中的字段值。如果通用数据表中的主键字段是例如“编号”等形式的抽象字段,在写入时指明字段对应关系即可,例如将源数据中的“身份证号码”字段值对应写入通用数据表的“编号”字段。
如果通用数据表中还包括其他索引字段,则需要进一步将源数据中的相应字段值复制到通用数据表的索引字段中,如果通用数据表中的索引字段是例如“名称”等形式的抽象字段,在写入时指明字段对应关系即可,例如将源数据中的“公司名称”字段值对应写入通用数据表的“名称”字段。
可以理解的是,由于写入通用数据表的主键字段数值和索引字段数值并不需要进行转换,因此向主键字段和索引字段写入数值的操作,并不必须在S102之后执行。
由于本申请方案对数据表的数据结构进行了精简,使得数据写入过程中实际需要处理的字段数量明显减少。这里需要说明的是,前述的教师信息、学生信息等数据结构仅是用于示意性说明,实际应用中的各种源数据往往具有更多数量的字段,与这个数量相比,直接从源数据复制的主键字段和索引字段数量仅占很少的一部分,所以应用本申请方案还能够提升存储处理的效率,并且减少写入逻辑的开发工作量。
数据写入完成后,在应用阶段,如果需要使用某些通用数据表中不存在的字段值,可以在通用数据表中增加新的索引字段。
例如,需要对通用数据表中记录的教师入职时间进行排序,而表中并不存在该字段。这种情况下,应用方(可以是用户,也可以是其他设备)向数据管理方发送索引字段添加指令,在该指令中指定关注的字段名称“入职时间”,该字段应该是内容字段的单值数据中所包含的字段,如有必要的话,可能还需要指定数据类型以区分不同类型数据中的“入职时间”。数据管理方接收到该指定后,在通用数据表添加相应的索引字段;并且从内容字段的单值数据中找到与指定字段名称相匹配的键名,然后提取出相应的数值,将提取结果复制到同行的新添索引字段中。这样通用数据表中就具备了新的索引字段“入职时间”,并且写入了相应的字段值,从而满足对教师入职时间的排序需求。当然新的索引字段名称可以重新自定义,例如命名为“教师入职时间”。可以理解的是,对于通用数据表的所有数据而言,并不一定都存在“入职时间”的字段值,这也与根据之前“索引字段允许为空”的描述一致。
根据实际的应用需求,可以在通用数据表增加多个索引字段。如果应用方需要用到的字段数量较多,还可以向数据管理方发送数据子表生成指令,在指令中指定数据筛选条件,数据管理方接收到该指定后,根据筛选条件直接从内容字段中导出相应的数据,生成新的数据子表。
特别需要说明的是,根据前面实施例的描述,在通用数据表中可以添加例如“数据类型”字段用于区分不同的数据来源,这里如果使用“数据类型”作为筛选条件,则生成的数据子表结构与对应的源数据结构一致。可见,本申请出于维护方便的目的,在存储阶段将不同类型的数据存储于通用数据表中,而在应用阶段,仍然可以将单一类型的数据从通用数据表中还原出来,不会影响实际的使用。
相应于上述方法实施例,本申请还提供一种数据存储装置,该装置用于将不同类型的数据存储在同一数据表中,不同类型的数据具有不同的数据结构,数据表具有一个内容字段和至少一个主键字段,参见图2所示,该装置可以包括:
数据获得模块110,用于获得待存储的源数据;
数据转换模块120,将源数据的各行数据分别转换为单值数据,每个单值数据值中携带该行源数据各列的键值对信息;
数据写入模块130,将转换后的各行单值数据写入所述数据表的内容字段,并为各行单值数据写入对应的主键字段值以用于标识。
在本申请的一种具体实施方式中,单值数据可以是JSON格式的数据。
在本申请的另一种具体实施方式中,数据表还具有数据类型字段;数据写入模块130还可以用于将源数据的数据类型信息写入数据表的数据类型字段。
在本申请的另一种具体实施方式中,数据表还具有至少一个索引字段;数据写入模块130还可以用于:将源数据中指定字段的各行字段值写入所述索引字段。
参见图3所示,在本申请的一种具体实施方式中,数据存储装置还可以包括:
子表生成模块140,用于在源数据写入完成后,接收数据子表生成指令;根据数据子表生成指令中携带的指定数据类型信息,从数据表中提取对应数据类型的数据,根据提取结果生成该数据类型的数据子表。
索引字段添加模块150,用于在源数据写入完成后,接收索引字段添加指令;根据索引字段添加指令中携带的指定字段名称,在数据表中添加新的索引字段;从内容字段的单值数据中提取与指定字段名称相对应的数值,将提取结果复制到同行的新添索引字段中,其中,所复制数值对应的键名与指定字段名称相匹配。
可以理解的是,子表生成模块140与索引字段添加模块150作为两种功能独立的模块,既可以如图3所示同时配置在装置中,也可以分别单独配置在装置中,因此图3所示的结构不应理解为对本申请方案的限定。
上述装置中各个模块的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。
通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到本申请可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例或者实施例的某些部分所述的方法。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的模块可以是或者也可以不是物理上分开的,在实施本申请方案时可以把各模块的功能在同一个或多个软件和/或硬件中实现。也可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
以上所述仅是本申请的具体实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本申请原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本申请的保护范围。