CN101789024A - 一种数据处理方法 - Google Patents
一种数据处理方法 Download PDFInfo
- Publication number
- CN101789024A CN101789024A CN201010119309A CN201010119309A CN101789024A CN 101789024 A CN101789024 A CN 101789024A CN 201010119309 A CN201010119309 A CN 201010119309A CN 201010119309 A CN201010119309 A CN 201010119309A CN 101789024 A CN101789024 A CN 101789024A
- Authority
- CN
- China
- Prior art keywords
- sequence
- arrangement
- record
- processing method
- data processing
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种数据处理的方法,属于计算机信息处理技术领域。现有的最常用的技术是基于关系数据库的查询和访问语言SQL技术,但由于其数据结构被限制于表的形式以及其非过程性等特点,在解决一些应用中的复杂逻辑关系时十分繁琐。本发明所述的方法,以“记录”为基本单元管理数据,提供结构自由的“序列”以辅助运算,使用指针操作来代替大部分的数据操作,从底层支持集合运算,从而大大提高数据管理和计算的效率和灵活性。本发明所述的方法让用户可以在高层的数据结构和操作接口上工作,而无需接触底层的数据存储细节,并且该操作接口具有灵活的数据结构和强大自由的运算***,能使用户更加方便高效的管理数据。
Description
技术领域
本发明属于计算机信息处理技术领域,具体涉及一种数据处理方法。
背景技术
当前的商务应用中针对关系数据库中大量数据信息的组织、管理方法,主要基于其上的查询与访问语言SQL技术,由于其数据结构被限制于表的形式以及SQL非过程性等特点,在处理很多复杂关系的计算时会十分烦琐且效率低下。
SQL刻意弱化记录的顺序,强调数据的无序和平等性,这是SQL的一个特色,但也带来了一些不可避免的缺陷。由于数据的无序性,在一些涉及到记录顺序的计算中,例如本次记录与上次记录的比较(同期比)这种计算,就每次都必须先手动对表进行排序,步骤冗余、操作繁琐而且效率低下。
SQL没有集合运算这一方便直观的概念。例如现有“北京地区员工”和“销售员工”表,如果想得到“北京地区销售员工”表,并不能像人们直观理解的取交集的方法直接运算,所有交、并、和、差等集合操作,SQL都必须通过表间的条件关联操作实现,在这个需求中,就需要用SELECT语句加WHERE条件来做两张表的关联查询,步骤繁琐而且逻辑不易被普通业务人员理解。
SQL不使用指针操作,其大部分的数据操作,都是通过批量复制数据实现。例如所有的SELECT查询所得出的表,都是把来源表中的数据计算后全部复制出来而生成新表。例如现在需要将“员工个人信息表”与“员工销售情况表”关联起来,以查阅员工的销售情况,SELECT查询只能将关联后的数据全部都复制出来生成一个庞大的新表。不支持指针操作将导致它的数据操作效率低下,并且会占用大量的存储空间,而且也导致它无法实现真正意义上的集合运算,也限制了它工作的自由度,例如它不可能将子表直接保存在主表的字段之内。
SQL强调只用一个语句就完成查询,再复杂的查询条件,也要在一个长SELECT语句中完成。这导致在一些复杂的多表关联查询情况下,所有的关联、分组和筛选等都必须一次性考虑完成,从而导致这个语句往往会很难写,在实际应用中,甚至会碰到几页纸长的一条SELECT语句,对这种情况,非专业人员很难处理,而SQL对于很难或无法在一个语句内完成的运算,则必须手动创建临时表来保存中间数据,不仅操作复杂,而且这种表都是批量复制数据生成的,效率低下且浪费资源。
发明内容
针对现有技术中存在的问题,本发明的目的是提供一种新的数据处理方法,以便提高大量数据处理和管理的便利程度和灵活性。
为了实现上述目的,本发明采用的技术方案是,一种数据处理方法,包括如下步骤:
(1)创建排列和记录的本体;
(2)按需要引用常量、变量、排列、记录组成有序的序列;
(3)对排列、序列和记录进行运算和处理,直至得到需求的结果;在运算和处理过程中,所有涉及到排列、序列和记录的操作和引用,除创建副本操作外,都使用指针进行引用。
进一步,如上所述的一种数据处理方法,在步骤(1)中,所述的排列是一种有序的成员列,排列中的成员为记录,记录的字段为数据,数据是任意的类型,包括是另一个记录、排列或序列。
进一步,如上所述的一种数据处理方法,在步骤(1)中,所述的排列和记录既能够从现有数据创建,也能够从关系数据库导入。
进一步,如上所述的一种数据处理方法,在步骤(1)中,所述的记录的本体保存在排列中,任何一条记录必然属于排列,记录最初只能通过排列的成员调用。
进一步,如上所述的一种数据处理方法,其特征在于:在步骤(2)中,所述的序列是一种数据结构,为有序的成员列,其成员是任意的类型,包括是另一个记录、排列或序列。
进一步,如上所述的一种数据处理方法,在步骤(3)中,所述的每个排列、序列和记录只存储一个本体,变量内、字段内或序列的成员内的引用都只存储目标记录、排列或序列的地址;对排列、序列和记录进行的运算和处理的结果仍能够用于下一步的运算和处理。
本发明的有益效果在于:本发明所述的方法让用户可以在高层的数据结构和操作接口上工作,而无需接触底层的数据存储细节,并且该操作接口具有灵活的数据结构和强大自由的运算***,能使用户更加方便高效的管理数据。具体来说,采用本发明所述的方法具有以下优点:
(1)以记录为基本单元管理数据
不同于关系数据库中以表为基本单元管理数据,本方法使用更为基本的记录为基本单元管理数据,这使得数据的组织和管理更为灵活和自由,配合序列结构,为后面自由分组以及强大的运算***提供了基础。
(2)数据有序
不同于SQL对顺序的淡化,本方法在最底层的序列和排列的定义中就强调顺序的有意义性。从而可以非常容易的实现许多与顺序相关的操作和比较,序号也使得许多其他运算变得更容易实现,并有更高的运算速度。
(3)自由的记录和序列结构
由于记录和序列结构的自由性,以及指针引用的支持,方法中允许记录的字段直接是引用的另一个记录,甚至另一个序列/排列,例如可以将企业的“研发部人员表”直接赋值到“部门表”中“研发部”记录的“人员”字段上,连接引用就会十分方便;方法中还允许引用不同排列中的记录组成序列以参与各种运算,而并不要求这些记录有相同的数据结构。这些自由的结构极大的扩充了组织数据的自由度,数据可以以更加合理而简洁的方式组织起来。由于指针引用的大量应用,这些复杂的结构并不会拖累***的运算速度,数据的计算将会更加高效。
(4)更加灵活方便的运算
方法支持直接的集合运算,可以方便的进行集合的交并和差等处理。例如前文中所提到的“北京地区员工”和“销售员工”表的问题,只要直接做一步简单的取交集操作就可以了,非常方便。另外本方法也提供了强大的运算***,计算数据直观而方便。
(5)使用指针操作
方法的运算***中所有对记录、序列和排列的引用都是使用指针进行引用的,而不是批量的复制数据,每个记录、序列和排列都只存储一个本体,这样不但可以节省大量的存储空间,也大幅提高了***的运算效率。例如前文提到过的“员工个人信息表”与“员工销售情况表”的关联问题,在本方法中就可以直接给它们创建一个中间的索引表,而并不会批量复制数据,效率高且节省资源。
(6)实现了过程性处理
本方法不像SQL一样强调在一个语句中完成所有的运算,本方法提供的运算代码允许分步完成计算,而且中间的计算结果可以供下次运算使用,从而使计算代码的编程自由度大大增加,代码逻辑也更加清晰,更易于编写,也增强了可读性。
附图说明
图1是本发明所述方法的具体实施方式的流程图;
图2是本发明具体实施方式中所述“排列”的数据结构示意图。
具体实施方式
下面结合附图和具体实施方式对本发明进行详细描述。
如图1所示,一种数据处理方法,包括如下步骤:
一、创建排列和记录的本体S11,这个过程可以通过从关系数据库中导入建立,或者直接依据现有数据创建。
db.query(sql)表示在关系数据库db中执行SQL语句,并将结果表转换成排列返回。
r.F为从记录中提取字段,r为记录,F为字段名。
例1.现有关系数据库db中的表1,其结构及内容如下:
姓名 | 语文 | 数学 | 英语 |
张三 | 82 | 85 | 91 |
李四 | 71 | 61 | 78 |
王五 | 50 | 60 | 55 |
赵六 | 68 | 70 | 72 |
孙七 | 73 | 90 | 75 |
执行如下语句,可以将其导入并生成排列:
P1=db.query(″SELECT*FROME表1″)
而后将生成一个包含5条记录的排列P1,对其有:
P1(1)=={姓名=张三,语文=82,数学=85,英语=91}
P1(2)=={姓名=李四,语文=71,数学=61,英语=78}
……
本方法中,除了可以从关系数据库中导入表外,也可以从现有的数据创建新的排列。
A.new(xi:Fi,...)表示创建新的排列,A为序列或排列,Fi为新排列包括的字段,xi为每个字段的值表达式,表达式中循环A以***记录,xi中可以引用A的当前成员。另,[a1,a2,...an]表示创建序列,an为序列成员。
在本方法中,所有的A.(x)和A.f(x)语法中,在没有特殊说明的前提下,表达式x中,~代表当前计算针对成员,#代表该成员在A中的序号。
例2.A=[″a″,″b″,″c″]
P2=A.new(#:序号,~:值)
以上就创建了一个新的排列P2。它可以用表格表示如下:
序号 | 值 |
1 | ″a ″ |
2 | ″b″ |
3 | ″c″ |
显然,该排列中包含3条记录,用P2(i)可以调用里面的记录,例如有:
P2(1).值==″a″
P2(2).值==″b″
例3.现有排列P1:
序号 | 名称 | 区号 |
1 | ″北京″ | 010 |
2 | ″上海″ | 021 |
以及排列P2:
名字 | 地区 |
″张三″ | ″北京″ |
名字 | 地区 |
″李四″ | ″上海″ |
而后使用代码:
P2(1).地区=P1(1)
P2(2).地区=P1(2)
以上就把P1的两条记录都分别赋给了P2中两条记录的字段。由于本方法中允许字段数据类型的自由性,P2的“地区”字段可以直接引用P1的记录。这样定义后,直接使用:
P2(1).地区.区号
就可以返回021了。
与传统方法相比,本方法中的这种引用机制为建立数据间的关联带来了极大的便利。而且本方法中所有对记录的引用操作(复制、新建等除外),都是通过指针引用,而不是复制数据,这样也节省了大量的存储空间。
二、按需要引用变量、排列、记录组成有序的序列S12。
[a1,a2,...an]表示创建序列,an为序列成员。创建序列后,可以直接用A(i)来提取序列成员,A为序列,i为成员序号,从1开始。
例4.A1=[1,3,5,7,2],A2=[″a″,4,″bcd″],这就创建了两个简单的序列。
序列对成员的类型没有限制,任何类型的变量都可以连成序列,如:
A 3=[3,null,″asdf″,A2,A2(3),P,P(2)]
其中P为一个排列。A3也是一个合法的序列。
此处,在序列成员中对其他记录或排列等对象的引用,本方法中也是使用指针调用的。
例5.[1,2,3]!=[2,1,3]
[3,″b″,″acd″]!=[3,″acd″,″b″]
序列是有序的列,它的顺序也是有意义的。
在本方法中,所有对排列的引用操作(新建、创建副本等除外),都是通过指针引用,而不是复制数据,这样既可以大大的提高执行和运算的效率,也可以节省大量的存储空间。
在实现上,本方法将排列作为一个数组保存在内存中,其中每个成员内均保存指向记录的指针(即目标记录的首地址),而后整个排列也使用数组的首地址(即指针)进行调用。此后除复制外所有使用排列的情况下,都通过指针调用排列。只有复制排列得到的新排列才不是指针调用,而是复制数据,重新划一段内存。
例6.图2是本方法中排列和序列的数据结构示意图。
图中的每个排列、序列和记录都有其内存首地址(即指针,图中为圆形表示),其中记录的首地址通常通过所属排列的首地址偏移得到。
图中的排列1是一个销售合同表,排列2是客户表,排列1中的“客户”字段,逻辑上其内容是排列2中的记录,在实现上,“客户”字段中保存的只是排列2中某条记录的内存首地址,在用户调用“客户”字段时,***根据此地址去找到客户记录的实体,从而提取数据。图中可以看到,排列1中的第二条和第三条合同的“客户”字段引用的是同一条客户记录,在本方法中,这条记录只需要保存一个实体,两条合同记录会调用同一个实体,当这个记录实体被更改时,两条合同记录的调用结果都会变动。
图中的序列1、序列2、序列3均是本方法中合法的序列结构。序列1是简单的由数值、字符串、空值和布尔值组成的序列;序列2是由一条条记录组成序列,它的记录均取自于排列1,此时它的运算规则和排列1非常相似,相当多的运算可以通用,但它们有本质的不同,序列2中存储的只是排列1中记录的地址,并没有保存一个记录实体,记录的实体全部保存在排列1中,在排列1中可以增删所有记录的字段,而序列2中不可以做这样的操作;序列3是一个各种数据类型混合起来序列,在本方法中,序列的成员没有类型限制,所以序列3也是合法的序列。
在本方法中,当用户调用这些地址成员时,***将根据这些首地址来找到对象的实体,从而读取数据,而且,还可以用这种方法来实现多级引用,十分方便。
本方法的这种使用指针调用记录和排列的方法,不但可以节省大量的存储空间,而且可以使记录和排列在参与各种运算(如集合运算等)的时候具有高得多的处理速度,数据的组织也更加合理而高效。
三、对排列、序列和记录进行运算和处理S13,并且其运算和处理结果仍可以用于下一步处理,直至得到需求的结果S14。
在运算和处理过程中,所有涉及到排列、序列和记录的操作和引用,都是使用指针进行引用,而不是复制数据。
所述的运算和处理包括:
对序列、排列和记录的本体进行修改,本实施例中为A(i)=X和r.F=X语法;
从排列中直接提取记录和从记录中直接提取字段,本实施例中为P(i)和r.F语法;
对序列或排列直接进行交、并、和、差等操作的集合运算,在本实施例中为A^B、A&B、A|B、A\B语法;
针对序列或排列成员的汇总运算,即针对基于序列/排列的表达式的计数、求和、求平均、求最值、合并重复项操作,在本实施例中为A.count()、A.sum(x)、A.avg(x)、A.max(x)、A.min(x)、A.id(x)函数;
一次性对序列或排列的每个成员运算同一表达式并返回结果序列,在本实施例中为A.(x)函数;
在序列或排列中按条件对记录进行选出,在遍历排列的过程中通过判断表达式真假来在序列或排列中选出一个或多个成员,在本实施例中为A.select(x)函数;
按条件指定表达式对序列或排列中的成员进行排序,在本实施例中为A.sort(x);
按任意指定的表达式对序列或排列中的成员进行分组,使表达式值相同的成员都分为一组,在本实施例中为A.group(xi,...)函数;
按指定表达式来连接多个序列或排列的成员的方法,使得从一个序列或排列的某一成员就可以直接获取到另一个序列或排列的与之相连接的成员,在本实施例中为join(xi:yi:Fi,...)函数;
在所有的序列和排列函数运算表达式中,提供可以直接引用当前计算所针对的成员或此成员在序列或排列中的序号的方法,在本实施例的示例中为~和#语法。
本实施例中,对序列和记录的编辑操作举例如下:
本方法中,对序列和记录的字段,都可以直接用赋值的方法修改。A(i)=X表示将序列A的第i个成员重新赋值为X;r.F=X表示将记录r的F字段重新赋值为X。
例7.A=[1,3,5,7]
A(2)=″c″
之后便有A==[1,″c″,5,7]。
P 3=[1,3,5,7].new(#:F1,~*~:F2)
此即创建了一个排列:
F1 | F2 |
1 | 1 |
2 | 9 |
3 | 25 |
4 | 49 |
而后再执行
P3(2).F2=81
于是便有P3(2)为{F1=2,F2=81}。
本实施例中,对排列的编辑操作举例如下:
P.insert(k,xi:Fi,...)为在排列P的位置k前***新记录,i为0在最后***,新纪录***后即被赋值,Fi为字段名,xi为新字段值,返回P。
P.a lt er(Ni:Fi,...)为调整P中所有记录的字段结构为Ni,...,Ni为一系列新字段名,Fi为新字段的取值,与Ni相同或空则可以省略。
P.delete(k)为删除P中第k条记录。
例8.现有如下排列P4:
序号 | 名称 | 区号 |
1 | ″北京″ | 010 |
2 | ″上海″ | 021 |
序号 | 名称 | 区号 |
3 | ″深圳″ | 0755 |
4 | ″南京″ | 025 |
执行如下代码:
P4.insert(3,2:序号,″广州″:名称,020:区号)
之后P4即为:
序号 | 名称 | 区号 |
1 | ″北京″ | 010 |
2 | ″上海″ | 021 |
2 | ″广州″ | 020 |
3 | ″深圳″ | 0755 |
4 | ″南京″ | 025 |
再执行如下代码:
P4.alter(Name,电话区号:区号,名称)
之后P4即为:
Name | 电话区号 | 名称 |
010 | ″北京″ | |
021 | ″上海″ | |
020 | ″广州″ | |
0755 | ″深圳″ | |
025 | ″南京″ |
再执行如下代码:
P4.delete(1)
P4.delete(1)
之后P4即为:
Name | 电话区号 | 名称 |
020 | ″广州″ | |
0755 | ″深圳″ | |
025 | ″南京″ |
在本方法中,对排列字段的增删、重命名、排序操作都是方便而自由的。
本方法中,对序列和排列,支持和数学中的集合运算概念完全相似的集合运算。
本实施例中,对序列或排列的集合运算举例如下:
A、B均为序列或排列,A的成员数为n,B的成员数为m:
求和运算A |B为[A(1),...,A(n),B(1),...,B(m)];
做差运算A\B为
交运算A^B为A\(A\B);
并运算A&B为A|(B\A)。
需要注意的是,排列在经过集合运算之后,返回的都将是序列。
例9.P1为包括r1、r2、r3三个记录的排列,P2为包括记录s1、s2、s3的排列,有:
[1,3,5]|[2,4,6]==[1,3,5,2,4,6]
[″a″,″b″,″abc″]\[″b″,″a″]==[″abc″]
[1,2,″a″,″bcd″,r1]^[r2,s1,2,P1,″a″]==[2,″a″]
[1,2,″a″,r1]&[r 2,2,P1,″a″]==[1,2,″a″,r1,r2,P1]
P1|P2==[r1,r2,r3,s1,s2,s3]
本实施例中,对序列或排列的汇总运算举例如下:
A为序列或排列,x为表达式:
A.count()为序列或排列中成员的个数。
A.sum(x)为针对所有成员计算出的表达式x的和。
A.avg(x)为表达式x的平均值。
A.min(x)为表达式x的最小值。
A.max(x)为表达式x的最大值。
A.id(x)为排序A并合并其所有的x表达式计算结果相同的成员,x缺省则合并相同的成员,最后返回成员序列。
例10.现有排列P为:
ID | 姓名 | 年龄 |
1 | ″张三″ | 28 |
ID | 姓名 | 年龄 |
2 | ″李四″ | 30 |
3 | ″王五″ | 18 |
4 | ″张三″ | 24 |
则有:
P.count()==4
P.sum(年龄)==100
P.avg(年龄)==25
P.min(年龄)==18
P.id(姓名)==[P(1),P(2),P(3)]
[3,1,5,3,″a″,″ab″,″a″].id()==[1,3,5,″a″,″ab″]
本方法中,可以一次性的对序列或排列的每个成员运算同一表达式并返回结果序列。本实施例中举例如下:
A为序列或排列,x为表达式,A.(x)为针对A的每个成员计算x的值并返回x的结果序列。
例11.基于例10中的排列P,另有序列A=[1,2,3,4],则有:
P.(姓名)==[″张三″,″李四″,″王五″,″赵六″]
P.((年龄-20)*0.2)=[1.6,2,-0.4,0.8]
A.(~*~)==[1,4,9,16]
本实施例中,对序列或排列的选出运算举例如下:
A为序列或排列,x为表达式,A.select(x)为找出A中所有能使x表达式为真的记录,并组成序列返回。
例12.基于例10,则有:
P.select(~>24)==[P(1),P(2)]
我们可以用如下的方法找出P中年龄最大的一条或多条记录:
a=P.max(年龄)
r=P.select(~==a)
r便是年龄最大的记录,为[P(2)]。
本实施例中,对序列或排列的排序运算举例如下:
A为序列或排列,x为表达式,A.sort(x)函数的作用是返回A的成员按照表达式x值的升序重新排列后的序列。
例13.现基于例10中的排列P,执行:
C=P.sort(年龄)
而后就有:
C==[P(3),P(4),P(1),P(2)]
本实施例中,对序列或排列的分组运算举例如下:
A为序列或排列,x为表达式,A.group(xi...)函数的作用是把A的成员按照表达式xi分组,使得每个组内的表达式xi...的值全部相等,返回所有的组序列组成的序列。
例14.现有如下排列P:
名字 | 地区 | 销售额 |
″张颖″ | ″北京″ | 100000 |
″王伟″ | ″广州″ | 150000 |
″李芳″ | ″上海″ | 300000 |
″郑建杰″ | ″北京″ | 500000 |
″赵军″ | ″上海″ | 100000 |
″孙林″ | ″北京″ | 350000 |
″金士鹏″ | ″北京″ | 230000 |
″刘英玖″ | ″广州″ | 160000 |
″张雪眉″ | ″北京″ | 430000 |
″王明″ | ″上海″ | 170000 |
现执行:
A=P.group(地区)
则现在A为:
[[P(1),P(4),P(6),P(7),P(9)],[P(2),P(8)],[P(3),P(5),P(10)]]
序列内的成员为另三个序列,三个序列内分别是北京、广州、上海的记录。
为直观一些,可以将它转换为一个排列,执行代码:
P2=A.new(~(1).地区:地区,~:员工)
则可以得到如下的P2:
地区 | 员工 |
″北京″ | [P(1),P(4),P(6),P(7),P(9)] |
″广州″ | [P(2),P(8)] |
地区 | 员工 |
″上海″ | [P(3),P(5),P(10)] |
在这种结构中,每个组内的记录都是直接从原始排列P中调用的,在这种结构下做一些常用的统计会非常方便,例如现在直接使用
P2(1).员工.sum(销售额)
即可返回北京地区的销售总额,类似的:
P2(2).员工.avg(销售额)
就可以返回广州地区雇员的人平均销售额。
本实施例中,对序列或排列的连接运算举例如下:
xi是序列或排列,yi为对应的表达式,join(xi:yi:Fi,...)函数的作用是,按照xi中yi值相等的规则连接各个xi,返回以Fi为各个字段名的排列,每个Fi的值都是相应的xi中的记录。
即通过多个序列或排列中各自指定的表达式的相等关系来连接它们,并创建索引排列。
例15.现有如下排列定义:
排列Employee:
ID | 姓名 |
1 | ″王伟″ |
2 | ″张学眉″ |
3 | ″张颖″ |
4 | ″张三″ |
排列Contract:
ID | 销售额 | 雇员 |
10248 | 150000 | 3 |
10255 | 100000 | 2 |
10258 | 200000 | 1 |
10263 | 500000 | 2 |
ID | 销售额 | 雇员 |
10269 | 230000 | 3 |
现在令:
P=join(雇员表:ID:雇员,订单表:雇员:订单)
则现在P为:
雇员 | 订单 |
Employee(1) | Contract(3) |
Employee(2) | Contract(2) |
Employee(2) | Contract(4) |
Employee(3) | Contract(1) |
Employee(3) | Contract(5) |
这样就把两个表按照雇员ID连接起来了,此后通过雇员查询订单情况就变得十分容易了,比如可以直接用select函数选出某雇员拿到的所有订单,或者用group函数对排列P进行分组,管理数据会更加方便。
一个综合应用实例
例16.下面以一个实际应用中常见的简单需求为例介绍一下本方法的实际应用过程。
现有如下排列定义:
排列Employee:a
雇员ID | 姓名 | 职务 |
1 | ″王伟″ | ″副总裁″ |
2 | ″张学眉″ | ″销售代表″ |
3 | ″张颖″ | ″销售代表″ |
4 | ″赵军″ | ″销售经理″ |
5 | ″李芳″ | ″销售代表″ |
排列Customer:c
客户ID | 姓名 | 地区 |
1021 | ″徐文彬″ | ″华北″ |
1022 | ″王炫皓″ | ″华北″ |
1023 | ″方建文″ | ″华东″ |
1024 | ″王俊元″ | ″华北″ |
1025 | ″胡继尧″ | ″华东″ |
1026 | ″林慧音″ | ″西南″ |
1027 | ″刘维国″ | ″东北″ |
排列Contract:b
订单ID | 金额 | 客户ID | 销售 |
10248 | 200000 | 1021 | 5 |
10255 | 350000 | 1022 | 3 |
10258 | 100000 | 1024 | 1 |
10263 | 220000 | 1024 | 3 |
10269 | 140000 | 1026 | 5 |
10270 | 280000 | 1021 | 1 |
10275 | 330000 | 1027 | 1 |
10277 | 120000 | 1024 | 4 |
10280 | 410000 | 1022 | 2 |
10285 | 230000 | 1023 | 1 |
10292 | 210000 | 1023 | 4 |
订单ID | 金额 | 客户ID | 销售 |
10295 | 280000 | 1025 | 2 |
10297 | 360000 | 1026 | 5 |
10265 | 470000 | 1027 | 2 |
10254 | 190000 | 1022 | 4 |
现在,我们想要得到这些数据:
1、客户“王炫皓”的订单总金额;
2、华北地区的订单数目及总金额;
3、每位雇员拿到的订单数目及订单总金额列表。
在本方法中可以用如下操作流程实现:
ID1=Customer.select(姓名==″王炫皓″)(1).客户ID
这样在变量ID1中就得到了客户“王炫皓”的客户ID,为1022,然后执行:
C1=Contract.select(客户ID==ID1)
这样便得到了客户“王炫皓”的所有订单的序列:
Contract1==[Contract(2),Contract(9),Contract(15)]
最后执行:
Amount1=Contract1.金额.sum()
于是在Amount1变量中我们就得到了客户“王炫皓”的订单总金额,为950000。
这样一步一步的计算,每一步的结果都可以保存下来供其他运算使用,比传统的一步完成的方式有更大的灵活性。当然在本方法中,以上过程也可以合并执行,甚至合并为一行代码执行:
Amount1=Contract.select(客户ID==Customer.select(姓名==″王炫皓″)(1).客户ID).金额.sum()
其结果也是一样的。
可以分步骤执行运算是本方法的特点,分步执行比传统的SQL中的一步完成有大得多的编程自由度,也令代码的逻辑结构更加清晰,更易于编写,也增强了可读性。
Table1=join(Customer:客户ID:客户,Contract:客户ID:订单)得到的Table1为:
客户 | 订单 |
Customer(1) | Contract(1) |
客户 | 订单 |
Customer(1) | Contract(6) |
Customer(2) | Contract(2) |
Customer(2) | Contract(9) |
Customer(2) | Contract(15) |
Customer(3) | Contract(10) |
Customer(3) | Contract(11) |
Customer(4) | Contract(3) |
Customer(4) | Contract(4) |
Customer(4) | Contract(8) |
Customer(5) | Contract(12) |
Customer(6) | Contract(5) |
Customer(6) | Contract(13) |
Customer(7) | Contract(7) |
Customer(7) | Contract(14) |
然后执行:
Contract2=Table1.select(客户.地区==″华北″).订单
现在Contract2排列中即为华北地区的所有订单,最后执行:
Count1=Contract2.count()
Amount2=Contract2.金额.sum()
于是在Count1变量中我们就得到了华北地区的订单数目,为10个;Amount2变量中就得到了华北地区的订单总金额,为1680000。
Table2=Customer.new(~:雇员,Contract.select(Contract.~.销售==Customer.~.雇员ID):订单)
其中select函数中的“Customer.~”代表提取当前外层的“Customer,,排列的当前循环所针对的记录。
得到的Table2为:
雇员 | 订单 |
Customer(1) | [Contract(3),Contract(6),Contract(7),Contract(10)] |
Customer(2) | [Contract(9),Contract(12),Contract(14)] |
Customer(3) | [Contract(2),Contract(4)] |
Customer(4) | [Contract(8),Contract(11),Contract(15)] |
Customer(5) | [Contract(1),Contract(5),Contract(13)] |
然后执行:
Table3=Table2.new(雇员.姓名:雇员,订单.count():订单数目,订单.
金额.sum():订单总额)
得到的Table3即为每位雇员拿到的订单总金额列表:
雇员 | 订单数目 | 订单总额 |
″王伟″ | 4 | 940000 |
″张学眉″ | 3 | 1160000 |
″张颖″ | 2 | 570000 |
″赵军″ | 3 | 520000 |
″李芳″ | 3 | 700000 |
以上是采用本发明所述的方法进行的部分运算和处理的演示实例。采用本发明所述的方法能够提供强大的运算和处理***,包括丰富的函数和运算方法,不但有强大的运算能力,数据计算过程也更加简洁直观。
本发明所述的方法并不限于具体实施方式中所述的实施例,本领域技术人员根据本发明的技术方案得出其他的实施方式,同样属于本发明的技术创新范围。
Claims (16)
1.一种数据处理方法,包括如下步骤:
(1)创建排列和记录的本体;
(2)按需要引用常量、变量、排列、记录组成有序的序列;
(3)对排列、序列和记录进行运算和处理,直至得到需求的结果;在运算和处理过程中,所有涉及到排列、序列和记录的操作和引用,除创建副本操作外,都使用指针进行引用。
2.如权利要求1所述的一种数据处理方法,其特征在于:在步骤(1)中,所述的排列是一种有序的成员列,排列中的成员为记录,记录的字段为数据,数据是任意的类型,包括是另一个记录、排列或序列。
3.如权利要求1所述的一种数据处理方法,其特征在于:在步骤(1)中,所述的排列和记录既能够从现有数据创建,也能够从关系数据库导入。
4.如权利要求1所述的一种数据处理方法,其特征在于:在步骤(1)中,所述的记录的本体保存在排列中,任何一条记录必然属于排列,记录最初只能通过排列的成员调用。
5.如权利要求1至4中任一项所述的一种数据处理方法,其特征在于:在步骤(2)中,所述的序列是一种数据结构,为有序的成员列,其成员是任意的类型,包括是另一个记录、排列或序列。
6.如权利要求1至4中任一项所述的一种数据处理方法,其特征在于:在步骤(3)中,所述的每个排列、序列和记录只存储一个本体,变量内、字段内或序列的成员内的引用都只存储目标记录、排列或序列的地址。
7.如权利要求6所述的一种数据处理方法,其特征在于:在步骤(3)中,对排列、序列和记录进行的运算和处理的结果仍能够用于下一步的运算和处理。
8.如权利要求1所述的一种数据处理方法,其特征在于:在步骤(3)中,所述的运算和处理包括对序列、排列和记录的本体进行修改。
9.如权利要求1所述的一种数据处理方法,其特征在于:在步骤(3)中,所述的运算和处理包括从排列中直接提取记录和从记录中直接提取字段。
10.如权利要求1所述的一种数据处理方法,其特征在于:在步骤(3)中,所述的运算和处理包括对序列直接进行交、并、和、差操作的集合运算。
11.如权利要求1所述的一种数据处理方法,其特征在于:在步骤(3)中,所述的运算和处理包括针对序列或排列成员的汇总运算,其中包括表达式的计数、求和、求平均、求最值、合并重复项操作。
12.如权利要求1所述的一种数据处理方法,其特征在于:在步骤(3)中,所述的运算和处理包括一次性对序列或排列的每个成员运算同一表达式并返回结果序列。
13.如权利要求1所述的一种数据处理方法,其特征在于:在步骤(3)中,所述的运算和处理包括在序列或排列中按条件对成员进行选出。
14.如权利要求1所述的一种数据处理方法,其特征在于:在步骤(3)中,所述的运算和处理包括按条件指定表达式对序列或排列中的成员进行排序。
15.如权利要求1所述的一种数据处理方法,其特征在于:在步骤(3)中,所述的运算和处理包括按任意指定的表达式对序列或排列中的成员进行分组,使表达式值相同的成员都分为一组。
16.如权利要求1所述的一种数据处理方法,其特征在于:在步骤(3)中,所述的运算和处理包括按指定表达式来连接多个序列或排列的成员的方法,使得从一个序列或排列的某一成员就能够直接获取到另一个序列或排列的与之相连接的成员。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201010119309A CN101789024A (zh) | 2010-03-05 | 2010-03-05 | 一种数据处理方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201010119309A CN101789024A (zh) | 2010-03-05 | 2010-03-05 | 一种数据处理方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN101789024A true CN101789024A (zh) | 2010-07-28 |
Family
ID=42532238
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201010119309A Pending CN101789024A (zh) | 2010-03-05 | 2010-03-05 | 一种数据处理方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101789024A (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104685496A (zh) * | 2012-09-28 | 2015-06-03 | 甲骨文国际公司 | 关系型数据库管理***中删减聚类表的磁盘块 |
CN104866571A (zh) * | 2015-05-22 | 2015-08-26 | 国云科技股份有限公司 | 一种在SQL Server中实现Sequence的方法 |
CN115552391A (zh) * | 2020-05-12 | 2022-12-30 | 谷歌有限责任公司 | Select *查询的零拷贝优化 |
-
2010
- 2010-03-05 CN CN201010119309A patent/CN101789024A/zh active Pending
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104685496A (zh) * | 2012-09-28 | 2015-06-03 | 甲骨文国际公司 | 关系型数据库管理***中删减聚类表的磁盘块 |
CN104685496B (zh) * | 2012-09-28 | 2018-03-06 | 甲骨文国际公司 | 关系型数据库管理***中删减聚类表的磁盘块 |
CN104866571A (zh) * | 2015-05-22 | 2015-08-26 | 国云科技股份有限公司 | 一种在SQL Server中实现Sequence的方法 |
CN115552391A (zh) * | 2020-05-12 | 2022-12-30 | 谷歌有限责任公司 | Select *查询的零拷贝优化 |
CN115552391B (zh) * | 2020-05-12 | 2023-08-25 | 谷歌有限责任公司 | Select*查询的零拷贝优化 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Borkar et al. | Big data platforms: what's next? | |
Berg et al. | History of databases | |
Goil et al. | High performance OLAP and data mining on parallel computers | |
US7870113B2 (en) | System and method for organizing data | |
Bonnet et al. | Reduce, you say: What nosql can do for data aggregation and bi in large repositories | |
US6334125B1 (en) | Method and apparatus for loading data into a cube forest data structure | |
ZA200100187B (en) | Value-instance-connectivity computer-implemented database. | |
CN102243664B (zh) | 一种复合字段的数据存储及查询方法 | |
Rolland | The essence of databases | |
Celko | Joe Celko's data and databases: concepts in practice | |
CN101789024A (zh) | 一种数据处理方法 | |
Pedersen | Managing complex multidimensional data | |
CN101908045A (zh) | 一种数据处理方法 | |
Zdepski et al. | An Approach for Modeling Polyglot Persistence. | |
Bicevska et al. | NoSQL-based data warehouse solutions: sense, benefits and prerequisites | |
Ayyavaraiah et al. | Database Management System | |
JP2001517338A (ja) | データベース内の情報をコンピュータにより動的に作成、変更、削除、保持する方法 | |
Revathi et al. | Auto JSON: An Automatic Transformation Model for Converting Relational Database to Non-relational Documents | |
Putzer | Data structures and data-base systems used in high energy physics: Modelling and implementation | |
Titirisca | ETL as a Necessity for Business Architectures. | |
CN111813777B (zh) | Olap自动创建并写入mq数据的方法及*** | |
Parimala et al. | Coalescing data marts | |
Nordbotten | Automatic files in statistical systems | |
Huawei Technologies Co., Ltd. | Database Design Fundamentals | |
Hmelnov et al. | An approach to information export from database for complex master-detail table hierarchies into a single flat table form. |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C12 | Rejection of a patent application after its publication | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20100728 |