为什么不是mongodb?

chr*_*ann 31 mongodb

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

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

这种方法有什么问题吗?

geo*_*ane 33

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

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

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

  • “多对象”是指多个记录。在 ACID SQL DB 中,您可以执行事务并将多个内容插入单个表(或多个表中的多个内容)。MongoDB 仅支持单个文档存储的“ACID”,而不是一个列表中或多个列表中的多个文档。对于某些问题,这是一个重要的限制。 (2认同)

joh*_*odo 19

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

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

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

  • 删除记录时,存储不会自动收缩.每个集合分配的空间将保持分配状态,直到您使用repairDB或删除集合.它在数据库级别(数据文件)上以巨大的块分配,然后在需要时(扩展区)分配给集合.也就是说,在集合的已分配空间内,已删除的文档会为同一集合中的其他文档释放空间.这是对概念的一个很好的解释: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的批评 - 我喜欢使用它,它已被证明是一种可靠且高效的工具.但要正确使用它,您需要了解其空间管理.

  • 您是唯一确定围绕 MongoDB 的最大限制之一,即内存要求。如果您没有足够的 RAM 来同时为您的“工作集”存储数据和索引,Mongo 将继续工作,但性能会严重下降。这是一个非常有限的约束,因为数据库不难快速超过大多数计算机拥有的 RAM 量。 (2认同)
  • @TaimoorChangaiz 我知道它使用虚拟内存,这就是我的观点。虚拟内存仍然驻留在 RAM 中(如果幸运的话)或速度较慢的媒体(如果不是)。所以当它的一部分被“交换”时(我使用引号,因为这不是真正的交换,但过程和缺点非常相似)你会受到性能损失。真的没有办法解决它 - 这里的区别在于 MongoDB 将决定“交换”什么给内核,而其他 DB 自己管理这个,这 ** 可以** 更好,因为 DB 有更多关于数据的领域知识。 (2认同)

duf*_*ymo 8

可能的缺点:

  1. 您在仅使用SQL关系数据库的组织中工作.您还没有批准或支持使用NoSQL数据库.
  2. 您从未管理过MongoDB集群; 与所有技术一样,学习曲线也是如此.
  3. 你的数据真的是关系型的(例如,一个用户有很多问题;一个问题有很多答案),你忽略了这种可能性.

MondoDB是一个很好的解决方案,适用于适用的情况.如果你可以使用它,为什么不呢?

  • JSON 在这里是一个加分项。我不反对你的选择,只是回答你希望听到的缺点。 (2认同)
  • 关于3.,MongoDB可以有文档关系.在SQL中查询关系要容易得多. (2认同)

Riy*_*lla 5

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

MongoDB 遵循 MySQL 式的主-从-从-*(1 个主,多个从)配置。您只能写信给主人。

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

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

话虽如此,如果 MySQL 非常适合您的应用程序并且您想使用 NoSQL,那么 Mongo 是完美的解决方案。


bol*_*nik 5

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

MongoDB 需要大量 RAM 吗?

不必要。当然可以在具有少量空闲 RAM 的机器上运行 MongoDB。MongoDB 自动使用机器上的所有空闲内存作为其缓存。系统资源监视器显示 MongoDB 使用了大量内存,但它的使用是动态的。如果另一个进程突然需要服务器一半的 RAM,MongoDB 将向另一个进程提供缓存内存。

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

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