NoSQL :一个帝国的崛起
01
关系数据库帝国
现在是公元2009年,关系帝国已经统治了我们30多年,实在是太久了。
1970年,科德提出关系模型,1974年张伯伦和博伊斯制造出了SQL ,帝国迅速建立起了统治。
从北美到欧洲, 从欧洲到亚洲, 无数程序员臣服在他的脚下。
帝国给我们提供了良好的福利:
简单而强大的关系模型
灵活的SQL
还有我们非常喜欢的事务和ACID,把我们从底层并发的细节中解放出来。
使用这些福利,程序员们开发了无数的系统,每个系统的核心都是关系数据库。
时代在不断地变迁,编程语言的城头不断变换大王旗,但是存储在表格中的数据,一直岿然不动。
数据永远是一个企业最宝贵的资产。
但是帝国也给我们套上了沉重的枷锁:模式和规范化。
帝国规定:必须事先定义好模式(表结构)才能保存数据!
所有的数据至少得满足第一范式,甚至第二范式、第三范式、BCNF范式!
如果实现不了,就会被投进监狱,对于某些部落来讲,即使是做一个简单的冗余字段,都会被别人耻笑。
帝国宣称的SQL移植性也欺骗了我们,SQL虽然被标准化,但是每个厂商DB2, Oracle, SQL Server都有自己的方言!
尤其是在计算日期和字符串操作。还有存储过程,几乎每个厂商都会自己搞一套,根本无法移植!
02
危机
上世纪90年代,面向对象技术的流行给帝国带来了一次严重的危机:
对象-关系的阻抗不匹配。
“对象(Object)”有继承,子类,父类,关联,聚合,多态;
而关系数据库就是简单的表格!
他们是如此的不同,简直是水火不容,矛盾不可调和。
那个时候,帝国的东边出现了一个叫面向对象数据库OODB的部落, 号称可以把Java对象,C#对象,Ruby对象等等都一股脑地、直接存储到OODB当中去。
把对象直接保存到数据库?这实在是一个美妙的特性。
但是OODB实在是不争气,很快偃旗息鼓,在几个小领地苟延残喘。
2001年,有个叫Gavin King的27岁小伙子,开发了一个叫做Hibernate 的东西,在对象和关系之间搭了一座桥,叫O/R Mapping。
这一下子赢得了Java 程序员的芳心。
Hibernate再接再励,又推出了NHibernate, 打入了.NET的领地。
随着iBatis, JPA等更多O/R Mapping工具和接口的出现,关系数据库帝国成功地度过了这一次的危机。
后来有个好事者Martin Fowler,居然写了一本书《企业应用架构模式》, 在里边一本正经地把各种O/R Mapping的模式都总结了一遍:“单表继承”,“类表继承”,“活动记录”。。。。。。
这一番骚操作又替关系数据库帝国续命20年不止。
03
新希望
没过多久,互联网大潮来了,历史再次给了我们一个机会。
互联网的用户数如此之多,并发数如此之高, 让我们始料未及。
数据量是如此巨大,数据种类如此丰富,更让我们目瞪口呆。
文字、图片、链接、日志、社交关系,大量的数据蜂拥而至,单台机器上的数据库很快就撑不住了。
帝国先是拼命扩容,恨不得把一台机器弄成1024G的内存,1024T的硬盘,还美名其曰垂直扩展。
但是机器功能越强,价格就越贵,臣民们的税负越来越重,很快就受不了了。
没办法,帝国只好做水平扩展,把数据分布在多台机器上,这需要精心的规划,还需要程序员和应用程序精确地记住每一份数据放在哪里。
更要命的是,这种办法丢掉了帝国引以为傲的福利:事务和一致性
04
反抗
我决定反抗这个庞大的帝国, 我偷偷地带领着一帮志同道合的兄弟离开了,我们要新建一块清新自由的领地。
我们仔细地研究了关系帝国的缺点,派出了几只小分队分头出击。
誓师出征之时,我们对这四只小分队都提出了同样的要求:支持分布式和集群!!!
第一支小分队由redis担任队长,memcached 担任副手,他们很快便取得了成功,因为他们打击到了关系帝国最大的缺点:高并发下,数据库IO非常缓慢。
redis和memcached 做了一个大胆的决定,抛弃了硬盘,选择了比硬盘快几万倍的内存, 把数据以key-value的方式放入其中。
超快的速度让程序员们非常喜欢,他们不仅把session,配置信息,购物车的数据放入其中。
后来干脆把他俩当成了缓存来使用。
第二支小分队由Mongodb带领,CouchDB辅佐,他们敏锐地瞄准了用关系数据表保存起来很别扭的数据。
订单到订单项和支付, 订单项到产品是典型的一对多关系,意味着数据是树状结构,那为什么不直接用一个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, 这家伙非常擅长图结构,对于社交网络、推荐系统的数据,用它来表示非常合适。
第四支小分队由HBase带领, Cassandra殿后, 他们都是列式数据库,百亿行 * 百万列的数据对于他俩来说稀松平常。
这个小分队也获得了巨大的成功,移动互联网所产生的海量数据,如日志、聊天记录,监控数据,物联网的数据,结构化并不强,非常适合用HBase这种列式数据库来存放。
05
新的帝国
几年以后,四支小分队顺利班师,都带回了大批的程序员拥趸,因为适合的才是最好的。
一个新的、可以和关系数据库抗衡的帝国悄然成型。
经过一番激烈讨论,我们给帝国起了一个响亮的名称:NoSQL。
意思是不要SQL!
但是,加入NoSQL帝国的程序员发现我们也有非常明显的弱点:
缺乏模式(如表结构)、数据完整性约束很弱、对事务的支持很弱,甚至干脆没有, 这引起了程序员的强烈不满和抗议。
有不少人短暂尝鲜NoSQL以后,又抛弃了我们,重回SQL的怀抱。
我们决定和关系数据库帝国议和,告诉他们说NoSQL的意思是Not Only SQL, 我们两大帝国应该取长补短,和平共处。
经历了几年战火的关系数据帝国也看清楚了IT趋势,欣然接受。
从此,数据库进入了混合存储的时代!
码农翻身3年精华文章
漫画:康熙学不会二进制
漫画:程序员必须要小心的七个潜规则
漫画:兄弟,今晚又得熬个通宵了!
架构师劝退指南
程序员的宿命
宇宙第一IDE到底是谁?
HTTP Server :一个差生的逆袭
如何降低程序员的工资?
程序员,你得选准跑路的时间!
Javascript: 一个屌丝的逆袭
我是一个线程
TCP/IP之大明邮差
一个故事讲完Https
CPU 阿甘
NoSQL :一个帝国的崛起相关推荐
- 《角斗士》一个帝国的史诗绝唱
公元前27年的世界地理版图如果可以像霍格沃茨里的魔法那样被装裱在一个永远具有生命力的相框里,那么这幅照片注定只有一个名字.是的,罗马. 不可一世的奥古斯都大帝带着他的罗马骑兵将罗马帝国的印记刻在了整个 ...
- Yearn帝国正在崛起,有多少DeFi项目开始瑟瑟发抖
我们无法改变发到我们手中的牌,但我们可以改变自己的打法. 熟练到可以掷到自己想要的骰子点数的玩家等同于可以改写游戏规则,而其他人则可以使用机会牌并寄希望自己不会被淘汰. 在争夺去中心化的行业中,积极获 ...
- Java : 一个帝国的诞生
C语言帝国的统治 现在是公元1995年, C语言帝国已经统治了我们20多年, 实在是太久了. 1972年, 随着C语言的诞生和Unix的问世, 帝国迅速建立统治, 从北美到欧洲, 从欧洲到亚洲, 无数 ...
- 帝国cms自动生成html首页,分享一个帝国CMS定时生成首页(自动刷新首页)的方法...
帝国CMS 自动刷新首页对于部份使用帝国程序的网友或许非常有用.刚看到一篇文章, 主要介绍了javascript与php结合的实现前台自动刷新首页的功能.就算一种方法吧.推荐我喜欢的第二种办法. 第一 ...
- 手写帝国之崛起 -- Unity游戏开发篇(总述)
手写帝国 该游戏是在校期间写的一款手写汉字识别的小游戏(虽然现在还是在校hhhh,另外美工超强,后台也超强) 本游戏主要使用Unity开发,其中手写识别的功能是在AS(指Android Studio, ...
- 下一个“趣步”崛起:宣称“购物省钱”,年化收益率300%,吸引600万韭菜
文 | 棘轮 除了走路赚钱.看短视频赚钱,资金盘还有什么噱头? 答案,是"网购省钱". 2019年年末,打着"网购省钱"的资金盘"链淘"横空 ...
- 虚拟成像技术_AI帝国将崛起,国内幻真虚拟成像技术第一家
一起智能 一起智能主打产品为"幻真虚拟成像技术".该系统利用图像处理.动态捕捉以及AI算法等相关技术以及云服务器的分发可以将采集到的图像素材投射到任一场地,目前投射区域最高能达到2 ...
- 迪士尼、无聊猿,与IP帝国的崛起
没有一家运营 IP 的公司是不想成为迪士尼的. 仅靠一个个创作出来的 IP 形象,迪士尼挣到了多少钱?据统计,2021 年全球最赚钱的 10 个 IP 中,迪士尼一家就占据了半壁江山,5 个 IP(维 ...
- 不愿做「奴隶」的程序员们组建了一个帝国
点击上方"程序员大咖",选择"置顶公众号" 关键时刻,第一时间送达! 有一天,程序员们受够了这个世界 他们不但每天要加班 遭受产品经理的压迫 还要时刻提防被拉去 ...
最新文章
- 【转】Android 之最新最全的Intent传递数据方法
- 成功解决from nets import inception_resnet_v2 ModuleNotFoundError: No module named 'nets'
- 盘古分词-关键字搜索没有结果(关键字由未收录词组成)
- UVa 11388 - GCD LCM
- 东软睿云用户认证_【硬件资讯】尘埃落定!11代酷睿规格曝光!i7、i9难分差距,退回8核16线程!...
- c语言高斯白序列x,C语言程序设计程设计指导书(晓庄).doc
- 前端rem单位的使用研究
- Handbook之012:函数类别构型
- Windows10临时关闭数字签名认证
- macOS 运行react项目
- vue、react隐式实例化
- 日记侠:我为什么学习网络营销
- 计算机的ps快捷键,PHOTOSHOP常用快捷键大全
- python中的round函数怎么解释_round函数怎么用_python中round函数怎么用
- 第5章-构建Spring Web应用程序
- 我亦无他,唯手熟尔:Verilog基本语法目录
- 301代码php代码在哪里加,php 301转向实现代码
- 迭代法求解贝尔曼期望方程的数学证明
- eclipse使用的常见问题
- google浏览器字体模糊问题(类似分辨率问题)解决办法