在结构化数据计算任务中,会出现源数据来自多层外键关联的多个数据表的情况。例如要在订单系统中计算出比较特殊的订单,就遇到了下图中的多层外键结构。具体的计算需求是:求产品供应商和订单的客户在同一个地区的订单,这些订单按照客户分组求每组的订单总价和个数。
数据结构示意图如下:
如果用数据库完成,需要的SQL脚本如下:
select cid,count(ordered),sum(price*quantity) from orders left join customer on orders.cid=customer.cid left join region a1 on customer.city=a1.city left join product on orders.pid=product.pid left join supplier on product.pid=supplier.sid left join region a2 on supplier.city=a2.city where a1.region=a2.region and to_char(orderdate,’YYYY’)=? Group by cid
面来看一下采用集算器文件计算方案实现这个需求的方法。
定义网格参数year,编写多层外键关联计算的集算脚本orders.dfx如下:
A1:从本地文件建立订单表的文件游标,游标可以分段处理数据,防止出现内存溢出。
A2:在A1中过滤一年的订单数据,year是预先定义好的网格参数。
A3-A6:从本地读取维表的数据,依次是:客户、产品、供应商和地区。
A7:将客户序表中的“city”键值切换成地区序表中对应的记录引用。
A8:将供应商序表中的“city”键值切换成地区序表中对应的记录引用。
A9:将产品序表中的“sid”键值切换成供应商序表中对应的记录引用。
A10:将订单序表中的“pid”键值切换成产品序表中对应“pid”的记录引用。
A11:将订单序表中的“cid”键值切换成客户序表中对应“cid”的记录引用。
A12:在订单序表中,按照条件过滤。因为经过了A7-A11的切换,条件写为:pid.sid.city.region==cid.city.region。
A13:在过滤结果的基础上分组汇总。
A14:将A13返回给外部程序。
如果事实表orders表数据量很大,可以采用集算器的多线程并行计算方案,以提高处理性能。其他的维表比较小,可以装入内存。多个线程之间可以共享维表。
实现脚本如下:
A1-A4:从本地读取维表的数据,依次是:客户、产品、供应商和地区。
A5:将客户序表中的“city”键值切换成地区序表中对应的记录引用。
B5:将供应商序表中的“city”键值切换成地区序表中对应的记录引用。
C5:将产品序表中的“sid”键值切换成供应商序表中对应的记录引用。
A6:设置并行数。
A7:按照A6并行执行。
B7:从本地文件建立订单表的文件游标,每个线程处理一部分数据。
B8:将订单序表中的“pid”键值切换成产品序表中对应“pid”的记录引用。
B9:将订单序表中的“cid”键值切换成客户序表中对应“cid”的记录引用。
B10:在订单序表中,按照条件过滤。因为经过了A7-A11的切换,条件写为:pid.sid.city.region==cid.city.region。按照年份过滤。
B11:分组汇总。
B12:线程返回结果B11。
A13:纵向合并A7。
A14:再做一次分组汇总。
A15:向外部程序返回结果A14。
需要说明的是,集算脚本支持从数据库或者从文件中读取数据。因此,可以根据业务情况决定各个维表和事实表存储的位置,比如:数据不经常变动的存储在文件中,经常变动的存在数据库中。存储在文件系统中的数据越多,性能越好,数据库压力也越小。
相关推荐
删除表不是特别常用,特别是对于存在外键关联的表,删除更得小心。但是在开发过程中,发现Schema设计的有问题而且要删除现有的数据库中所有的表来重新创建也是常有的事情;另外在测试的时候,也有需要重新创建数据库...
外键以实体实现的在三层.rar外键以实体实现的在三层.rar
使用eclipse获取mysql数据库中的表结构以及主外键
专用于HIBERNATE中两个对象间的外键关联查询
在数据库MySQL中利用外键实现级联删除、更新等方面的内容。有兴趣可以看看。。
MySQL 外键
帮助您学会增加外键,在建表的时候没有加外键在之后加的方法
内包含外键约束模式,数据库的视图基本操作
mysql主外键操作连接文档,非常感谢原作者提供的资源。
最近在做数码相框上的嵌入式开发,开发过程中使用的SQLite数据库,但是编码的过程中,遇到个问题,SQLite不支持外键约束,外键约束会被解析但不会被执行。
SQL2008设置外键
Java~主外键关系~有图解~主外键关系~主外键关系
JAVA主键和外键详解,详尽的JAVA主键和外键详解,主外键的说明
表结构查询,主外键关联表名查询,
获得Microsoft SQL server外键集合,方便开发人员查看所有的外键,简化查询
需求是这样的,一个资源表有分类r_class_id(分类表id对应的外键) 创建者r_up_creator(用户表id对应的外键) 审核者r_ver_id (用户表id对应的外键),这时候该怎么将其都查询出来呢? 首先用左连接: select ...
grails生成的ddl.sql,整理出其中的外键关联关系
Access中如何建立外键关系,首先建立Course表,Student表,和SC表,建立和删除数据表关系。
hibernate外键实现一对一双向关联关系源码