Design Data-Intensive Applications 读书笔记三 查询语句
数据查询语句
引入关系模型的时候,它引入了一个新的查询数据的方法:SQL是一个声明式查询语言,IMS和CODASYL查询用的是命令式语言。
一些常用的编程语言都是命令式的。
在关系型语法汇总,你会这样写:
命令式语言告诉电脑按顺序执行操作。你可以想象电脑按行遍历代码,计算条件,更新变量,决定是否继续循环。
在声明式语言中,你只需要设定你想要的数据:什么条件能拿到结果,数据怎么传输(sored,grouped,aggregated),而不是如何达成这些目标。这些都取决于数据库系统的查询优化器来决定使用哪些索引,哪些连接操作,以及查询语句不同部分的执行顺序。
声明式语言很有吸引力,因为它比命令式语言更加清晰,更容易。更重要的是,它隐藏了数据库引擎的实现细节,这使得数据库性能的提升与查询语句隔离了。
声明式查询
声明式查询语句的优势不限于数据库。让我们比较命令式和声明式方法在浏览器中的应用。
假设你有一个关于海洋动物的网站。用户在浏览“鲨鱼”这一页,所以你将导航菜单中的“鲨鱼”标注选中,例如
选中标签标注为CSS类“selected”。当前选中页面为Shark。
现在你想要当前选中页面为蓝色背景,用CSS语言:
CSS选择器li.selectd>p 声明了我们想要变为蓝色风格的元素的模式:即那些直接父节点是一个<li>元素的所有<p>元素,并且CSS样式为selected。元素<p>sharks</p>在这个例子中符合这个模式,<p>Whale<p>不符合,因为父节点<li>缺少属性class=“selected”。
如果你使用XSL代替CSS,同样的功能:
XPath表达式 li[@class='selected']/p 等同于CSS选择器 li.selected > p 。CSS和XSL相同之处就是他们都是用于特定风格文档的声明式语言。
设想一下使用命令式语言要怎样做。在JavaScript中使用文档对象模型DOM API,结果可能是:
JavaScript设置元素<p>Sharks</p> 为蓝色背景,但是代码很难看。不仅比XSL和CSS难以理解,而且还有其他问题:
1、如果 selected 属性移除了(用户点击其他页面),蓝色也不会移除,即便是重新执行代码,所以元素会持续高亮显示直到整个页面重新加载。使用CSS,只要selected属性移除,浏览器能够自动检测到 li.selected > p 不再适用,移除蓝色背景。
2、如果你想使用新API,例如可能提高性能的 document.getElementsByClassName("selected") 或者 document.evaluate(),你必须重写代码。另一方面,浏览器渲染器可以不破坏兼容性而提高性能。
在Web浏览器中,使用声明式的CSS样式比JavaScript中的命令式操作要好。类似的,数据库中声明式的查询语句不命令式的查询API要好用。
MapReduce查询
MapReduce是用于在多台机器间批量处理海量数据的编程模型,由Google推广。由NoSQL数据库支持的有限格式,用于在多个文档中用于只读的查询。这章我们只讨论MongoDB对这个模型的使用。
MapReduce既不是声明式查询语句也不是命令式查询语句,而是介于两者中间:使用代码片段来表示查询逻辑,同时运行框架会不停的调用。它基于 map(也叫 collect) 和 reduce(也叫fold或者inject)这些存在于很多函数式编程语言中的函数。
在PostgreSQL中你可能如下表达查询
date_trunc('month', timestamp) 函数输入包含月份的时间戳,然后返回表示月份开始的时间戳,换句话说,它将一个时间戳降至最近的月份。
查询语句首先过滤出Shark 那一类,然后按照它们出现的月份整合分组,然后按照月份求和。
MongoDB中同样功能的MapReduce表达式如下:
标签1:表示只考虑 Sharks 这一类
标签2:map函数会对每个查询到的文档调用一次,this 关键字指定文档对象。
标签3:map函数提交了一个键(由年和月份组成)和一个值(观测到的动物的数量)
标签4:map函数提交的键值对会根据键值来分组,对于每个有相同键值的键值对集合会调用一次
标签5:reduce 函数将所有特定月份的动物观测数据加起来
标签6:最后结果写入到集合 monthlySharkReport
map 和 reduce 被限制了他们只能做什么,是纯粹的函数,意味着它们只能使用传入进去的数据,而且不能进行额外的数据库查询操作,而且不能有任何副作用。这些限制允许数据库任何时候以任何顺序运行函数,失败的时候重新执行。尽管有着诸多限制,他们依然是强大的。
对于集群来说,mapreduce是一个低等级的编程模型。高等级的编程模型比如SQL可以实现成MapReduce的操作流,但是目前很多SQL的分布式实现不使用MapReduce。注意SQL中没有限制它只能运行在一台机器上。而且MapReduce并没有在分布式查询操作上取得垄断。
对于高级查询来说能够在查询中使用JavaScript代码是个很好的特性。但是它不局限于MapReduce,一些SQL数据库能够使用JavaScript函数来扩展。
MapReduce在使用中有个问题,你不得不很小心地实现两个规定好的JavaScript函数,这比单纯写一个查询要难。而且,声明式查询语句能够给查询优化器提供更多提高性能的机会。因为这些原因,MongoDB2.2 增加了声明式查询语言:聚合管道aggregation pipeline。用这个语言写鲨鱼计数查询可能是:
aggregation pipeline在表达上类似于SQL的一个子集,但是它是使用基于JSON的语法而不是SQL的英语语法,这个差异可能造成理解困难。所以这个讨论的核心就是NoSQL系统可能碰巧再发明了SQL语句,尽管只是形式上的。
Design Data-Intensive Applications 读书笔记三 查询语句相关推荐
- 《How Tomcat Works》读书笔记(三)--Connector(连接器)
<How Tomcat Works>读书笔记(三)--Connector(连接器) 这是<How Tomcat Works>第三四章的读书笔记.主要写了Tomcat4.0默认的 ...
- mysql数据库权威指南_MySQL_MySQL权威指南读书笔记(三),第二章:MYSQL数据库里面的数 - phpStudy...
MySQL权威指南读书笔记(三) 第二章:MYSQL数据库里面的数据 用想用好MYSQL,就必须透彻理解MYSQL是如何看待和处理数据的.本章主要讨论了两个问题:一是SQL所能处理的数据值的类型:二是 ...
- 《编程之美》读书笔记(三):烙饼问题与搜索树
<编程之美>读书笔记三:烙饼问题与搜索树 薛笛 EMail:jxuedi#gmail.com 前面已经写了一些关于烙饼问题的简单分析,但因为那天太累有些意犹未尽,今天再充实一些内容那这个问 ...
- TCPIP详解Protocol 读书笔记(三) IP协议讲解
TCP/IP详解:Protocol 读书笔记(三) Chapter3 IP:网际协议 文章目录 TCP/IP详解:Protocol 读书笔记(三) Chapter3 IP:网际协议 IP协议 IP数据 ...
- 《Data Algorithm》读书笔记十一— 使用马尔科夫模型的智能邮件营销
<Data Algorithm>读书笔记十一 - 使用马尔科夫模型的智能邮件营销 1. 智能邮件营销 是什么? 根据顾客的交易历史观测(其实就是推测) "下一个智能邮件营销日期& ...
- 大数据HiveSQL学习笔记三-查询基础语法以及常用函数
大数据HiveSQL学习笔记三-查询基础语法以及常用函数 一.基础语法 1.SELECT -列名- FROM -表名- WHERE -筛选条件- 如:需要根据城市,性别找出匹配的10个用户 user_ ...
- 《淘宝技术这十年》读书笔记 (三). 创造技术TFS和Tair
前面两篇文章介绍了淘宝的发展历程和Java时代的变迁: <淘宝技术这十年>读书笔记 (一).淘宝网技术简介及来源 <淘宝技术这十年&g ...
- 《大型网站技术架构》读书笔记三:大型网站核心架构要素
来源:http://www.cnblogs.com/edisonchou/p/3806348.html 此篇已收录至<大型网站技术架构>读书笔记系列目录贴,点击访问该目录可获取更多内容. ...
- Spring揭秘 读书笔记 三 bean的scope与FactoryBean
本书可作为王富强所著<<Spring揭秘>>一书的读书笔记 第四章 BeanFactory的xml之旅 bean的scope scope有时被翻译为"作用域&quo ...
最新文章
- php文件内含有隐藏的^m字符,【整理】如何取消Linux下,vi中显示的^M符号
- 商汤科技举办病理、放疗两大MICCAI国际挑战赛,推动AI医疗落地
- php协议任意文件读取
- 【项目管理】ITTO-成本管理
- MFC中添加的ID资源号提示找不到声名问题
- selenium持续集成_使用Selenium进行Spring Boot集成测试
- Js获取短信验证码前段效果
- iphone型号表_iphone网络制格式怎么看,如何看两网三网、美版、欧版和国行信号到底有么有区别...
- 二叉搜索树的第k个节点
- BOM 之 screen history
- BZOJ5336 DP套DP
- JUL、JCL、Log4j、Slf4j各种日志框架的使用
- 关于Chrome浏览器设置启用Flash插件
- CART算法(机器学习)
- 带滤波器的PID控制仿真-3(Simulink仿真)
- 学习笔记 | 美团后台笔试+一面+二面
- 地址转换和端口映射及内网穿透的区别
- 杭电ACM:人见人爱A-B
- sysstat 工具详细说明(一)
- 【图像数学形态学处理】膨胀与腐蚀运算