对不起,必须放弃SQL!

尽管SQL很受欢迎,也很成功,但它又总是充斥着种种矛盾。

SQL可能笨拙又冗长,但开发人员又经常发现它往往是他们提取所需数据的最简单直接的方法。当查询写入正确时,它可以快如闪电,当查询出错时,它就会慢如蜗牛。SQL明明已经经历了几十年发展,但新功能仍然在不断增加。

不过这些悖论并不重要,因为市场已经表明:时至今日,即使出现了不少更新的、更强大的选择,SQL还是许多人的首选。无论是小网站还是大公司,各地的开发人员都知道SQL。

SQL的表格模型占据主导地位,以至于许多非SQL项目最终都添加了SQL的接口,因为用户需要它。这甚至适用于NoSQL运动,尽管NoSQL的发明初衷是为了摆脱旧的范式。但最终,似乎还是SQL赢了。

大家都知道,SQL有一定的局限性,但这并不足以让人们彻底放弃它。开发人员可能永远不会起身将所有数据从SQL中迁移出去。但是SQL的问题是真实的,足以给开发人员带来压力,有时候甚至需要对某些项目进行重新设计。

下面是我们希望放弃SQL的9个原因,尽管我们心知肚明我们可能做不到。

SQL让事情变得更糟的9种方式: 

  • 表格无法缩放
  • SQL不是JSON或XML原生的
  • 列集是一项耗费大量时间的工作
  • SQL不是实时的
  • JOINS是一个令人头疼的问题
  • 列是对空间的浪费
  • 优化器只是有时有用
  • 非规范化将表视为垃圾
  • 附带的想法会破坏你的数据库

1、表格无法缩放

关系模型喜欢表格,所以我们不断构建它们。这对于小型乃至普通大小的数据库来说都没问题。但这个模型要是用在真正的大型数据库上就会开始崩溃。

有些人试图通过将新旧数据库结合来解决这个问题,比如将分片集成到旧的开源数据库中。添加层似乎可以使数据更易于管理,并提供无限的规模。但这些增加的层可能隐藏地雷。根据分片中存储的数据量,SELECT或JOIN的处理时间可能会截然不同。

分片还迫使DBA考虑数据可能存储在不同的机器上,甚至可能存储在不同的地理位置上的可能性。缺乏经验的管理员在开始跨表搜索时,如果没有意识到数据存储在不同的位置,可能会感到困惑。模型有时会从视图中抽象出位置。

一些AWS机器配备了24tb的RAM。为什么?因为一些数据库用户需要这么多。他们在SQL数据库中有这么多数据,并且在一台机器上,在一块RAM中运行得更好。

2、SQL不是JSON或xml原生的

SQL在语言界可能是一种常青树,但它并不特别适合JSON、YAML和XML等较新的数据交换格式。所有这些都支持比SQL更分层、更灵活的格式。SQL数据库的核心仍然停留在关系模型中,表无处不在。

市场会想方设法掩饰这种常见的抱怨。使用正确的粘合代码添加不同的数据格式(如JSON)相对容易,但时间的损失不可避免,你要为此做好准备。

一些SQL数据库现在能够编码和解码更现代的数据格式,如JSON、XML、GraphQL或YAML作为本地特性。但是在内部,数据通常使用相同的旧表格模型进行存储和索引。

在这些格式之间转换数据要花费多少时间?用一种更现代的方式存储数据不是更容易吗?一些聪明的数据库开发人员继续进行实验,但奇怪的是,他们常常最终选择使用某种 SQL 解析器。

3、编组是一项耗费大量时间的工作

数据库可以在表中存储数据,而程序员编写处理对象的代码。设计数据驱动的应用程序的大部分工作似乎都是找出从数据库中提取数据并将其转换为业务逻辑可以处理的对象的最佳方法。然后,必须通过将对象中的数据字段转换为SQL upsert(即“update+insert”,“存在则更新,不存在则插入”)来解组数据。难道没有一种方法可以让数据保持随时可用的格式吗?

4、SQL不是实时的

最初的SQL数据库是为批处理分析和交互模式而设计的。具有长处理管道的流数据模型是一个相对较新的想法,它并不完全匹配。

主要的SQL数据库是在几十年前设计的,当时的模型设想数据库可以独立运行,而且可以像某种先知一样回答查询。有时他们反应迅速,有时则不然。这就是批处理的工作方式。

一些最新的应用程序要求更好的实时性能——不仅仅是为了方便,而且因为应用程序需要它。在现代的流媒体世界里,像静坐山间的大师那样岿然不动是行不通的。   

专为这些市场设计的最新数据库非常重视速度和响应能力。它们不提供那种复杂的SQL查询,因为这种查询会让一切都迟滞下来。

5、连接是一个令人头疼的问题

关系数据库的强大之处在于将数据分解成更小、更简洁的表。烦恼也如影随形。

使用join动态地重新组装数据通常是作业中计算成本最高的部分,因为数据库必须处理所有数据。当数据开始超出RAM的容量时,令人头疼的事情就开始了。

对于学习SQL的人来说,连接可能会令人难以置信地困惑。弄清楚内部join和外部join之间的区别仅仅是个开始。寻找将多个join连接在一起的最佳方式会使情况变得更糟。内部优化器可能会帮上忙,但是当数据库管理员要求一个特别复杂的组合时,它们就无能为力了。

6、列是对空间的浪费

NoSQL的一个伟大思想就是让用户从列中解脱出来。如果有人想向条目添加新值,他们可以选择他们想要的任何标记或名称。不需要更新模式来添加新列。

SQL的拥护者在该模型中只看到混乱。他们喜欢表格自带的顺序,不希望开发人员即时添加新字段。他们有一定的道理,但是添加新列可能非常昂贵和耗时,特别是在大型表格中。将新数据放在单独的列中并使用join对它们进行匹配,无疑会耗费更多的时间,并增加复杂性。

7、优化器只是有时有用

数据库公司和研究人员已经花费了大量时间来开发出色的优化器,这些优化器可以分解查询并找到排序其操作的最佳方式。

收益可能是显著的,但是优化器所能做的是有限的。如果查询需要一个特别大或者特别繁复的响应,那么优化器不能只是说,“你真的确定吗?”它必须汇总答案,然后按照指令去做。

有些DBA只有在应用程序开始扩展时才知道这一点。早期的优化足以处理开发过程中的测试数据集。但在关键时刻,优化器无法从查询中榨取更多的能量。

8、非规范化将表视为垃圾

开发人员经常发现自己陷入了两难境地:一方面,想要更快的性能,另一方面精打细算,不想为更大、更昂贵的硬件付费。一种常见的解决方案是对表进行非规范化,这样就不需要复杂的连接或跨表操作。所有的数据都在一个长矩形中。

这不是一个糟糕的技术解决方案,而且它通常会有实效,因为磁盘空间已经变得比处理能力便宜。但是非规范化也抛弃了SQL和关系数据库理论中最聪明的部分。当数据库变成一个长CSV文件时,所有这些花哨的数据库功能几乎都消失了。

9、附加功能会破坏你的数据库 

多年来,开发人员一直在为SQL添加新特性,其中一些功能非常酷。但不得不提的是,这些花哨的功能通常是附加的,可能会导致性能问题。

一些开发人员警告说,你应该特别小心子查询,因为它们会减慢所有操作的速度。另一些人则表示,选择像公共表表达式、视图或窗口这样的子集会使代码过于复杂。代码的创建者可以阅读它,但是其他人在试图保持SQL的所有层和代的清晰性时都感到头痛。这就像在看诺兰的电影,只不过是用代码写的。

有些附加功能已经妨碍了之前行之有效的做法。窗口函数的设计是为了通过加速计算结果(如平均值)来加快基本数据分析的速度。但是许多SQL用户会发现并使用一些附加的特性。在大多数情况下,他们会尝试新功能,然后当他们的机器慢如蜗牛时才会注意到有些问题。之后,他们会需要一些有经验的DBA来解释发生了什么以及如何修复它。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/247478.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode(62)删除排序链表中的重复元素 II【链表】【中等】

目录 1.题目2.答案3.提交结果截图 链接: 删除排序链表中的重复元素 II 1.题目 给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。 示例 1: 输入:head [1…

像素、分辨率、频率、精度、延迟,关于光学动作捕捉镜头参数的那些事

精准度、分辨率、频率、延迟等参数是影响光学动作捕捉效果和还原度的关键因素。下面逐一介绍NOKOV度量动作捕捉系统的基础参数。 NOKOV度量动作捕捉系统的核心产品是光学动作捕捉镜头,用于捕捉被测物表面反光标记点的三维坐标数据。 从表中可以看到,不同…

Python自动化测试(unittest框架)

一、什么是框架 框架是由大佬开发或者专业的研发团队研发的技术骨架,框架是一个半成品,框架是对常用的功能,基础的代码进行封装的一个工具,这个工具对外提供了一些API,其他的开发者只需要调用框架的接口即可&#xff…

Windows进程机制

进程 进程要做任何事情,必须让一个线程在它的上下文运行。该线程负责执行进程地址空间包含的代码。每个进程至少要有一个线程来执行进程地址空间包含的代码。当系统创建一个进程的时候,会自动为进程创建第一个线程,这称为主线程(…

word文档怎么压缩?超级好用!

当Word文档体积过大时,会遇到传输慢、无法上传等问题,这时候可以通过压缩软件、压缩图片等方式减小Word文档体积,下面就一起来看下具体的操作方法吧。 方法一:嗨格式压缩大师 嗨格式压缩大师是一个专业的压缩软件,可以…

分享10个国内免费的AI绘画工具

谈到 AI 绘画,许多人会联想到 Midjourney、Stable Diffusion、DALLE2 等国外的知名绘画工具。 然而,这些国外的 AI 绘画工具大部分都是付费的,并且需要借助科学上网才能使用。这两个条件让许多人望而却步。 考虑到很多人无法进行科学上网&a…

绿色视角下的高校校园建设及能耗管理

摘 要:2019年住建部发布了《绿色校园评价标准》(GB/T51356—2019),将创建绿色校园提上了日程。绿色校园建设的目标是践行绿色发展理念,建立生态文明教育工作长效机制。创建绿色校园要从政府、社会、学校三个层面来实施,以加快高校…

【Spring Boot】Starter机制的使用及案例

一、引言 1、什么是SpringBoot Starter SpringBoot中的starter是一种非常重要的机制(自动化配置),能够抛弃以前繁杂的配置,将其统一集成进starter,应用者只需要在maven中引入starter依赖,SpringBoot就能自动扫描到要加载的信息并启…

【MIMO 从入门到精通】[P3]【Channel Estimation】

前言: MIMO 是无线通讯里面的核心技术之一.这里面主要参考 《Quick Introduction to MIMO Channel Estimation》 Professor and an IEEE Fellow:Iain 讲解一下 MIMO (multiple transmit antennas and multiple receivers)里面的信…

电脑出现错误0x80004005怎么解决,解决0x80004005的问题

当电脑出现0x80004005错误时,通常是由于系统或应用程序之间的通信问题或文件系统损坏引起的。该错误代码表示未指定错误,在Windows系统中较为常见。 一.解决0x80004005错误的步骤 重新启动电脑 有时候,错误只是一个暂时的问题,重…

后端项目操作数据库-中枢组件Service调用Mapper实现增删改查-实例

接上篇 使用MyBatis配置Mapper实现增删改查 1.Service的基本作用 Service在代码中的的作用是调用Mapper、被Controller调用。是后端项目中非常重要的组件。 用于设计业务流程、业务逻辑,以保障数据的完整性、有效性、安全性。 2. Service使用举例——“添加相册”…

MyBatis的逆向工程

MyBatis的逆向工程 正向工程:先创建Java实体类,由框架负责根据实体类生成数据库表。 Hibernate是支持正向工 程的 逆向工程:先创建数据库表,由框架负责根据数据库表,反向生成如下资源: Java实体类 Mapp…

【Trino权威指南(第二版)】Trino的架构、trino架构组件、 trino连接器架构的细节、trino的查询执行模型

文章目录 一. Trino架构1. 架构概览2. 协调器3. 发现服务4. 工作节点 二. 基于连接器的架构三. 查询执行模型1. 解析—>查询计划2. 查询计划 —> 分布式查询计划3. 运行阶段3.1. 基础概念切片:并行单元page 与 exchange算子pipeline切片的driverOperator 3.2.…

Python高级算法——线性规划(Linear Programming)

Python中的线性规划(Linear Programming):高级算法解析 线性规划是一种数学优化方法,用于求解线性目标函数在线性约束条件下的最优解。它在运筹学、经济学、工程等领域得到广泛应用。本文将深入讲解Python中的线性规划&#xff0…

连续型随机变量的概率密度

如果对于随机变量的分布函数,存在非负可积函数,使得对于任意实数,有: 那么就称为连续型随机变量,称为的概率密度函数,简称密度函数。

微信小程序合集更更更之实现雪花随机飘落

实现效果 写在最后🍒 更多相关内容,关注🍥苏苏的bug,🍡苏苏的github,🍪苏苏的码云~

为MES实施建立成功的团队:应对挑战并确保成功

前言 实施MES是一个复杂且具有挑战性的过程,需要协调良好的团队共同努力。 为了取得成功,建立一支具有专业技能、专业知识和共同愿景的团队组合成为致胜的关键。本文将探讨组建MES团队的关键要素,例如: 确定关键利益相关者和决策…

产品经理之Axure的元件库使用详细案例

⭐⭐ 产品经理专栏:产品专栏 ⭐⭐ 个人主页:个人主页 ​ 目录 前言 一.Axure的元件库的使用 1.1 元件介绍 1.2 基本元件的使用 1.2.1 矩形、按钮、标题的使用 1.2.2 图片及热区的使用 1.3 表单元件及表格元件的使用 1.3.1表单元件的使用 1.3.…

VSCode解决本地浏览器需要跨域问题

这里写目录标题 测试用代码执行代码后控制台报错现象解决方案 测试用代码 先把测试用的代码贴出来 测试代码结构 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Com…

基于CNN+数据增强+残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)+数据集+模型(四)

系列文章目录 基于CNN数据增强残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)数据集模型&#xff08;一&#xff09; 基于CNN数据增强残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)数据集模型&#xf…