论:MongoDB的好坏丑

大数据 MongoDB
对刚刚接触MongoDB的人来说, MongoDB就是一个NoSQL类型的文档数据库. 文档中包含的键值对,构成了MongoDB的数据基本单位。这篇文章中,我将根据过去几年来我使用MongoDB所得出的经验,简短的介绍下MongoDB的好处、坏处和它丑陋的地方。

对刚刚接触 MongoDB 的人来说, MongoDB就是一个NoSQL类型的文档数据库. 文档中包含的键值对,构成了MongoDB的数据基本单位。

不过可以肯定的是MongoDB的确是当前***的NoSQL数据库. 它已被广泛接受并且适合各种各样的场合 (尽管不是所有项目都使用它)。

[[180107]]

这篇文章中,我将根据过去几年来我使用MongoDB所得出的经验,简短的介绍下MongoDB的好处、坏处和它丑陋的地方。

好处

自 MongoDB 流行以来,它的好处应该多于坏处和丑陋的地方. 如若不是,开发者们也不会接受它. 下面是一些MongoDB好的方面。

灵活的数据模型

当今动态的用户案例以及不断变化的应用,拥有一个灵活的数据模型是一种福音。灵活的数据模型意味着没有预先定义的模式,文档可以基于任何键值持有任何值的集合。

富有表现力的查询语法

MongoDB的查询语句是非常具有表现力且易于理解的。许多人会说这不像SQL语句。但是当我们能向前发展,且查询语句更简单并具表现力的时候,为什么我们还要坚持类似SQL的查询语句呢?

容易学习

MongoDB很容易学习,并且能快速上手。基本的安装、执行不会超过几个小时。 更强大的设置可能是复杂的,但是我会晚点再谈论这方面。

根据上面这些特点想必你应该很容易把它揉进你的项目中。

性能

查询性能是MongoDB的长处. 它把大多数可操作的数据存储在内存中. 所有的数据是固化在硬盘中的, 但在查询过程中, 它不会从硬盘中过去数据(那样太慢). 它直接从本地内存中获取数据,因此速度就会更快. 所以,为数据设置正确的索引并且提供足够的内存便能发挥MongoDB的性能优势。

可伸缩性和可靠性

MongoDB 具有很高的可伸缩性, 在碎片数据使用方面. 横向可伸缩性在大多数NoSQL数据库中是一大亮点. MongoDB 也不例外。

它也是高度可靠的,因为它的副本集数据被异步的复制到更多的节点。

异步驱动

对于所有的现代应用程序而言使用异步的非阻塞IO是提速的关键。MongoDB异步驱动程序支持***的语言。

文档

拥有一个良好的文档可以让开发人员的生活变得容易很多,特别是当开发人员面对的是新技术。MongoDB有出色的文档。

文本搜索

如果你正在建设一个网站, 需要搜索您的所有数据,文本搜索是必不可少的。例如,一个使用具有文本搜索的数据库的电子商务网站对用户来说更有利。

服务端脚本

如果你有一些操作需要在服务端而不是应用端执行,在MongoDB中,你可以那么做。把mongo语句放在一个.js文件中,并用mongo命令执行js文件。

文档 = 对象

文档数据库的优点是对象可以在MongoDB中存储为一个单独的文档。 这边不需要对象关系映射(ORM)。

缺点

我们已经看到了有关MongoDB的各种优点,接下来要说下缺点了。我敢肯定批评家对这部分更感兴趣。如果使用不当,MongoDB可能会做坏事。

现今,实际上很少有应用程序需要事务,但是有一些程序还是需要的。不幸的是, MongoDB不支持事务。因此当一个请求中需要修改多个文档或多个集合时就不要使用MongoDB。由于没有ACID保证它可能会导致数据损坏。回滚操作必须由你的应用程序来处理。

没有触发器

在关系式数据库中,有触发器,在很多情况下它是十分有用的。但是在MongoDB中就没这个了。

存储

相比其他流行的数据库MongoDB需要更多的存储。 在 MongoDB 3.0中引入的WiredTiger解决了这个问题,但是对于大多数应用程序来说使用WiredTiger不甚理想。

磁盘清理

MongoDB不会自动清理磁盘空间。因此如果文档被修改了或删除了,磁盘空间不会被释放。你必须通过手动或重启来释放。

丑陋的

有时,丑陋可能比坏更糟糕。使用一项技术之前了解它的不足是很重要的。它不会阻止你使用它,但它可以让你的活的非常艰难。

层次结构

如果你有一个是递归包含孩子数据对象的数据模型 (如, 一个对象拥有与它相同数据类型的孩子对象并且层级很多), MongoDB的文档结构就会变得非常丑陋。对这些递归嵌入的文档进行索引、搜索和排序将非常困难。

Join(连接)

MongoDB中join两个文档是不容易的,虽然MongoDB 3.2支持左外连接 (lookup), 但它尚未成熟。如果你的应用程序需要在一个查询中实现获取多个集合中的数据,那可能无法实现。因此你必须使多个查询,这可能会让你的代码看起来有点乱。

索引

虽然MongoDB标榜速度是它的一大亮点,但它依赖于你建立了正确的索引。如果你建立的索引很糟糕或不正确顺序的复合索引,那么 MongoDB可能是最慢的数据库。

如果你有很多的过滤条件和排序字段,你可能会在一个集合上建立很多的索引,当然这是不好的一个做法。

重复数据

你可能会有大量重复的数据,MongoDB不支持关系式。修改这些重复数据可能会比较困难,且由于缺少事务支持,我们还可能会损坏数据。

结论

综述,只要你恰当的使用,MongoDB是一个优秀的数据库,否则它会给你带来麻烦。在不恰当的地方使用它你将会吃到苦头。

认真的分析以及咨询专家。正确的使用你绝对会爱上它。

至于坏的和丑陋的部分,你可以一些使用设计模式来解决其中的一些问题,在我的文章解释了 MongoDB设计模式。

MongoDB的***实践

下面列出了几个MongoDB的***实践:

硬件

  • 确保你的数据集能放入内存中

使用压缩

  • 每台服务器运行单个MongoDB
  • 对于写入数据较多的应用使用固态硬盘

数据模型

  • 一条记录的所有数据都存在一个文档中
  • 避免大尺寸的文档
  • 避免不必要的长字段名
  • 去掉不必要的索引
  • 删除其它索引前缀的索引

应用程序

  • 只修改变化的字段
  • 避免否定式查询
  • 对于复杂的查询运行explain()(查看执行计划)
  • 在可能的情况下使用覆盖查询.
  • 在需要的时候使用批量插入.

安装和配置

  • 拥有至少一个从库和一个仲裁
  • 当数据非常重要时应设置参数 write concern 为2
  • 有每日的数据转储备份。
责任编辑:未丽燕 来源: 36大数据
相关推荐

2009-12-02 14:09:52

2019-11-23 23:25:07

算法好坏数据

2011-05-06 17:16:18

相纸

2013-05-02 09:29:43

交换机评判端口密度

2012-07-16 09:45:44

降级论傻蛋

2011-03-25 09:24:38

SwingJComboBox

2022-05-05 12:03:08

分布式系统设计

2017-04-26 15:21:38

服务器配置

2009-06-22 13:44:00

JSFJava Web开发

2017-03-03 11:40:59

linuxping命令

2013-08-29 09:53:48

开发者iOS 7

2014-01-16 14:06:18

软件开发团队管理

2016-11-07 15:21:17

数据中心指标

2018-09-10 13:02:48

人工智能AI创业公司

2021-12-28 07:20:44

泛型Go场景

2019-03-25 21:11:35

华为

2011-05-25 16:23:35

Javascript类继承

2013-12-25 09:50:27

华为马悦企业业务

2009-07-16 15:35:17

交换机性能交换机质量

2016-01-29 10:06:47

UI设计标准
点赞
收藏

51CTO技术栈公众号