序)Nosql并不是要取代原有的数据产品,而是为不同的应用场景提供更多的选择。

一)结构类型

  传统数据库的领域在于结构化文档,对于非结构化文档和半结构化文档,它能处理,但是有一定的缺陷,那么什么又是结构化文档,概括如下:

  结构化信息——这种信息可以在关系数据库中找到,多年来一直主导着IT应用。这是关键任务OLTP系统业务所依赖的信息,另外,还可对结构数据库信息进行排序和查询;

  半结构化信息——这是IT的第二次浪潮,包括电子邮件,文字处理文件以及大量保存和发布在网络上的信息。半结构化信息是以内容为基础,可以用于搜索,这也是谷歌存在的理由;

  非结构化信息——该信息在本质形式上可认为主要是位映射数据。数据必须处于一种可感知的形式中(诸如可在音频、视频和多媒体文件中被听或被看)。许多大数据都是非结构化的,其庞大规模和复杂性需要高级分析工具来创建或利用一种更易于人们感知和交互的结构。

二)MongoDB和行导向数据库的区别

  老实说,我觉得Nosql领域比较奇葩的东西算是Hive,不过在此不介绍它,对于项目中使用到MongoDB,也是有一定原因的,我一直以为Nosql这种东西和行导向数据库并不冲突,它仅仅是行导向数据的一个补充,对于MongoDB,它和我们用的mysql,Oracle等有什么区别,曾经我也查找过一些东西,发现网上很多相关的文章都是千篇一律,几乎一模一样,没啥价值,于是捉摸自己总结下。

  举个栗子:

uid name age
1 张三 18

  在上面的表中,很直接,数据也很直观,但是如果我们需要存储另外一个东西:头像,一般人会这样干:

uid name age photo
1 张三 18 ./upload/1.png

  尽管不同数据库都提供了直接存储二进制的数据库字段,但是我还是会选择以上的存储方式,我相信也有很多人也会这样做,这样做其实没有什么不好,但是如果我们的文件很大,几个GB,那么无论读还是写都会很耗时,成为系统的瓶颈,基于这种情况,才会诞生云计算以及Nosql这些东西,也就是说Hadoop,Hbase等诞生的原因是:

  多年来磁盘存储容量快速增加的同时,访问速度-磁盘数据读取速度却未能与时俱进,寻址时间的提高远远慢于传输速率的提高,寻址是将磁盘移动到特定磁盘位置进行读写操作,它是导致磁盘操作延迟的主要原因,而传输速率取决与磁盘的带宽。

  于是人们想出了一个办法:既然在一个服务器读取一个文件需要100个小时,那么将文件放在100个服务器,每个服务器放1%的数据,那么1小时就搞定了,这也是Hadoop的核心思想,MongoDB数据库继承了这一思想,它的区块划分,以及节点分裂,都延续了这样的思想,另一方面,MongoDB又吸取了memcached的东西,提前申请一片内存区域以及文件区域,将内存中的地址和物理地址对应起来,可以极高的提高速度,这也是MongoDB相当的消耗内存和磁盘的原因之一。

  

三)MongoDB应用范围

  1:MongoDB与传统数据库整合:

id user_id title content time
1 张三 文章标题 文章内容 时间

  在以上表中,如果内容是一个包含上千上万字的文章,一般会该字段的内容丢入MongoDB,然后在此放入MongoDB的ID。

  2:MongoDB取代传统数据库:

  在某些事物要求不高的场合,以及允许出现部分错误的系统中,可以使用MongoDB取代传统数据库,例如论坛,博客等系统,举个栗子:

  博客有人发表了一篇文章,MongoDB存储如下:

  

  1. > db.article.insert({"title":"测试文章","content":"测试内容", "time":"17822455", "uid":"1"});
  2. WriteResult({ "nInserted" : 1 })
  3. > db.article.findOne();
  4. {
  5. "_id" : ObjectId("546168c9573c0742d8be1544"),
  6. "title" : "测试文章",
  7. "content" : "测试内容",
  8. "time" : "17822455",
  9. "uid" : "1"
  10. }
  11. >

  现在有一个人对这篇文章进行了评论,如下:

  

  1. > var articleInfo = db.article.findOne({"_id":ObjectId("54616db1d92589121def0c70")});
  2. > articleInfo;
  3. {
  4. "_id" : ObjectId("54616db1d92589121def0c70"),
  5. "title" : "测试文章",
  6. "content" : "测试内容",
  7. "time" : "17822455",
  8. "uid" : "1"
  9. }
  10. > articleInfo.commentary={"uid":"2",info :{"content":"这篇文章不错","times":"145881444"}};
  11. {
  12. "uid" : "2",
  13. "info" : {
  14. "content" : "这篇文章不错",
  15. "times" : "145881444"
  16. }
  17. }
  18. > db.article.update({"_id": ObjectId("54616db1d92589121def0c70")},articleInfo);
  19. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
  20. > db.article.findOne({"_id":ObjectId("54616db1d92589121def0c70")});
  21. {
  22. "_id" : ObjectId("54616db1d92589121def0c70"),
  23. "title" : "测试文章",
  24. "content" : "测试内容",
  25. "time" : "17822455",
  26. "uid" : "1",
  27. "commentary" : {
  28. "uid" : "2",
  29. "info" : {
  30. "content" : "这篇文章不错",
  31. "times" : "145881444"
  32. }
  33. }
  34. }
  35. >

  现在又有一个人对它评论如下:

  于是MongoDB的存储结构成了这样:

  

  1. > db.article.update({"_id":ObjectId("54617115d92589121def0c72")}, {"$push": {"commentary":{"uid":3,info :{"content":"我也这篇文章不错","times":"1444"}}}});
  2. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
  3. > db.article.findOne({"_id":ObjectId("54617115d92589121def0c72")});
  4. {
  5. "_id" : ObjectId("54617115d92589121def0c72"),
  6. "title" : "测试文章",
  7. "content" : "测试内容",
  8. "time" : "17822455",
  9. "uid" : "1",
  10. "commentary" : [
  11. {
  12. "uid" : 2,
  13. "info" : {
  14. "content" : "这篇文章不错",
  15. "times" : "1444"
  16. }
  17. },
  18. {
  19. "uid" : 3,
  20. "info" : {
  21. "content" : "我也这篇文章不错",
  22. "times" : "1444"
  23. }
  24. }
  25. ]
  26. }
  27. >

  由此可见,如果再有评论,继续往后加就OK,MongoDB对此的存储是一目了然,伸缩性很强,如果不能够在代码中实现对数据一致性的处理,那么还是使用回关系型数据库为妙,在这种事务性不太强的场合,使用MongoDB是可以取代掉关系型数据库的。

四)MongoDB使用

  由于之前使用logback处理日志,自己还得写一大堆的shell脚本,各种awk处理文本分析用户行为丢入postgres,可能自己技术不到家,但是自己能够想出的东西也就这些,于是在这个项目中毅然决定用MongoDB作为日志分析系统。如果不在分布式中,使用Nosql没有价值,码字太辛苦了。。

  

(原)MongoDB在系统中的使用的更多相关文章

  1. Linux系统中的变量PATH

    PATH 作用 在Linux安装一些可执行文件通常要添加路径环境变量PATH,PATH环境变量通俗的讲就是把程序的路径"备案"到系统中,这样执行这些程序时就不需要输入完整路径,直接 ...

  2. NoSql非关系型数据库之MongoDB应用(三):MongoDB在项目中的初步应用

    业精于勤,荒于嬉:行成于思,毁于随. 我们可以结合相关的IDE做一个简单的增删改查了,实现MongoDB在项目中的初步应用. 前提是安装了MongoDB服务和MongoDB可视化工具,没有安装的可以点 ...

  3. Linux 系统中堆栈的使用方法

    本节内容概要描述了Linux内核从开机引导到系统正常运行过程中对堆栈的使用方式.这部分内容的说明与内核代码关系比较密切,可以先跳过.在开始阅读相应代码时再回来仔细研究. Linux 0.12系统中共使 ...

  4. UEFI+GPT模式下的Windows系统中分区结构和默认分区大小及硬盘整数分区研究

    内容摘要:本文主要讨论和分析在UEFI+GPT模式下的Windows系统(主要是最新的Win10X64)中默认的分区结构和默认的分区大小,硬盘整数分区.4K对齐.起始扇区.恢复分区.ESP分区.MSR ...

  5. (分享)Paxos在大型系统中常见的应用场景

    原帖http://timyang.net/distributed/paxos-scenarios/ 在分布式算法领域,有个非常重要的算法叫Paxos, 它的重要性有多高呢,Google的Chubby ...

  6. 李学斌:论复杂系统中的应用间协作V3

    说明 本文主要讨论了巨型复杂业务系统的一种构建思路,力图实现决策意志的快速.准确.一致的下传并简化实施成本提供实施效率.通过全业务领域的即时流程编排,实现全网业务IT系统的快速建设与迭代.本文所讲的方 ...

  7. AIX 系统中 PVID 的含义与作用

    网址: http://www.eygle.com/digest/2008/06/aix_pvid.html Pvid是aix系统中的ODM LVM用于识别PV的序列号,操作系统通过pvid来识别pv, ...

  8. [原创]Android系统中常用JAVA类源码浅析之HashMap

    由于是浅析,所以我只分析常用的接口,注意是Android系统中的JAVA类,可能和JDK的源码有区别. 首先从构造函数开始, /** * Min capacity (other than zero) ...

  9. linux系统如何将系统中的文件名改为英文?

    由于我们经常在命令行模式下进入文件,那么中英文的切换常常会影响我们输入的效率. 那么如何将原来的中文修改成英文的字幕呢? 如下图所示: -------------------------------- ...

随机推荐

  1. 2018.12.20 Spring环境如何搭建

    Spring学习 1.导入spring约束 为后续创建xml文件做铺垫 2.开始搭建Spring环境 1.创建Web项目,引入spring的开发包(根据下面的图来引入) 2.引入jar包 coreCo ...

  2. 利用firebug 查看JS方法, JS 调试

    “DOM” 可以查看变量和方法. “脚本”可以用来调试js方法. 有空总结一下白鹤堂老师的最牛JavaScript.

  3. Intellij IDEA 报错java.lang.NoClassDefFoundError

    Intellij IDEA 报错java.lang.NoClassDefFoundError 11-Aug-2018 23:48:24.686 严重 [http-nio-8080-exec-5] or ...

  4. 【洛谷P1039】侦探推理

    侦探推理 题目链接 这是一道恶心至极的模拟题 我们可以枚举罪犯是谁,今天是星期几,从而判断每个人说的话是真是假 若每个人说的话的真假一致,且说谎话的人数<=k且说真话的人数<=m-k,就是 ...

  5. ASP.NET MVC Cookie 身份验证

    1 创建一个ASP.NET MVC 项目 添加一个 AccountController 类. public class AccountController : Controller { [HttpGe ...

  6. mui 的多图片上传

    pickHead(){ var _this = this; plus.gallery.pick(function(path){ _this.headImage=path; var files = [{ ...

  7. FFMPEG系列一:Mac下FFMPEG编译安装配置及使用例子

    系统环境:10.13以前系统版本,没有升级到macOS High Sierra.正常情况是直接输入brew install ffmpeg即可安装ffmpeg,但是该过程还是有一些坑需要填. 一.mac ...

  8. Unity 游戏框架搭建 (十四) 优雅的QSignleton(零) QuickStart

      好久不见 !之前想着让各位直接用QFramework,但是后来想想,如果正在进行的项目直接使用QFramework,这样风险太高了,要改的代码太多,所以打算陆续独立出来一些工具和模块,允许各位一个 ...

  9. 基于Cent os 云服务器中SVN 服务器的搭建---具体实践是可行的 一次备注便于后续查找

    https://blog.csdn.net/shadowyingjian/article/details/80588544http://www.hongyanliren.com/2015m04/329 ...

  10. Python基础—08-函数使用(02)

    函数使用 生成器 使用场景: 在使用列表时,很多时候我们都不会一下子使用全部的数据,通常都是一个一个使用,但是数据量较小的时候,对于内存的占用可以不用过于关心:但是当数据量较大时,就会出现内存使用突然 ...