谈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的应用场景在网上搜索了下,很少介绍关于传统的信息化应用中如何使用Mo ...
- 【MongoDB】应用场景
24 Use Cases24.1 适合场景 Archiving and event logging 归档和日志记录 Document and Content Management Systems ...
- 浅谈mongodb内存
本文仅限于mongodb3.0.0(wiredtiger引擎) 一.mongodb内存使用 1.热数据 这一点是SQL和nosql之间的巨大差距,将热数据存在内存相当于自带cache,若wiredti ...
- 谈MongoDB读取连接超时的异常
今天在现场的哥们发来异常,让我解决,错误信息如下: HTTP Status 500 - Read operation to server 192.168.1.110:20001 failed on d ...
- 8.非关系型数据库(Nosql)之mongodb的应用场景
测试脚本: Mysql测试脚本: [php] view plaincopyprint? 1. <?php 2. header("Content-Type:text/html; ...
- 浅谈 MongoDB
MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案.他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较 ...
- MongoDB简单CRUD场景
MongoDB简单CRUD命令操作 (1)新建数据库:use 数据库名 (2)显示所有数据库:show dbs; (3)新建集合(两种方式) 隐式创建:在创建集合的同时往集合里面添加数据---db. ...
- 开发高性能的MongoDB应用—浅谈MongoDB性能优化(转)
出处:http://www.cnblogs.com/mokafamily/p/4102829.html 性能与用户量 “如何能让软件拥有更高的性能?”,我想这是一个大部分开发者都思考过的问题.性能往往 ...
- 开发高性能的MongoDB应用—浅谈MongoDB性能优化
关联文章索引: 大数据时代的数据存储,非关系型数据库MongoDB 性能与用户量 “如何能让软件拥有更高的性能?”,我想这是一个大部分开发者都思考过的问题.性能往往决定了一个软件的质量,如果你开发的是 ...
随机推荐
- MAT实战:JVM内存溢出的定位与分析
- Shell变量一览
Shell变量一览 $# Shell命令的参数个数 $$ Shell本身的进程ID $! Shell最后运行的后台进程的进程ID $? Shell最后运行的命令的退出码(返回值) $- Shell使用 ...
- 异常【kubelet cgroup driver:cgroupfs跟docker cgroup driver:systemd不一致】
修改docker.service vi /lib/systemd/system/docker.service 找到 --exec-opt native.cgroupdriver=systemd \ 修 ...
- C# vb .net实现灰度化特效滤镜
在.net中,如何简单快捷地实现Photoshop滤镜组中的灰度化呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第一步: ...
- ubuntu 12.04 下nginx安装步骤
2013-12-05 10:25 2289人阅读 评论(0) 收藏 举报 分类: Ubuntu/Linux(17) nginx(4) 转自:http://blog.csdn.net/acccca ...
- 【开发笔记】- Java读取properties文件的五种方式
原文地址:https://www.cnblogs.com/hafiz/p/5876243.html 一.背景 最近,在项目开发的过程中,遇到需要在properties文件中定义一些自定义的变量,以供j ...
- 手写DAO框架(六)-框架使用示例
一.引入pom <dependency> <groupId>me.lovegao</groupId> <artifactId>gdao</arti ...
- CSS 实现盒子水平居中、垂直居中和水平垂直居中的方法
CSS 实现盒子模型水平居中 水平居中效果图如下: HTML: CSS 全局样式: 方法一:使用margin: 0 auto;(只适用于子盒子有宽的时候) 方法二:text-align + disp ...
- 解决cxf+springmvc发布的webservice,缺少types,portType和message标签的问题
用cxf+spring发布了webservice,发现生成的wsdl的types,message和portType都以import的方式导入的.. 原因:命名空间问题 我想要生成的wsdl在同个文件中 ...
- golang实现路由中间件middleware
registerHandlers.go package router import ( "../ctrl" "../funcs" "github.co ...