在结构化数据计算任务中,会出现源数据来自多层外键关联的多个数据表的情况。例如要在订单系统中计算出比较特殊的订单,就遇到了下图中的多层外键结构。具体的计算需求是:求产品供应商和订单的客户在同一个地区的订单,这些订单按照客户分组求每组的订单总价和个数。
数据结构示意图如下:
如果用数据库完成,需要的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。
需要说明的是,集算脚本支持从数据库或者从文件中读取数据。因此,可以根据业务情况决定各个维表和事实表存储的位置,比如:数据不经常变动的存储在文件中,经常变动的存在数据库中。存储在文件系统中的数据越多,性能越好,数据库压力也越小。
相关推荐
MySQL连接**:`mysql_connect()`建立非持久连接,可以通过`mysql_close()`关闭连接。 - **26. 查询类型**:用于提取特定条件下的记录,生成新表。 以上就是从给定文件中抽取并解释的关键知识点,希望能帮助考生更...
这个名为“iw模板学习_按钮+表格显示+省市5级数据库.rar”的压缩包文件,显然是一个关于如何在Delphi中实现交互式用户界面(UI)设计的教程或示例,特别是涉及按钮、表格显示以及省市五级数据库的联动操作。...
2. 局域网(LAN):局域网是一种在有限地理范围内(如办公室、校园或建筑物内)连接计算机的网络,通常用于共享资源和高速通信。 3. Access数据库:Access是由Microsoft开发的关系型数据库管理系统,用户可以创建、...
14. Web.config文件:配置文件,包含应用程序设置、连接字符串等,可使用ConfigurationManager类读取。 15. ASP.NET身份验证:Forms、Windows、Passport和OAuth等,每种方式的安全性和实现机制不同。 16. 活动目录...
- 子查询可以嵌套多层,但需要注意性能问题。 - SQL还支持联合查询、传递查询等其他类型的查询。 #### 题目16:数据库字段宽度 - **知识点概述**:考查数据库字段宽度设置。 - **详细解析**:字段的宽度应考虑其...
计算机软件则包括应用软件(如发油系统)、系统软件(如数据库管理系统)以及单机、C/S(客户/服务器)、B/S(浏览器/服务器)和多层结构的应用程序。C/S结构和B/S结构的主要区别在于数据存储位置、系统性能、开发和...
统计计数问题涉及到表的行数计算,join的优化要求合理选择连接类型和连接顺序,以减少不必要的数据扫描。 锁及常见性能问题分析: MySQL中的锁主要分为共享锁和排他锁。锁的性能问题会导致数据库操作变慢,特别是在...
抽象工厂模式可以实现数据库连接池的统一管理,通过配置文件动态加载Oracle数据源。 #### 第七章:数据库导入导出 - **Oracle导入导出** Oracle提供了强大的数据导入导出功能,方便数据迁移和备份恢复。 - **...
此外,还可以利用子查询来实现多层嵌套查询。 #### 四、子查询与常用函数 **子查询** 子查询是在另一个查询内部执行的查询。它可以嵌套在SELECT、INSERT、UPDATE或DELETE语句中,用于从数据库中检索特定的信息。...
- 主键、外键、索引等概念是设计数据库结构时需要考虑的关键因素。 - ER图(实体-关系图)是一种常用的设计工具,用于表示实体之间的关系。 - **SQL总览:** - SQL是一种用于管理关系型数据库的标准语言,包括...
虽然FineBI支持创建复杂的图表类型,但多层饼图并非简单地通过普通饼图转换而来,而是需要特定的设置和配置才能实现。 #### 10. 数值类型只能放置数值类型的数据进行筛选 **知识点:** - **数值类型筛选:** 对于...
通过连接数据库API,如Python的psycopg2或Java的JDBC,程序员可以在应用程序中执行SQL语句,实现数据的动态操作和展示。 #### 查询——SELECT语句的使用 SELECT语句是SQL中最常用的操作,用于从数据库中检索数据。...
- **项目实践**:通过完成项目作业,如销售管理系统的设计与实现,增强综合运用知识的能力。 - **团队合作**:项目作业需要团队协作,培养沟通和解决问题的能力。 - **未来展望**:认识到数据库技术在各行各业的应用...
- **自连接**:演示如何实现表与自身的连接。 #### 18. 左、右连接 - **LEFT JOIN和RIGHT JOIN的区别**:比较这两种连接方式的不同之处。 - **连接条件**:说明LEFT JOIN和RIGHT JOIN中的连接条件如何定义。 - **...
- **在一个SELECT语句中使用多个表**:介绍如何通过JOIN关键字连接多个表,实现跨表查询。 - **等值联合**:使用等值条件进行表的连接。 - **不等值联合**:使用非等值条件进行连接。 - **外部联合与内部联合**:...
- 数据库技术的历史可以追溯到1960年代,最初的数据管理方式是文件系统。 - 1970年代,随着关系型数据库的出现,数据管理进入了一个新的阶段。 - 1980年代至1990年代,关系型数据库系统得到了广泛应用,成为主流...