为什么不是mongodb?

时间:2010-11-26 21:23:09

标签: mongodb

我最近第一次使用MongoDB,发现它非常易于使用且性能卓越。这引出了我的问题 - 为什么不是MongoDB?

让我们说我正在实施Q&一个应用程序我的方法是在MySQL数据库中实现用户数据,然后使用MongoDB进行问答存储 - 一个存储问题和所有响应的集合。

这种方法有什么问题吗?

8 个答案:

答案 0 :(得分:33)

MongoDB听起来像是一个很好的应用程序,但你有很多理由不使用它。

MongoDB不适合需要的应用程序:

  1. 多对象事务:MongoDB仅支持单个文档的ACID事务。
  2. SQL:SQL是众所周知的,很多人都知道如何编写非常复杂的查询来做很多事情。这些知识可以跨MongoDB的查询语言特定的许多实现进行转移。
  3. 强大的ACID保证:MongoDB允许读取不一致的内容,这在某些应用程序中很好,但根本不是。
  4. 传统BI:存在许多非常强大的工具,允许OLAP和其他强大的BI应用程序以及针对传统SQL数据库运行的应用程序。

答案 1 :(得分:19)

MongoDB是一个出色的数据库,我很喜欢使用它。也就是说,如果你来自SQL的世界,它有一些陷阱。

除了ACID和其他有充分记录的事情(以及其他答案),这些事情让我们感到惊讶:

  • MongoDB希望你有内存。 很多记忆。如果你无法将你的工作集安装在内存中,你可以忘掉它。这与大多数只使用内存作为缓存的关系数据库不同! 更具体一点: MongoDB使用RAM作为主存储,并将不需要的部分“交换”到磁盘上(Mongo决定将哪些部分“交换”到内核)。传统的RDBMS以相反的方式工作 - 它们使用磁盘作为主存储,并使用RAM作为缓存机制。所以一般来说MongoDB使用更多的RAM。这本身并不是一件坏事,但结果“真正的” RAM消耗难以预测,一旦工作集超过(很难),就会导致严重且意外的性能下降。预测)限制。

  • 删除记录时,
  • 存储不会自动缩小。每个集合分配的空间将保持分配,直到您repair DB或删除集合。它在数据库级别(数据文件)上以巨大的块分配,然后在需要时分配给集合( extents )。也就是说,在集合的已分配空间内,已删除的文档会为同一集合中的其他文档释放空间。这是对概念的一个很好的解释:http://www.10gen.com/presentations/storage-engine-internals

  • 与在服务器端解析的SQL形成鲜明对比,在Mongo中,您将数据结构传递给查询和CRUD函数。结果是每个驱动程序提供不同的语法,这有点烦人。例如,PyMongo使用元组列表而不是字典(可能是因为Python中的dict不保留键的顺序)来指定find()将返回哪些字段:(公平地说,这可能是唯一的理智的做法 - 但这是不使用SQL等基于字符串的语言的结果
    • MongoDB shell:db.test.find({}, {a:1})
    • PyMongo:db.find({}, fields=[(a,1,)]

这不应被视为对MongoDB的批评 - 我喜欢使用它,它已被证明是一种可靠且高效的工具。但要正确使用它,你需要了解它的空间管理。

答案 2 :(得分:8)

可能的缺点:

  1. 您在仅使用SQL关系数据库的组织中工作。您还没有批准或支持使用NoSQL数据库。
  2. 您从未管理过MongoDB群集;与所有技术一样,这里有一条学习曲线。
  3. 您的数据确实是关系型的(例如,一个用户有很多问题;一个问题有很多答案),您忽略了这种可能性。
  4. MondoDB是一个很好的解决方案,适用于适用的情况。如果你可以使用它,为什么不呢?

答案 3 :(得分:4)

@johndodo关于内存使用情况。 他们在官方常见问题解答页面上说:

  

MongoDB是否需要大量内存?

     

不一定。在机器上运行MongoDB当然是可能的   有少量的免费RAM。 MongoDB自动使用所有免费的   机器上的内存作为缓存。系统资源监视器显示   MongoDB使用了大量内存,但它的用法是动态的。如果另一个   进程突然需要服务器的一半RAM,MongoDB会产生   将内存缓存到其他进程。

     

从技术上讲,操作系统的虚拟内存子系统可以管理   MongoDB的记忆。这意味着MongoDB将使用尽可能多的可用内存   尽可能根据需要交换到磁盘。具有足够内存的部署   在RAM中适应应用程序的工作数据集将达到最佳效果   性能

所以我认为,学习曲线就是答案。你越了解技术 - 你的系统就越好。

答案 4 :(得分:3)

我一直在研究几个基于SQL DB的系统,经过3年以上的mongodb(使用Rails mongoid驱动程序),我有三个主要原因。

  • 我没有必要连接表,所以它更快。大多数情况下,文档包含我需要的所有内容,如果没有,我会再次获取相关文档。
  • 我获取文档一次然后映射数组/ json以收集数据并进行操作。所以我少访问数据库,因为映射/收集在内存上发生的速度要快得多。当我使用嵌入式文档时,这变得更加有效。
  • 我可以让客户轻松高效地定义自己的字段。不值得尝试SQL DB。

答案 5 :(得分:2)

我找不到从用户信息中提取所有数据的理由。到q& a MongoDB中的一个,除了一个实际原因:

在共享托管环境中,不容易找到服务提供商提供的MongoDB托管。与mySql不同,它成为托管计划的标准。

答案 6 :(得分:2)

添加其他评论;决定数据存储(SQL或NoSQL)在很大程度上取决于您的复制要求。

MongoDB遵循MySQL-esque master-slave-slave- *(1个主从,多个从属)配置。你只能写信给主人。

在地理位置分散的系统中,这可能是不可接受的(您需要能够写入任何主服务器并让服务器协调)。

在这些情况下,像Cassandra,Riak,CouchDB这样的服务器在这些情况下会更好。

所有这一切,如果MySQL非常适合您的应用,并且您想使用NoSQL,Mongo是完美的解决方案。

答案 7 :(得分:0)

在为我的项目决定数据库时,我听说mongoDB是免费的,然后我想为什么不是mongoDB?

好吧,为了更加确定我打电话给MongoDB客户支持团队。 目前有三种不同版本的MongoDB。

  1. 社区服务器
  2. 专业
  3. 企业
  4. 实际上社区服务器是免费的,其他2是付费软件。

    我问那个人 -

      

    我在哪里可以使用mongodb的社区服务器?

    低于我通过电子邮件收到的回复 -

      

    社区服务器建议用于开发环境。用于生产目的   企业提供是必需的。

    使用版本前请确定。

    希望这会对你有所帮助:)。