大数据时代的数据存储,非关系型数据库MongoDB(一)(转)

出处:http://www.cnblogs.com/mokafamily/p/4076954.html

爆炸式发展的NoSQL技术

  

  在过去的很长一段时间中,关系型数据库(Relational Database Management System)一直是最主流的数据库解决方案,他运用真实世界中事物与关系来解释数据库中抽象的数据架构。然而,在信息技术爆炸式发展的今天,大数据已经成为了继云计算,物联网后新的技术革命,关系型数据库在处理大数据量时已经开始吃力,开发者只能通过不断地优化数据库来解决数据量的问题,但优化毕竟不是一个长期方案,所以人们提出了一种新的数据库解决方案来迎接大数据时代的到来——NoSQL(非关系型数据库)

 

  NoSQL非常年轻,但他拥有的众多优秀的特性已经让众多企业和开发者开始接受,让我们来看一下来自于美国数据库知识网站DB-engines上个月的数据库排名情况。

  

 

  从排名中可以看到MongoDB数据库从众多的RDBMS(关系型数据库)中脱颖而出,已经成为第五名,并且还在不断上升中。

 

  

  如果将数据库比喻成人类的话,那么MongoDB完全可以说是神童了,年仅5岁的他单枪匹马挑战一群叔叔级别的人物,并且按照近几年的发展速度来看,他也即将超越PgSQL成为第四名,虽然距离前方三位有着NB爹的富二代还有一定的距离,但在这样一个技术爆炸的年代还有什么不可能的事呢?

 

为什么选择MongoDB?

 

1.性能

  在大数据时代中,大数据量的处理已经成了考量一个数据库最重要的原因之一。而MongoDB的一个主要目标就是尽可能的让数据库保持卓越的性能,这很大程度地决定了MongoDB的设计。在一个以传统机械硬盘为主导的年代,硬盘很可能会成为性能的短板,而MongoDB选择了最大程度而利用内存资源用作缓存来换取卓越的性能,并且会自动选择速度最快的索引来进行查询。MongoDB尽可能精简数据库,将尽可能多的操作交给客户端,这种方式也是MongoDB能够保持卓越性能的原因之一。

 

2.扩展

  现在互联网的数据量已经从过去的MB、GB变为了现在的TB级别,单一的数据库显然已经无法承受,扩展性成为重要的话题,然而现在的开发人员常常在选择扩展方式的时候犯了难,到底是选择横向扩展还是纵向扩展呢?

——————————————————————————————————————————————————————————————

  横向扩展(scale out)是以增加分区的方式将数据库拆分成不同的区块来分布到不同的机器中来,这样的优势是扩展成本低但管理困难。

 

  纵向扩展(scale up) 纵向扩展与横向扩展不同的是他会将原本的服务器进行升级,让其拥有更强大的计算能力。这样的优势是易于管理无需考虑扩展带来的众多问题,但缺点也显而易见,那就是成本高。一台大型机的价格往往非常昂贵,并且这样的升级在数据达到极限时,可能就找不到计算能力更为强大的机器了。

———————————————————————————————————————————————————————————————

  而MongoDB选择的是更为经济的横向扩展,他可以很容易的将数据拆分至不同的服务器中。而且在获取数据时开发者也无需考虑多服务器带来的问题,MongoDB可以将开发者的请求自动路由到正确的服务器中,让开发者脱离横向扩展带来的弊病,更专注于程序的开发上。

 

3.使用

  MongoDB采用的是NoSQL的设计方式,可以更加灵活的操作数据。在进行传统的RDBMS中你一定遇到过几十行甚至上百行的复杂SQL语句,传统的RDBMS的SQL语句中包含着大量关联,子查询等语句,在增加复杂性的同时还让性能调优变得更加困难。MongoDB的面向文档(document-oriented)设计中采用更为灵活的文档来作为数据模型用来取代RDBMS中的行,面向文档的设计让开发人员获取数据的方式更加灵活,甚至于开发人员仅用一条语句即可查询复杂的嵌套关系,让开发人员不必为了获取数据而绞尽脑汁。

 

 

NoSQL对传统数据库设计思维的影响

 

1.预设计模式与动态模式

   传统数据库设计思维中,项目的设计阶段需要对数据库表中的字段名称、字段类型、进行规定,如果尝试插入不符合设计的数据,数据库不会接受这条数据以保证数据的完整性。

--数据库字段:NAME, SONGINSERT INTO T_INFO VALUES('John','Come Together');  --成功INSERT INTO T_INFO VALUES('小明', 20, 'xiaoming@111.com');  --失败

 

  NoSQL采用的是对集合(类似"表")中的文档(类似于"行")进行动态追加,在创建集合之初不会对数据类型进行限定,任何文档都可以追加到任何集合中去,例如我们可以将这样两条文档添加到一个集合中去:

{"name" : "John", "song" : "Come Together"}{"name" : "小明",  "age":"20", "email" : "xiaoming@111.com"}

  

  MongoDB中文档的格式类似于我们常见的JSON,由此可见,我们第一个拥有"name"、"song"两个字段,而第二个拥有"name"、"age"、"email"三个字段,这在预设计模式中的数据库是不可能插入成功的,但在MongoDB的动态模式是可以的,这样做的优势是我们不必为一些数量很少,但种类很多的字段单独设计一张表,可以将他们集中在单独一张表进行存储,但这样做的弊病也是显而易见的,我们在获取数据时需要对同一张表的不同文档进行区分,增加了开发上的代码量。所以在设计之初需要权衡动态模式的优劣来选择表中的数据类型。

 

2.范式化与反范式化

 

  范式化(normalization)是关系模型的发明者埃德加·科德于1970年提出这一概念,范式化会将数据分散到不同的表中,利用关系模型进行关联,由此带来的优点是,在后期进行修改时,不会影响到与其关联的数据,仅对自身修改即可完成。

  反范式化(denormalization)是针对范式化提出的相反理念,反范式化会将当前文档的数据集中存放在本表中,而不会采用拆分的方式进行存储。

 

  范式化和反范式化之间不存在优劣的问题,范式化的好处是可以在我们写入、修改、删除时的提供更高性能,而反范式化可以提高我们在查询时的性能。当然NoSQL中是不存在关联查询的,以此提高查询性能,但我们依旧可以以在表中存储关联表ID的方式进行范式化。但由此可见,NoSQL的理念中反范式化的地位是大于范式化的。

 

MongoDB还年轻

 

  MongoDB又有众多卓越的设计,但MongoDB依然存在着许多不擅长的问题,其中包括:

 

  1. MongoDB不支持事务,现在众多的软件依旧需要事务的管理,所以对于事务一致性要求较高的程序只能在软件层面进行管理,而无法从数据库进行管理。

  2. 其他工具的支持范围,MongoDB从发布起到现在还不到5年的时间,所以会面临着许多的语言没有对应的工具包,所以如果你使用的语言没有对应的包,可能是导致你无法使用MongoDB最大的阻碍。

  3. 社区的资源量,这个问题同第二个问题一样是因为MongoDB过于年轻导致的,相对于其他大型数据库的社区而言,MongoDB显然是无法与之相比的,然而社区往往也是一个重要考量因素之一,社区资源的匮乏会导致问题解决周期延长,从而拖延工作。

 

  近几年的技术发展之快是激动人心的,每年都会出现让人眼前一亮的产品,然而它都需要经过时间的累积才能成为一个成熟的产品,MongoDB还需要成长,但他优秀的设计,肯定会让越来越多的开发者接受它。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql集群初始化配置_集群Cluster MySQL的安装配置和使用

集群Cluster MySQL的安装配置和使用发布时间:2020-05-28 14:20:03来源:亿速云阅读:233作者:鸽子MySQL Cluster MySQL集群基本概念:“NDB” 是一种“内存中”的存储引擎,它具有可用性高和数据一致性好的特点…

在一个类型的继承体系中,成员的构造顺序

先看代码,写出结果 class A { public A() { PrintFields(); } public virtual void PrintFields(){} } class B:A { int x1; int y; public B…

IntelliJ IDEA+Mysql connecter/j JDBC驱动连接

在IntelliJ IDEA中用connecter/j jdbc驱动连接MYSQL 以下是解决过程,待整合。。。有点懒,有空再改 官方文档:https://www.cnblogs.com/cn-chy-com/p/10145690.html 创建了mysql新用户:https://blog.csdn.net/weixin_38091140/arti…

成长的路上,痛并快乐着

异地求学七年,从地图的的西北部跨越到地图的南部。一路行走着,一路成长着,有痛,有快乐。或许,痛并快乐着也是一种生活的姿态。或许,有过痛的青春才深刻,而深刻的背后即是思考、理解、包容与成熟…

mysql类exadata功能_Exadata V2数据库一体机的几大致命缺点

昨天客户语重心长的告诉我,他们准备把Exadata V2 上的核心应用迁移走,客户在09年就开始用Exadata,是不是国内第一家我不知道,但至少应该是用于生产的第一批。但是这2年来因为Exadata折腾了无数次,现在终于不想折腾了。…

奇门千金诀-占病

八诈含义值符;阳症。               腾蛇;惊恐、噩梦、遗精。太阴;肺痨、骨虚。            六合;中风、麻木。             勾陈、白虎;翻胃、呕吐、伤亡、道路。   朱雀…

css动画(transition/transform/animation)

在开发中,一个好的用户操作界面,总会夹杂着一些动画。css用对少的代码,来给用户最佳的体验感,下面我总结了一些css动画属性的使用方法及用例代码供大家参考,在不对的地方,希望大佬直接拍砖评论。 1 transit…

mysql gtid寻找位置_【MySQL】UUID与GTID以及如何根据GTID找寻filename和position

Open Group于1997年10月发布,UUID遵从此协议。UUID被设计成一个在空间和时间上的唯一值。两次调用的UUID将产生两个不同的值,即使这些调用是在两个不连接的,彼此独立的计算机。由一串数字表示aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeeformat:mys…

javascript实例_网页空降与抖动

2007-07-03 23:54<html><body OnLoad"drop(400)">玄魂从天而降拉!!!!!!!!!!<script>function drop(n) {if(self.moveBy){ self.moveBy (0,-900); for(i n; i > 0; i--){ self.moveBy(0,3);self.moveBy(3,0); } for(j 50; j > 0…

邻接矩阵实现图的深度优先搜索(1)

邻接矩阵实现图的深度优先搜索(1) /************************************************************/ /********************图的深度优先搜索***********************/ /********************用邻接矩阵来实现***********************/ /************************************…

(56)zabbix Screens视图配置

screen翻译成中文为“屏幕”&#xff0c;在超市、单位等等地方都比较常见到监控视频&#xff0c;视频上有多块小视频&#xff0c;实际上zabbix screen和这个功能类似。你可以设置多个screen&#xff0c;每个screen可以显示特定信息&#xff0c;例如某台主机的cpu、内存、硬盘、…

spacy库的安装与使用_为 SpaCy 提供的中文数据模型

SpaCy 中文模型为 SpaCy 提供的中文数据模型. 模型目前还处于 beta 公开测试的状态 。在线演示基于 Jupyter notebook 的在线演示在 。 特性部分 王小明在北京的清华大学读书 这个 Doc 对象的属性信息:NER (New!)部分 王小明在北京的清华大学读书 这个 Doc 对象的 NER 信息:开始…

ASP对很长的文章做分页输出

阅读: 1 评论: 0 作者: eng308 发表于 2010-02-03 10:33 原文链接利用统计文章字数&#xff0c;然后达到一定字数就截断输出&#xff0c;但是分页的内容就会在莫名其妙的地方截断&#xff0c;不是很友好。很简单&#xff0c;在要截断的地方附近找下面的符号:&#xff1b;’”&a…

RH124-3 目录结构_转

在linux里安装的时候&#xff0c;是可以指定某分区装在某文件夹里目录意义 /bin 存放命令&#xff0c;不可以在装系统单独挂载分区/home/dev 存放硬件设备 不可以单独挂载分区/boot 500M 和系统启动相关文件 不能放在逻辑卷里面/etc 不可以单独创建分区/lib /lib64 存放模块/me…

软件性能测试的本质

为什么80%的码农都做不了架构师&#xff1f;>>> ‍ 淘宝网每年的双11活动都是对其服务器性能的挑战。因为在这一天所有商品半价&#xff0c;购物的用户量剧增。做为淘宝网的高层更多的关心在线用户数&#xff0c;用户交易量&#xff0c;总交易金额等&#xff0c;做…

AGILE

AGILE CMMI的理解在最佳实践的态度上非常类似自下而上的草根性,相比更侧重完善自身理论的CMMI更具实用性软件工程工具的作用理想和现实,艺术与工业期望与代价,灵活性,易用性CMMI实施为何没有软件工程工具的适用性评估?有没有建议换工具的?它与制造业以SAP这样的工具来做ERP实…

算法整理

1.冒泡排序 $arr array(5,2,6,2,3,1); for($i0;$i<count($arr);$i){ for($jcount($arr);$j>$i;$j--){ if($arr[$i]>$arr[$j-1]){ $b $arr[$i]; $arr[$i] $arr[$j-1]; $arr[$j-1] $b; } } } 2.快速排序&#xff0c; 取一个值&#xff0c;比他大的放一边&#xff0c…

无废话XML--XML约束(DTD)

基本术语一、序言Prolog&#xff1a;包括XML声明(XML Declaration)和文档类型声明(Document Type Declaration)。 二、良构(well-formed 规范的)&#xff1a;符合W3C定义的XML文档。 为什么XML需要验证&#xff1f; 对XML文件施加额外的约束&#xff0c;以便交流。举个…

c# 流,字节数组及字符串之间的转换

//1.流转换为字节数组&#xff0c;fileUpload为.net上传控件Stream stream fileUpload.FileContent;byte[] fileBuffer new byte[stream.Length];stream.Read(fileBuffer,0,(int)stream.Length);//2.字节数组转换为字符串string fileBody System.Text.Encoding.Default.GetS…

mysql周报内容范文_Mysql各种报表查询含实例,日报,周报,月报,时间差自动计算...

public List retrieve(IReport report) {List list new ArrayList();Map map new HashMap();// 设置结束日期if (null ! report.getEndTime()) {map.put(ReportMeta.PROP_ENDTIME, report.getEndTime());// 设置名称if (null ! report.getName()) {map.put(ReportMeta.PROP_N…