为什么说 SQL 是最成功的第四代语言?

  45 年前,两名年轻的 IBM 研究员将一门关系型语言带到了数据库领域,旨在使用声明性的方式来操作数据。从 Don Chamberlin 和 Ramond Boyce 发表“SEQUEL:一门结构化的英语查询语言”以来,关系型模型和 SQL 已经得到了广泛扩展,并被用在大量的技术中,如 OLTP、OLAP、对象数据库、对象关系型数据库,甚至是 NoSQL 数据库。SQL 也为非关系型数据库带去了设计灵感,比如用于对象数据库的 SQL、用于对象关系的 SQL、用于 XML 的 SQL、用于空间数据的 SQL、用于搜索的 SQL、用于 JSON 的 SQL、用于时序数据的 SQL、用于流的 SQL,等等。各种与数据打交道的 BI 工具也使用了 SQL。事实上,SQL 是最成功的第四代语言。

  SQL 之所以神秘,是因为它的强大。

  SQL 以关系代数为基础,目标是提供一种接近英语的查询语言:

  具有声明性;

  可以通过组合的方式写出复杂的查询;

  可以利用由 Edger F Codd 开发的关系型模型。

  大数据试图在数据仓库领域补足或替换关系型系统,但它们仍然使用了 SQL。Hive、Impala、drill、BigSQL 都使用了基于 SQL 的语言、优化器,并使用了与 SQL 相似的大规模并行处理。它们还时不时地增加新的 SQL 特性。SQL 中的数据存储格式、数据模型和查询处理的分离带来了一些非常重要的好处。在 SQL 诞生以来的 45 年当中,很多数据库来了又去。NoSQL 运动浪潮甚至在无意中暗示了 SQL 和 SQL 数据库即将死掉。但 SQL 阵营很坦然地面对这个问题,Don Chamberlin 最近表示:“当一门语言被广泛认可,以至于其他语言开始标榜自己不同于这一门语言时,说明这门语言一定表现得很好”。

  另一个数据库阵营是 NoSQL。虽然现在对 NoSQL 的定义是“Not Only SQL”,但其实 NoSQL 在最开始想要远离 SQL,并尝试使用其他语言和框架,比如 map-reduce。但在十年之后,几乎每一个流行的 NoSQL 数据库都有了 SQL 变种:Couchbase 的 N1QL、Cassandra 的 CQL 和 Elasticsearch 的 ElasticSearch SQL。你可能会说:“MongoDB 并没有 SQL”。但我敢肯定地说:“它将会有一个非常简单的 SQL 实现”。

  关系型模型已经非常成功了,不过数据库还支持其他各种数据模型:JSON、图、XML、时序、空间、长列、列式、文档,等等。这些数据库当中大部分都有自己的 SQL 实现版本,即使是 NoSQL 数据库也实现了 SQL 或者受 SQL 启发的查询语言。即使是在最性感的“数据科学”领域,SQL 仍然是一项非常被看重的技能。

  现在,NoSQL 数据库中的 SQL 项目比 SQL 数据库中的 SQL 项目还要多。

  为什么 SQL 会如此成功?

  可声明性:你只要声明好要输出什么,查询引擎会为你找到最优化的方式来执行查询。Pat Seliner 等人在 1979 年发明的基于成本的优化器一直在持续地提升 SQL 的查询速度。这也提高了其他新进者的准入门槛。最近的一篇 Apache Hive 论文解释了优化器的复杂性。

  SQL 不只是被用在“查询”方面,它也被用来更新数据,而存储过程、UDF(用户自定义函数)通过结合过程语言和声明性的 SQL 扩展了 SQL 的能力。

  SQL 具有非常好的可延展性。SQL 标准经过多次扩展,每次都加入了很多新特性、新语法和新的关键字。可以肯定的是,并不是所有 SQL 标准都是一样的。即使是 RDBMS 的传统 SQL 实现也不会完全兼容,除非在写 SQL 时非常小心地考虑兼容性问题。除了这些之外,SQL 的精髓都是一样的。SQL++ 是 SQL 进化的一个很好的例子。Don Chamberlin 和 Mike Carey 就 SQL 是否需要支持复杂的数据模型进行过讨论,以便让用户和开发人员可以方便地访问 JSON 格式的数据。Don 撰写的“SQL++ For SQL User: A Tutorial”一书介绍了 SQL++ 的发展情况,SQL++ 是一门被设计用来处理 JSON 数据模型的语言,同时与 SQL 兼容。

  SQL 为我们带来了新的想法,扩展了新的数据类型、访问方式和应用场景。

  SQL 本身与数据表示是分离的,可以被用在非关系型数据上,比如 CSV、JSON 以及其他所有的大数据格式。有些人认为关系型模型表示非常死板,所以认为 SQL 也是死板的。但事实上,对于给定的 schema,SQL 可以实现任意数据格式的 SELECT、连接、分组、聚合。

  SQL 的支持情况

  既然 SQL 现在已经无处不在,我们就有必要对 SQL 的支持情况进行一番了解。

  了解每种工作负载的特点和目标。例如,是交互式的应用程序还是交互式分析?抑或是批次分析或 BI?

  SQL 所支持的语句反应了运维能力。

  在表达式(标量、聚合、布尔值)、连接(内连接、左 / 右 / 全连接)、子查询、视图、排序、分页(LIMIT/OFFSET)方面的能力。

  索引:没有索引的 SQL 只是一个图灵机原型。

  优化器:查询重写、选择正确的访问路径、创建最优的查询执行路径让 SQL 成为最成功的第四代语言。有一些带有基于规则的优化器,有一些则带有基于成本的优化器,有一些二者兼而有之。优化器是非常重要的一个因素,一般的测试基准(如  TPC-C、TPC-DS、YCSB、YCSB-JSON)在这方面帮不上什么忙。

  有句话是这么说的:“性能、性能和性能是数据库最重要的三件东西”。对工作负载进行性能方面的测试是非常关键的,YCSB 和它的扩展 YCSB-JSON 可以在这方面帮上忙。

  SDK:丰富的 SDK 和语言支持可以加快开发速度。  大连妇科医院××× http://mobile.dlgcyy.cn/

  BI 工具支持:对于大型的数据分析来说,BI 工具的支持是非常重要的。

  N1QL 作者 Gerald Sangudi 曾经表示,SQL 是非常成功的,因为它代表了数据处理的基本操作。SQL 支持一组丰富的操作,SELECT、连接、嵌套、分组、聚合、HAVING、WINDOW、排序、分页,等等。在谈到数据操作时,这些就是我们要考虑的所有东西吗?这个问题还有待观察,不过我们可以肯定的是,其他语言(比如 Python 和 Java)正在为这些数据操作添加运算符。或许其他的语言也会跟风。SQL 已经走到了关系型模型没能走到的地方。



原文地址:https://blog.51cto.com/14198725/2378824

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读752次。关系型数据库关系型数据库是一个结构化的数据库,创建在关系模型(二维表模型)基础上,一般面向于记录SQL语句(标准数据查询语言)就是一种基于关系型数据库的语言,用于执行对关系型数据库中数据的检索和操作主流的关系数据库包括Oracle、Mysql、SQL Server、Microsoft Access、DB2等非关系型数据库NoSQL(nOSQL=Not Only SQL),意思是“不仅仅是SQL”,是非关系型数据库的总称。除了主流的关系型数据库外的数据库,都认为是非关系型主流的NoSQ.._redis是非关系型数据库吗
文章浏览阅读687次,点赞2次,收藏5次。商城系统中,抢购和秒杀是很常见的营销场景,在一定时间内有大量的用户访问商场下单,主要需要解决的问题有两个:1. 高并发对数据库产生的压力;2. 竞争状态下如何解决商品库存超卖;高并发对数据库产生的压力对于第一个问题,使用缓存来处理,避免直接操作数据库,例如使用 Redis。竞争状态下如何解决商品库存超卖对于第二个问题,需要重点说明。常规写法:查询出对应商品的库存,判断库存数量否大于 0,然后执行生成订单等操作,但是在判断库存是否大于 0 处,如果在高并发下就会有问题,导致库存_php库存结余并发
文章浏览阅读1.4k次。MongoTemplate开发spring-data-mongodb提供了MongoTemplate和MongoRepository两种方式访问MongoDB,MongoRepository的方式访问较为简单,MongoTemplate方式较为灵活,这两种方式在Java对于MongoDB的运用中相辅相成。_springboot插入指定的mongodb数据库
文章浏览阅读887次,点赞10次,收藏19次。1.背景介绍1. 背景介绍NoSQL数据库是一种非关系型数据库,它的特点是可以存储非结构化的数据,并且可以处理大量的数据。HBase是一个分布式、可扩展的列式存储系统,它是基于Google的Bigtable设计的。HBase是一个开源的NoSQL数据库,它的核心功能是提供高性能的随机读写访问。在本文中,我们将对比HBase与其他NoSQL数据库,例如Redis、MongoDB、Cass...
文章浏览阅读819次。MongoDB连接失败记录_edentialmechanisn-scram-sha-1
文章浏览阅读470次。mongodb抽取数据到ES,使用ELK内部插件无法获取数据,只能试试monstache抽取mongodb数据,但是monstache需要mongodb replica set 模式才能采集数据。############monstache-compose文件。#replicas set 启动服务。# 默认备份节点不能读写,可以设置。# mydb指的是需要同步的数据库。#登录主mongodb初始化rs。#primary 创建用户。# ip地址注意要修改。# ip地址注意要修改。_monstache csdn
文章浏览阅读913次,点赞4次,收藏5次。storage:fork: trueadmin登录切换数据库注意: use 代表创建并使用,当库中没有数据时默认不显示这个库删除数据库查看表清单> show tables # 或者 > show collections表创建db.createCollection('集合名称', [options])table1字段类型描述capped布尔(可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。_mongodb5
文章浏览阅读862次。Centos7.9设置MongoDB开机自启(超全教程,一条龙)_mongodb centos开机启动脚本
文章浏览阅读1.3k次,点赞6次,收藏21次。NoSQL数据库使用场景以及架构介绍
文章浏览阅读856次,点赞21次,收藏20次。1.背景介绍1. 背景介绍NoSQL数据库是一种非关系型数据库,它的设计目标是为了解决传统关系型数据库(如MySQL、Oracle等)在处理大量不结构化数据方面的不足。NoSQL数据库可以处理大量数据,具有高性能、高可扩展性和高可用性。但是,与关系型数据库不同,NoSQL数据库没有固定的模式,数据结构也不一定是表格。在NoSQL数据库中,数据存储和查询都是基于键值对、列族、图形等不同的...
文章浏览阅读416次。NoSQL定义:非关系型、分布式、开放源码和具有横向扩展能力的下一代数据库。由c++编写的开源、高性能、无模式的基于分布式文件存储的文档型数据库特点:高性能、高可用性、高扩展性、丰富的查询支持、可替换已完场文档某个指定的数据字段应用场景:社交场景:使用mongodb存储用户信息游戏场景:用户信息,装备积分物流场景:订单信息,订单状态场景操作特点:数据量大;读写操作频繁;价值较低的数据,对事物性要求不高开源、c语言编写、默认端口号6379、key-value形式存在,存储非结构化数据。_nosql
文章浏览阅读1.5k次,点赞3次,收藏2次。Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException: Failed to create socket. at redis.clients.jedis.DefaultJedisSocketFactory.createSocket(DefaultJedisSocketFactory.java:110) at redis.clients.jedis.Connection.connect(Conne_redis.clients.jedis.exceptions.jedisconnectionexception: failed to create so
文章浏览阅读6.5k次,点赞3次,收藏12次。readAnyDatabase(在所有数据库上都有读取数据的权限)、readWriteAnyDatabase(在所有数据库上都有读写数据的权限)、userAdminAnyDatabase(在所有数据库上都有管理user的权限)、dbAdminAnyDatabase(管理所有数据库的权限);:clusterAdmin(管理机器的最高权限)、clusterManager(管理和监控集群的权限)、clusterMonitor(监控集群的权限)、hostManager( 管理Server);_mongodb创建用户密码并授权
文章浏览阅读593次。Redis是一个基于内存的键值型NoSQL数据库,在实际生产中有着非常广泛的用处_搭建本地redis
文章浏览阅读919次。Key 的最佳实践[业务名]:[数据名]:[id]足够简短:不超过 44 字节不包含特殊字符Value 的最佳实践:合理的拆分数据,拒绝 BigKey选择合适数据结构Hash 结构的 entry 数量不要超过 1000(默认是 500,如果达到上限则底层会使用哈希表而不是 ZipList,内存占用较多)设置合理的超时时间批量处理的方案:原生的 M 操作Pipeline 批处理注意事项:批处理时不建议一次携带太多命令。Pipeline 的多个命令之间不具备原子性。_redis高级实战
文章浏览阅读1.2k次。MongoDB 递归查询_mongodb数据库 递归
文章浏览阅读1.2k次。通过实际代码例子介绍:如何通过MongoTemplate和MongoRepository操作数据库数据_springboot操作mongodb
文章浏览阅读687次,点赞7次,收藏2次。首先欢迎大家阅读此文档,本文档主要分为三个模块分别是:Redis的介绍及安装、RedisDesktopManager可视化工具的安装、主从(哨兵)模式的配置。_redis 主从配置工具
文章浏览阅读764次。天下武功,无坚不摧,唯快不破!我的名字叫 Redis,全称是 Remote Dictionary Server。有人说,组 CP,除了要了解她外,还要给机会让她了解你。那么,作为开发工程师的你,是否愿意认真阅读此心法抓住机会来了解我,运用到你的系统中提升性能。我遵守 BSD 协议,由意大利人 Salvatore Sanfilippo 使用 C 语言编写的一个基于内存实现的键值型非关系(NoSQL)..._redis 7.2 源码
文章浏览阅读2k次。MongoDB 的增删改查【1】_mongodb $inc