MongoDB 3: 使用中的问题,及其应用场景
导读:用MongoDB去存储非关系型的数据,是一个比较正确的选择。但是,如果只是用MongoDB,那么也会出现一些问题。MongoDB,尤其使用的最佳场景,更多的时候,需要结合关系型数据库共同解决问题。本篇博客,则介绍一下MongoDb在运用过程中可能出现的问题。
一、出现的问题
首先,我们先来简单看一下MongoDB的存储结构图(以电视节目为例):
那么以传统的关系型数据库存储,这将要建立好几张表,但如果用非关系型,则是:
<span style="font-family:KaiTi_GB2312;font-size:18px;">{title:'Angel's Class',
seasons:[
{
season_number:'1',
episodes:[
{
ordinal_within_season:'1',
title:'what is it',
reviews:[{...}],
cast_members:[{...}]
}
]
}
]
}
</span>
通过jsonArray的,只存储一个对象,就可以获得想要的数据。可是,问题也因此而来(以facebook的使用为例):
那么,以上的结构,如果以关系型数据库作为存储,当我们需要获取数据时,则需要联合查询好几张表。那么这时候,为了简便,以非关系型数据库作为存储的概念出来了,如下所示:
这时候,我们依然能通过存储一个对象,获取我们想要的数据。可是,当我们试图去更新着一条记录的时候,那么这将是项危险的操作,我们不得不去更改这个对象里涉及到的所有数据(也许只是想改个自己昵称而已)。(它的危险来源于:信息嵌套)
这个时候,或许我们需要引入id:
这时候,我们仍然可以通过一个文档去获取用户的完整数据,但对于里面涉及到的User2等数据,则需要在程序中去编写代码!
二、结合项目的思考
在最近做的今日开讲的项目中,那么作为讲师模块,一个添加或者编辑,需要操作5张表:Student,Teacher,UserFied,UserIndustry,WorkExperience,其中用户领域和行业、工作经验都可以是多个。那么我们用MySQL的时候,则每次都需要查4次,一次:联合Student和Teacher表,去获得用户的基本信息。其余的是,分别查询讲师的领域、行业和工作经验。
那么,在这个需求中,并不涉及到信息的嵌套和危险操作。如果使用Mongo的话,那么一个讲师只需要查询一个对象就可以获取出所有的数据。这样,在编程的时候,我们就可以更多的,以系统的业务逻辑实现去思考问题,而可以将数据的持久化操作暂时搁浅。
PS:后来想过了,这个系统在很多地方还是得用关系型的数据库(在非关系的数据库里,尽可能的不要去link你的document)。那么即使使用Mongo可以在一定程序一定范围内方便,但是对于整个的学习成本、时间成本、维护成本考虑,结合系统的规模来说,或许不是一个最佳的选择!
三、总结
在什么时候使用MySQL之类的数据库呢?当我们需要进行复杂的、多行的数据交易;高度事务性的系统。
在什么时候使用Mongo之类的数据库呢?个人观点:可以将Mongo(高性能)作为一个缓存用,避免下层数据的过载;作为视图(作为全局来看,Mongo的文档存储,其实很像关系型数据库中的视图 );存储Json对象,实时性的数据。
总结:在选择数据库的时候,很重要的一件事就是:明确业务需求,数据类型,让数据库(数据)为业务服务!
分享:在计算机科学中,最艰难的有两件事:缓存失效和命名!
MongoDB 3: 使用中的问题,及其应用场景的更多相关文章
- 谈谈mongodb,mysql的区别和具体应用场景
最近对数据库比较感兴趣,于是就去研究了下部分相关热门的数据库. MySQL 关系型数据库. 在不同的引擎上有不同 的存储方式. 查询语句是使用传统的sql语句,拥有较为成熟的体系,成熟度很高. 开源数 ...
- MongoDB安装、CURD操作、使用场景分析总结(1)
NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL".非关系型的数据存储 MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 ...
- mongodb适用和不适用的应用场景
近期考虑把订单历史数据从Oracle数据库迁移到Nosql数据库做历史数据查询和分析,一天千万级数据.打算使用mongodb数据库.使用nodejs做查询和统计API,对并发请求量要求低,不知道有没有 ...
- MongoDB在实际项目中的使用
MongoDB简介 MongoDB是近些年来流行起来的NoSql的代表,和传统数据库最大的区别是支持文档型数据库. 当然,现在的一些数据库通过自定义复合类型,可变长数组等手段也可以模拟文档型数据库. ...
- MongoDB在实际项目
MongoDB在实际项目中的使用 MongoDB简介 MongoDB是近些年来流行起来的NoSql的代表,和传统数据库最大的区别是支持文档型数据库.当然,现在的一些数据库通过自定义复合类型,可变长 ...
- 疯狂了!当游戏爱上MongoDB会怎么样???
导读 前端时间魔兽这个电影我相信大家都看过了哈,作为一个码农,有时候我也会去思考魔兽世界这个游戏背后他的一些设计和实现,比如他用什么数据库.当然真正用什么数据库这个我是不确定的,我们今天的主题是当游戏 ...
- 新年新技术:MongoDB 3.0
前一篇介绍了HTTP/2,这一篇简单介绍下3月3号发布的MongoDB 3.0. What’s new in MongoDB 3.0? 新的存储引擎WiredTiger MongoDB 3.0的存储引 ...
- Redis、Memcache和MongoDB的区别
>>Memcached Memcached的优点:Memcached可以利用多核优势,单实例吞吐量极高,可以达到几十万QPS(取决于key.value的字节大小以及服务器硬件性能,日常环境 ...
- Python迁移MySQL数据到MongoDB脚本
MongoDB是一个文档数据库,在存储小文件方面存在天然优势.随着业务求的变化,需要将线上MySQL数据库中的行记录,导入到MongoDB中文档记录. 一.场景:线上MySQL数据库某表迁移到Mong ...
随机推荐
- 黄聪:Emeditor 编辑器常用的正则表达式
Emeditor 目前来说是我个人感觉非常不错的一款记事本软件, 其中查找替换功能由于支持正则表达式而显得非常强大. <tr[^>]*> 匹配:<tr xxxxxxxxxxxx ...
- Java compiler level does not match the version of the installed Java project facet. springmvc1 和 Target runtime Apache Tomcat v7.0 is not defined.
Java compiler level does not match the version of the installed Java project facet.springmvc1 : Targ ...
- DBA_在Linux上安装Oracle Database11g数据库(案例)
2014-08-08 Created By BaoXinjian
- webView--总结
Anaroid WebView API详解--http://blog.csdn.net/zhangcanyan/article/details/51344090;Android5.1系统WebView ...
- Xcode5.0使用iOS6.1SDK及模拟器
最近项目中,介于测试人员提出的问题,有些情况只在ios6的设备上才能显现,而本机的xcode已升级到最新的5.0,这可如何是好呢,在网上搜索了一番,找到如下方法解决此问题: 1.打开xcode5.0的 ...
- dede数据库类使用方法$dsql【转】
http://www.cnblogs.com/xcxc/p/3601909.html dedecms的数据库操作类,非常实用,在二次开发中尤其重要,这个数据库操作类说明算是奉献给大家的小礼物了. 引入 ...
- C++学习14 继承的概念及语法
继承是类与类之间的关系,是一个很简单很直观的概念,与现实世界中的继承(例如儿子继承父亲财产)类似. 继承(Inheritance)可以理解为一个类从另一个类获取成员变量和成员函数的过程.例如类B继承于 ...
- python matplotlib plot 数据中的中文无法正常显示的解决办法
转发自:http://blog.csdn.net/laoyaotask/article/details/22117745?utm_source=tuicool python matplotlib pl ...
- C# 中将多个空格替换成一个空格
2013-04-17 15:36 C# 中如何将多个空格替换成一个空格? 1 myString = Regex.Replace(myString, @"\s+", " & ...
- Android Screen Monitor抓取真机屏幕
今天看到一款有点意思的开源软件“android-screen-monitor”, 简要记录如下: 1 简介 一款同步手机真机屏幕到PC上的软件(屏幕实时抓取,有点小卡) 2 开源地址 http://c ...