NoSQL:一个帝国的崛起

NoSQL:一个帝国的崛起01关系数据库帝国现在是公元2009年,关系帝国已经统治了我们30多年,实在是太久了。1970年,科德提出关系模型,1974年张伯伦和博伊斯制造出了SQL,帝国迅速建立起了统治。从北美到欧洲,

大家好,又见面了,我是你们的朋友全栈君。

01关系数据库帝国

现在是公元2009年,关系帝国已经统治了我们30多年,实在是太久了。 

1970年,科德提出关系模型,1974年张伯伦和博伊斯制造出了SQL ,帝国迅速建立起了统治。 

从北美到欧洲, 从欧洲到亚洲,  无数程序员臣服在他的脚下。 

帝国给我们提供了良好的福利:

简单而强大的关系模型

灵活的SQL

还有我们非常喜欢的事务和ACID,把我们从底层并发的细节中解放出来。 

使用这些福利,程序员们开发了无数的系统,每个系统的核心都是关系数据库。 

时代在不断地变迁,编程语言的城头不断变换大王旗,但是存储在表格中的数据,一直岿然不动。 

数据永远是一个企业最宝贵的资产。 

但是帝国也给我们套上了沉重的枷锁:模式和规范化。 

帝国规定:必须事先定义好模式(表结构)才能保存数据! 

所有的数据至少得满足第一范式,甚至第二范式、第三范式、BCNF范式!

 如果实现不了,就会被投进监狱,对于某些部落来讲,即使是做一个简单的冗余字段,都会被别人耻笑。 

帝国宣称的SQL移植性也欺骗了我们,SQL虽然被标准化,但是每个厂商DB2, Oracle, SQL Server都有自己的方言! 

尤其是在计算日期和字符串操作。还有存储过程,几乎每个厂商都会自己搞一套,根本无法移植!

 

0危机

 

上世纪90年代,面向对象技术的流行给帝国带来了一次严重的危机: 

对象-关系的阻抗不匹配。 

“对象(Object)”有继承,子类,父类,关联,聚合,多态; 

而关系数据库就是简单的表格! 

他们是如此的不同,简直是水火不容,矛盾不可调和。

 <span role="heading" aria-level="2">NoSQL:一个帝国的崛起

那个时候,帝国的东边出现了一个叫面向对象数据库OODB的部落, 号称可以把Java对象,C#对象,Ruby对象等等都一股脑地、直接存储到OODB当中去。 

把对象直接保存到数据库?这实在是一个美妙的特性。 

但是OODB实在是不争气,很快偃旗息鼓,在几个小领地苟延残喘。 

2001年,有个叫Gavin King的27岁小伙子,开发了一个叫做Hibernate 的东西,在对象和关系之间搭了一座桥,叫O/R Mapping。 

<span role="heading" aria-level="2">NoSQL:一个帝国的崛起

这一下子赢得了Java 程序员的芳心。 

Hibernate再接再励,又推出了NHibernate, 打入了.NET的领地。 

随着iBatis, JPA等更多O/R Mapping工具和接口的出现,关系数据库帝国成功地度过了这一次的危机。 

后来有个好事者Martin Fowler,居然写了一本书《企业应用架构模式》, 在里边一本正经地把各种O/R Mapping的模式都总结了一遍:“单表继承”,“类表继承”,“活动记录”。。。。。。 

这一番骚操作又替关系数据库帝国续命20年不止。 

 

0新希望

 

没过多久,互联网大潮来了,历史再次给了我们一个机会。 

互联网的用户数如此之多,并发数如此之高, 让我们始料未及。 

数据量是如此巨大,数据种类如此丰富,更让我们目瞪口呆。 

文字、图片、链接、日志、社交关系,大量的数据蜂拥而至,单台机器上的数据库很快就撑不住了。  

帝国先是拼命扩容,恨不得把一台机器弄成1024G的内存,1024T的硬盘,还美名其曰垂直扩展。 

但是机器功能越强,价格就越贵,臣民们的税负越来越重,很快就受不了了。 

没办法,帝国只好做水平扩展,把数据分布在多台机器上,这需要精心的规划,还需要程序员和应用程序精确地记住每一份数据放在哪里。 

更要命的是,这种办法丢掉了帝国引以为傲的福利:事务和一致性 

<span role="heading" aria-level="2">NoSQL:一个帝国的崛起

 

 

0反抗

 

我决定反抗这个庞大的帝国,  我偷偷地带领着一帮志同道合的兄弟离开了,我们要新建一块清新自由的领地。  

我们仔细地研究了关系帝国的缺点,派出了几只小分队分头出击。 

誓师出征之时,我们对这四只小分队都提出了同样的要求:支持分布式和集群!!! 

第一支小分队由redis担任队长,memcached 担任副手,他们很快便取得了成功,因为他们打击到了关系帝国最大的缺点:高并发下,数据库IO非常缓慢。 

redis和memcached 做了一个大胆的决定,抛弃了硬盘,选择了比硬盘快几万倍的内存, 把数据以key-value的方式放入其中。 

超快的速度让程序员们非常喜欢,他们不仅把session,配置信息,购物车的数据放入其中。 

后来干脆把他俩当成了缓存来使用。 

<span role="heading" aria-level="2">NoSQL:一个帝国的崛起

 

第二支小分队由Mongodb带领,CouchDB辅佐,他们敏锐地瞄准了用关系数据表保存起来很别扭的数据。

 

<span role="heading" aria-level="2">NoSQL:一个帝国的崛起

 

<span role="heading" aria-level="2">NoSQL:一个帝国的崛起

订单到订单项和支付, 订单项到产品是典型的一对多关系,意味着数据是树状结构,那为什么不直接用一个JSON文档来表示呢?

  {    “orderId”:”1″,   

       “userId”:”123″,   

  ”lineItems”:[       

    {“productId”:”1356″,            “qty”:”1″        },       

             {  “productId”:”2375″,            “qty”:”2″        }   

  ],   

        “shippingAddress”:{        “type”:”xxx”,        “address”:”xxx”    },   

        “payment”:{        “type”:”alipay”,        “time”:”xxxx”    }

}  

MongoDB还和JavaScript,Node.js勾勾搭搭,把浏览器发来的JSON数据直接存储到MongoDB中,轻松又方便。 

第三支小分队的头领是Neo4j, 这家伙非常擅长图结构,对于社交网络、推荐系统的数据,用它来表示非常合适。

<span role="heading" aria-level="2">NoSQL:一个帝国的崛起

 

第四支小分队由HBase带领, Cassandra殿后, 他们都是列式数据库,百亿行 * 百万列的数据对于他俩来说稀松平常。

 <span role="heading" aria-level="2">NoSQL:一个帝国的崛起

 这个小分队也获得了巨大的成功,移动互联网所产生的海量数据,如日志、聊天记录,监控数据,物联网的数据,结构化并不强,非常适合用HBase这种列式数据库来存放。

 

0新的帝国

 

几年以后,四支小分队顺利班师,都带回了大批的程序员拥趸,因为适合的才是最好的。 

一个新的、可以和关系数据库抗衡的帝国悄然成型。 

经过一番激烈讨论,我们给帝国起了一个响亮的名称:NoSQL。 

意思是不要SQL! 

但是,加入NoSQL帝国的程序员发现我们也有非常明显的弱点: 

缺乏模式(如表结构)、数据完整性约束很弱、对事务的支持很弱,甚至干脆没有, 这引起了程序员的强烈不满和抗议。 

有不少人短暂尝鲜NoSQL以后,又抛弃了我们,重回SQL的怀抱。 

我们决定和关系数据库帝国议和,告诉他们说NoSQL的意思是Not Only SQL, 我们两大帝国应该取长补短,和平共处。 

经历了几年战火的关系数据帝国也看清楚了IT趋势,欣然接受。 

从此,数据库进入了混合存储的时代! 

 

公众号码农翻身

 

<span role="heading" aria-level="2">NoSQL:一个帝国的崛起

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/155549.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月3日 下午7:00
下一篇 2022年7月3日 下午7:00


相关推荐

  • php 中更简洁的三元运算符 ?:

    php 中更简洁的三元运算符 ?:

    2021年10月24日
    53
  • g ++在linux下编译rapidxml 使用与过程中出现的问题解决[通俗易懂]

    g ++在linux下编译rapidxml 使用与过程中出现的问题解决[通俗易懂]rapidxmlunderlinuxwithg++

    2022年7月17日
    11
  • 使用 multipass 管理 Ubuntu VMs

    使用 multipass 管理 Ubuntu VMsMultipass 是一个轻量级的 ubuntu 虚拟实例管理器 可以很快速的创建一个新的虚拟实例用来做开发测试很方便 Multipass 官网 Github 下载页面下载地址为 github 提供 可能很慢或打不开 可以复制页面上的的下载链接地址后使用下方代理地址尝试通过 Github 代理下载 https ghproxy com https github com CanonicalLtd multipass releases download v1 6 2 multipass 1 6 2 2B

    2026年3月19日
    2
  • Java和Python语言比较

    Java和Python语言比较背景作为一个 Java 老程序员 最实现一个功能 发现了 python 的实现代码 就直接拿过来用了 在改动的过程中 去官网看了 Pyhton 的语法 发现了和 Java 的几点不同 算是抛砖引玉 如有错误 欢迎指正 类型 Java 是周所周知的强类型语言 这个优势在大型项目中体现的很明显 比如 阿里和美团的后都是 Java 语言 但是也引入了不够灵活的毛病 Python 是弱类型语言更灵活一些 结

    2026年3月17日
    2
  • 深入理解设计模式之建造者模式

    深入理解设计模式之建造者模式老大突然拉住我,喜滋滋地告诉我:“公司很满意我们做的模型,又签订了一个合同,把奔驰、宝马的车辆模型都交给我们公司制作了,不过这次额外增加了一个新需求:汽车的启动、停止、喇叭声音、引擎声音都由客户自己控制,想什么顺序就什么顺序”那我们开始设计,来看一下类图:类图比较简单,在CarModel中我们定义了一个setSequence方法,车辆模型的这几个动作要如何排布,是在这个ArrayList中定义的。然后run()方法根据sequence定义的顺序完成指定的顺序动作。我们来看模型抽象类代码:

    2025年6月25日
    10
  • C++ 字符串分割

    C++ 字符串分割C++中经常需要对字符串按照指定字符或字符串进行分割操作以获得子串。下面给出具体实现。版本一://qsort函数需要的比较函数,按照升序排序intcomp(constvoid*a,constvoid*b){ return*(int*)a-*(int*)b;}//按指定分隔符分割字符串//src:源字符串delimiter:分隔符集合vector<string&…

    2022年6月12日
    35

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号