【转载】谈MongoDB的应用场景
引用:http://blog.csdn.net/adparking/article/details/38727911
MongoDB的应用场景在网上搜索了下,很少介绍关于传统的信息化应用中如何使用MongoDB数据库方面的内容,比较多的还是介绍日志的采集和存储,小文件的分布式存储,类似互联网微博应用的数据存储等方面的内容。在这里思考下传统企业信息化系统中的应用可行性。
首先对于NoSQL数据库,在数据库建模上需要重点考虑,彻底放弃传统的关系型数据库建模方法,如果将传统的关系型数据库表原封不动的映射到NoSQL数据库,很多NoSQL数据库本身的优点特性反而无用武之地。其中最重要的就是转化为面对对象的思维模式,更加关注领域对象和实体信息。MongoDB数据库的集合本身就是一个可以包罗万象的层次化的文档对象,集合本身还可以包含子集合,形成一个完整意义上的对象。
如果拿一个最简单的企业客户信息管理功能来说,可以看到首先要维护有哪些企业客户,企业客户的常用联系人,每个人的联系方式,企业相关的资料文档,企业的地址信息,企业的账户信息,争取企业的拜访记录等,这里讲的就是一个最简单的企业客户域的对象信息。
按道理来说企业信息就是一个完整的对象,企业附属对象都从属于企业这个对象,企业这个信息没有了其余附属对象信息的生命周期也就结束。如果按这个意义上来说只需要简历一个collection集合就可以管理所有事情。但是我看到企业客户包括了两方面信息,一个是偏静态信息,如企业基本信息,联系人,联系地址信息;一个是偏动态信息,即企业的拜访记录等。考虑了企业拜访记录本身变动频繁是动态信息,可以将企业拜访记录拆分出来单独做为一个文档对象来管理。如果这样的话,要完善以上功能只需要建两个文档对象,一个是企业客户基本信息,一个是拜访记录信息。另外还有一个文件存储功能,直接使用MongoDB的GridFS来完成即可。
在企业客户信息中,企业客户即一个集合,在该集合中联系人信息为子集合,联系人的联系方式(多种联系方式)信息可以有两点考虑,一个是子子集合,也可以直接将多种联系方式归并到联系人对象一层,由于MongoDB的属性字段本身就可以方便的扩展,这样设计可以减少整个集合的层次。(在这里我的考虑就是,对于1对多关系,对于子表本身就只有一个字段的都可以考虑合并到父对象里面减少层次)。这些信息往往在客户基本信息录入的时候就需要完整录入,一个完整的JSON对象格式可以很方便的作为一个整体存入到MongoDB数据库中。
对于客户的拜访记录由于动态经常增加,可以单独设置一个对象,在该对象中增加客户ID,客户名称信息冗余,减少后续查询功能中不必要的对象关联。对于这个对象我们可以看到会经常增加数据,但是实际增加的数据本身变动却很少。在拜访记录中如果还有和本次拜访相关的图片或文档存储,也可以很方面的解决问题。
对于客户文档资料存储,前面已经说过了直接使用GridFS来完成即可。GridFS是MongoDB的一个内置功能,它提供一组文件操作的API以利用MongoDB存储文件。对于刚才的场景可以看到,对于增加一个客户资料的存储首先调用文件存储API完成非结构化文件的存储,存储完成后可以返回文件句柄ID,这个句柄ID可以做为一个子集合直接存储在客户主Collection对象上,也可以单独建立一个客户ID和文件句柄ID的关联表,但是个人认为直接建立在客户主集合对象似乎更好。
基于以上基本思路来分析实际客户信息管理需要的具体功能点。
客户信息新增功能,在新增界面上需要维护客户基本信息,客户的联系人,地址信息,客户的文档资料信息,如果不考虑非结构文档附件,整个页面本身就是一个完整的JSON对象,可以只调用一次即完成整个层次化集合对象的存储,而且相当简单。考虑到附件信息,即操作分为两个步骤,首先上传存储附件获取附件句柄ID,然后再存储结构化客户基本对象信息。对于客户拜访记录信息,录入客户拜访记录首先肯定是要选择到具体的客户,选择到具体客户后,客户的ID信息,客户的名称信息即已经可以获取到。新增加一条拜访记录也是相当简单的操作即可以完成。
再来看查询功能,首先看客户信息查询可能是一个模糊查询功能,而MongoDB对模糊查询性能是比较弱的,因此尽可能的减少不必要模糊查询字段,对于必须的查询字段可以在MongoDB对象中增加相应的索引信息。最重要的就是基于MongoDB数据库对Join操作的支持很弱,应该在数据模型设计和查询设计上尽可能的减少不必要的对象关联操作。当查询到某一个具体的客户信息后,需要查看该客户具体的拜访记录就相当简单的,只是对拜访记录表最简单的根据客户ID的一个类where操作即可完成。对于客户具体的附件列表信息可以做相似的设计,即点击链接后再进入到具体的客户附件文档查看界面。
对于更新功能,基本对象的更新也相当简单,剩下的就是对于联系人信息的更新,联系人信息是一个子集合对象,在这里暂时还没有看到是需要对这个子集合对象全部更新掉,还是可以做到只更新操作子集合对象中的一条记录。对于更新操作,仍然需要定位到具体的ID值再进行更新。对于批量更新现在MongoDB本身也提供了相应的操作,类似批量更新客户状态操作还是很容易实现的。
以上只是一个最简单的分析,基于这种分析,以后对于类似主数据管理系统的应用完全可以迁移到MongoDB数据库来支撑。另外对于记录更新不频繁,对象直接相互关联和影响小的场景也适合迁移到MongoDB数据库。在NoSQL数据库的使用过程中应该尽量避开类似强一致性要求,表间关系复杂,长周期事务等场景。
【转载】谈MongoDB的应用场景的更多相关文章
- 谈MongoDB的应用场景
转载自:http://blog.csdn.net/adparking/article/details/38727911 MongoDB的应用场景在网上搜索了下,很少介绍关于传统的信息化应用中如何使用M ...
- 【MongoDB】应用场景
24 Use Cases24.1 适合场景 Archiving and event logging 归档和日志记录 Document and Content Management Systems ...
- 【转载】MongoDB中的MapReduce 高级操作介绍
转载自残缺的孤独 1.概述 MongoDB中的MapReduce相当于关系数据库中的group by.使用MapReduce要实现两个函数Map和Reduce函数.Map函数调用emit(key,va ...
- 转载:mongodb的两阶段提交实战
项目中用到了mongodb(3.x版本),业务上需要操作mongodb的多个collections,希望要么同时操作成功,要么回滚操作保持数据的一致性,这个实际上要求在mongodb上实现事务功能,在 ...
- [转载]NodeJS优缺点及适用场景讨论
http://www.xprogrammer.com/159.html 概述:NodeJS宣称其目标是“旨在提供一种简单的构建可伸缩网络程序的方法”,那么它的出现是为了解决什么问题呢,它有什么优缺点以 ...
- 转载:MongoDB 在 58 同城百亿量级数据下的应用实践
为什么要使用 MongoDB? MongoDB 这个来源英文单词“humongous”,homongous 这个单词的意思是“巨大的”.“奇大无比的”,从 MongoDB 单词本身可以看出它的目标是提 ...
- 浅谈mongodb内存
本文仅限于mongodb3.0.0(wiredtiger引擎) 一.mongodb内存使用 1.热数据 这一点是SQL和nosql之间的巨大差距,将热数据存在内存相当于自带cache,若wiredti ...
- (转载)MongoDB C#驱动中Query几个方法
MongoDB C#驱动中Query几个方法 Query.All("name", "a", "b");//通过多个元素来匹配数组 Query ...
- 谈MongoDB读取连接超时的异常
今天在现场的哥们发来异常,让我解决,错误信息如下: HTTP Status 500 - Read operation to server 192.168.1.110:20001 failed on d ...
随机推荐
- weblogic 10.3.5重置密码
weblogic 10.3.5重置密码 热度1,609 ℃ 时间:2013-12-26 10:26 分类:middleware 评论数:0 条 0 weblogic默认验证密码机制:如 ...
- 浅谈SQL Server中的三种物理连接操作(Nested Loop Join、Merge Join、Hash Join)
简介 在SQL Server中,我们所常见的表与表之间的Inner Join,Outer Join都会被执行引擎根据所选的列,数据上是否有索引,所选数据的选择性转化为Loop Join,Merge J ...
- intellijidea课程 intellijidea神器使用技巧 4-1 重构
1 重构变量 shift + F6 将选中的变量以及用到该变量的部分全部修改 2 重构方法 Ctrl + F6 重构变量
- [vijos]lxhgww的奇思妙想(长链剖分)
题意 题目链接 Sol 长链剖分 又是一个用各种花式技巧优化的暴力 它的主要思想是:对于每个节点,把深度最深的子节点当做重儿子,它们之间的边当做重边 这样就会有一些非常好的轻质 所有链长总和是\(O( ...
- mysql测试和sysbench工具详解
前言 作为一名后台开发,对数据库进行基准测试,以掌握数据库的性能情况是非常必要的.本文介绍了MySQL基准测试的基本概念,以及使用sysbench对MySQL进行基准测试的详细方法. 文章有疏漏之处, ...
- centos7服务器搭建javaweb运行环境及代码部署
之前在一直在学习java web终于写完了第一个小demo,于是在阿里云上买了一个服务器,开始了配置服务器环境的踩坑之旅.... ps:本文不讨论服务器配置的具体步骤,网上都很多,按部就班就是,本文主 ...
- What is mobile platform?
高屋建瓴 From Up to Down Outside into inside The Internet Of Things. http://wenku.baidu.com/view/5cdc026 ...
- redis笔记(一)
redis安装 ubuntu: apt-get install redis-server redis服务 :redis-server 启动客户端 :redis-cli redis简单知识 ...
- 探索Skip List (跳跃表)
附William Pugh的论文 Skip Lists: A Probabilistic Alternative to Balanced Trees 写在前面 以下内容针对的是Skip List的插入 ...
- 笨办法学Python(四)
习题 4: 变量(variable)和命名 你已经学会了 print 和算术运算.下一步你要学的是“变量”.在编程中,变量只不过是用来指代某个东西的名字.程序员通过使用变量名可以让他们的程序读起来更像 ...