SQL:王者归来

“SQL已经过时了“,”传统关系项目数据库都黔驴技穷满足工作要求“,”NoSQL,大数额是初时代之名堂“。我们曾听到最多关于这方面的话题,不光是于数据库范围外,在数据库之外的园地大家仍探讨这这样的话题。但是,这么说实在对也?在我看来,SQL不但没有过时,他的光华才刚刚开始。在当下首文章中,我们来探讨一下SQL语句以现底支付过程被负着同种植怎样的角色。

SQL的诞生

SQL最早得追溯到1970
IBM研究为主,这里正是关系项目数据库诞生的地方。那个时刻,数据查询是一律项大烦碎的工作,需要大量的计算,中间结果,各种数学公式和定义交织在联名。Donald
Chamberlin和Raymond
Boyce两员博士发现了数额查询的瓶颈,开始针对查询语句做全新的概念。他们之落脚点是如果给没有数学基础之总人口也得以由此查询语句来打数据库被觅数据。在马上那个年代,C语言还算是高档语言的领军人物,当时SQL的设计者认为,他们若设计同样种植类似人类语言的数据库查询语句,经过几年努力,在1974年SQL终于诞生了,之后的几十年里SQL很快提高变成数据库语言的规范,几乎拥有的涉嫌项目数据库,System
R, Ingres, DB2, Oracle, SQL Server, PostgreSQL,
MySQL都实现了对SQL的支撑。

SQL确实充分好用,也吸收大家之怜爱,但是事情在1989年互联网发明之后出现了变。我们且曾见证了互联网的突出于合改变了人人的生活节奏。数据的发为指数级数增长,于是人们发现了关联项目数据库的局限,数据模型的依样画葫芦,数据库服务器的恢宏等等。互联网两好巨头google和亚马逊先后发表了非关系型数据库产品,google于2004年颁布MapReduce并当2年后发布Bigtable,2007年亚马逊发布Dynamo。在及时事后非关系型数据库如雨后春笋一般涌现,受Bigtable和Dynamo的熏陶,Cassandra于2008年颁发,接下一样年内基于文档的非关系型数据库MongoDB也叫创造出来。由于这些体系还是自新实现的出品,他们一些都选择躲避SQL的镇套路。

NoSQL好之纽带,错误的命名

自己先行叫大家澄清一下SQL和NoSQL的却别:

- SQL (Structured Query Language)数据库,指关系型数据库。主要代表:SQL Server,Oracle,MySQL(开源),PostgreSQL(开源)。

- NoSQL(Not Only SQL)泛指非关系型数据库。主要代表:MongoDB,Redis,CouchDB。

NoSQL之所以发展的如此的快,主要受益于尚未说明结构的牢笼,开发简单,分布式结构,查询性能高等特点。但是因之带动了过多负面影响,光是NoSQL的类就多上两百多种,选型就改为一个让丁头疼的题材。其次,在从来不SQL语句的增援下进行多少解析会使广大的DBA抓狂,为了获得一个数据解析结果,往往使进行多单步骤的乘除,然后统计测算结果最后得出结论,在SQL中恐同词话就是化解的题目如以NoSQL中更多手续才能够形成。

最广泛的例子就是于NoSQL中展开多表联合查询,这在SQL中凡是略的莫能够重新略的操作,只要以多只关系表JOIN在一块儿就可以查询他们的数目。但是,由于NoSQL没有说明结构的概念,而且像MongoDB这样的NoSQL产品建议把有关数据总体存一个Collection内,那么当出现如查询多个Collection之间的数据多总人口仅能够在应用程序层面解决,但就会带几只问题:
NoSQL之所以发展之这样之快,主要受益于无说明结构的封锁,开发简单,分布式结构,查询性能高等特点。但是盖这个带动了众多负面影响,光是NoSQL的档次就基本上上两百大抵栽,选型就变成一个为人口头疼的题材。其次,在未曾SQL语句的佑助下进展数据解析会使得广大的DBA抓狂,为了博一个多少解析结果,往往要拓展多单步骤的乘除,然后统计测算结果最后得出结论,在SQL中恐怕同词话虽缓解之问题使以NoSQL中经历多少步骤才能够完成。

太广大的事例就是当NoSQL中进行多表联合查询,这当SQL中凡概括的未可知再次简单的操作,只要用大半只关系表JOIN在协同就是足以查询他们之数码。但是,由于NoSQL没有说明结构的定义,而且像MongoDB这样的NoSQL产品建议将有关数据全是一个Collection内,那么当起而询问多个Collection之间的数量多丁仅仅会于应用程序层面解决,但迅即会带动几个问题:

- 应用程序只能由开发人员维护,DBA很难对应用程序进行开发和调试。

- 应用程序层逻辑比较复杂,将多表联合操作放到里面增加了程序的维护难度。

- 由于相关数据都加载到应用程序层,这需要更多的内存来进行数据的联合操作,如果算法写的不好有可能还会出现O(n2)的时间复杂度代码,严重影响程序性能。

- 像SQL语句那样的JOIN操作转换成程序代码可能需要多次搜索数据库,这需要多次磁盘IO操作,再次影响了性能。

自,为了解决是题目部分NoSQL数据库提供了同步查询的支撑,比如像MongoDB支持Aggregation
Framework,可以通过下的方法进行

db.orders.aggregate([     {       $lookup:         {          

    from: "inventory",          

    localField: "item",          

    foreignField: "sku",          

   as: "inventory_docs"        

}    } ])

面的代码对orders表和inventory表进行共同查询,这仅仅是千篇一律不成简单询问,要是牵扯到三摆或四摆表代码会再也扑朔迷离,可以看看这样的操作语句DBA很不便掌握,相比SQL而言它确实复杂不丢。当然有一对器得以帮忙大家简化上面的操作,例如dbKoda供了图形化的询问方式如下所示。但是如此的操作照旧过于复杂。

image.png

此地连无是说NoSQL数据库不再流行,相反NoSQL为咱带了前所未有的感受。例如,传统关系项目数据库是根据磁盘存储,在NoSQL数据库被,我们得以对数据库进行几家无界定的档次扩展,从而避免了由磁盘速度所发生的瓶颈。在并未说明结构约束的景象下开展数量扩展,升级是同等码使人喜欢的作业。但是NoSQL不能够当同样种植数据库语言有,在SQL世界中,不论什么样的涉嫌项目数据库都支持标准SQL语句。但是在项目层出不穷的NoSQL数据库中,不存在一个正规语言可以匹配所有NoSQL数据库的操作。几乎拥有NoSQL产品还是基于自己之特色与需来好的,所以他们中从来不最好多之共通点,开发人员在数据库中的搬迁遇到前所未有的挑战。在关系项目数据库里,如果你从Oracle开发,想转投SQL
Server阵营,你如消费的代价会丢掉那个多,学习成本相对比较逊色,可以说勿欲重新打新入门。关系项目数码库导出来的数据多还好管与专业SQL语法兼容,这当数据迁移方面有所良好的优势。反观NoSQL,你以越两栽不同NoSQL产品常常中心需要从头开始学习,学习成本持续困扰着大开发人员。我怎么说NoSQL是一个砸的命名,可以望NoSQL鼓吹的卖点是退SQL,但是又将无数全不同类型的数据库放到一个命名空间受到,比如图数据库Neo4j和依据列的Cassandra是了两样档次的成品,但却使放开一个给NoSQL的命名空间下,感觉差强人意。所以,从这一点上说NoSQL的向上遇到了瓶颈,人类作为同样种植高度智慧的物种,一定会找到代替的法来缓解这的题材。

大数据

数据的增进不仅是量上的加码,更多的凡数据源的充实,多种数据源的数码并到联合必然会并发数量格式的非匹配,存储空间的限定等题材。于是充分数额框架接踵而来,其中的佼佼者可以算是Hapoop和Apache
Lucene两可怜数量平台。但是,上面提到的题目对于大数额的觅同样是,以Hadoop为例看一下下的例子,Hadoop的Mapreduce用来统计文章中相同字出现的个数:

public void map(Object key, Text value, Context context

) throws IOException, InterruptedException {

StringTokenizer itr = new StringTokenizer(value.toString());

while (itr.hasMoreTokens()) {

word.set(itr.nextToken());

context.write(word, one);

}

}

}

public static class IntSumReducer

extends Reducer {

private IntWritable result = new IntWritable();

public void reduce(Text key, Iterable values,

Context context

) throws IOException, InterruptedException {

int sum = 0;

for (IntWritable val : values) {

sum += val.get();

}

result.set(sum);

context.write(key, result);

}

}

public static void main(String[] args) throws Exception {

Configuration conf = new Configuration();

Job job = Job.getInstance(conf, "word count");

job.setJarByClass(WordCount.class);

job.setMapperClass(TokenizerMapper.class);

job.setCombinerClass(IntSumReducer.class);

job.setReducerClass(IntSumReducer.class);

job.setOutputKeyClass(Text.class);

job.setOutputValueClass(IntWritable.class);

FileInputFormat.addInputPath(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));
    System.exit(job.waitForCompletion(true) ? 0 : 1);
  }
}

得看到为兑现一个着力的询问,我莫了多之解说上面语句的效益及意图,列于这边只是怀念去说明一下在NoSQL领域有着如此繁琐的询问功能。MapReduce要求开发人员写有方的代码,对于Java开发人员来说还算能够收到,但是于DBA来讲话要求他们成就地方代码的落实小牵强。从数据库角度来说我们吧不愿意见到这样繁琐的数据库查询语言。

故此,越来越多的NoSQL设计者开始筹划类SQL语言的查询语句,有些还是还当NoSQL中创造了SQL语句,例如Hive实现了SQL语句针对Hadoop的操作,例如地方那段MapReduce代码如果改用Hive来兑现即不过需要类似下面的口舌就得完成:

select words,count(words) CntWords from
(select explode(words) words from temp) i group by words order by CntWords desc

除外Hive以外,Apache
Drill实现了SQL对多种不同数据源的操作相当。再有,一些事关项目数据库厂家也初步设计针对性复杂数据结构的支持,并实现通过SQL语句进行水平扩展,例如:ClustrixDB,
DeepSQL, MemSQL, 和VoltDB。一些数据库云提供商Amazon Aurora 和 Google
Cloud
SQL也供了支撑对SQL语句的恢宏。正是出于SQL语句可以针对生数目的操作,这令DBA的劳作转移得愈加简单,顺手。DBA可以想操作一个玉关系项目数据库那样以上千只数据节点内展开充分数额查询。

SQL归来

SQL语言已于世家普遍接受,那么我们还要相差不起头NoSQL的分布式支持以及松散的数据结构定义。为了到的化解人们遇到的题目,我们一定要管彼此进行定程度及之组成,对于SQL和NoSQL数据库而言,是NoSQL向SQL语言靠近现实还是拿SQL数据库变成像NoSQL那样可以任意的进行分布式扩展容易为?用了关系项目数据库的口还知,很为难想象得花多长时间才会为MySQL、Postgres或者Oracle支持几百或几千玉节点上之分布式部署。相反,如果给NoSQL支持SQL语言或会见再度易于有。所以于SQL和NoSQL两者结合着,把SQL带进NoSQL领域,看上去还是于灵通之,前面已经关系了多少局就开始开了,像Hive,Apache
Drill等。

每当微机网络世界中生出这样一个术语:网络中的细腰(narrow
waist)。“细腰”是相同栽比喻的布道,如下图所示:

image.png

中档一重叠时叫叫做”网络层”。 这同叠就来IP (Internet Protocol) 这一个合计,
所以形象上深”细”。在那一味达到:传输层, 应用层,
这些重叠中的协商到,例如TCP,UDP,HTTPSQL Server等等。它们只能通过IP与下的各层通讯,
这种计划得据此”一切基于IP“来描述。同样的,
在网络层下面的物理层、数据链路层内容吗坏抬高。它们为只能通过IP与方的各层通讯,
这种设计对应地给叙为”IP兼顾一切“。这种规划来好出异常,益处是高层和底部的报道都经过IP来成功,实现比较简单;缺点是修改IP层会带好挺的熏陶。不过这样的构架已经是几十年,至今为止还算是使用的可比成。

此间我没关系要涉及网络布局为?我们怀念转手,数据库领域被之SQL,是休是就是是网络层的“细腰”呢?看下的布局图:

image.png

虽如咱本尚未发在尚未网络的时日一样,我们也一律无法生存在没有数据的一代。与网7层结构类似之是,数据也同等在7层结构,从SQL向上的应用层以及下一直顶多少存储的构架层。我们所欲的正是一个通用的接口构成以至构架的桥梁。这便是SQL的力,这如IP一样,他就是是数量构架中的通用接口。值得一提的是,SQL实际上承担的不仅是通用的数据接口,除此之外,SQL还是均等种有可读性的数量语言,这或多或少早就让广大数据开发人员所领。

小结

SQL归来,是的,我们无欲像NoSQL那样去描绘大量的代码来进展多少查询与摸索,我们就是学习新的语言还是新的技艺,但是咱更要保留高效率的劳作节奏。这个世界充满数据,数据无处不在,在我们身们,在我们身后。计算机软硬件技术协助咱处理解析这些数据,他们好让规划之够聪明,我们可择经过多种接口来体会我们身边的社会风气,或者我们得以选择SQL,因为他是恢复数据平衡的源动力。

作者简介

赵翼,从北京理工大学毕业之后转业IT工作就10不必要年,接触过的型类别繁多,有Web,Mobile,医疗器械,社交网络,大数量存储等。目前就职于SouthbankSoftware,从事NoSQL,MongoDB方面的开销工作。曾当GE,ThoughtWorks,元气兔担任前后端支出,技术总监等职务。

相关文章