95

我习惯使用 MySQL 或 PostgreSQL 等关系型数据库,并与 Symfony、RoR 或 Django 等 MVC 框架结合使用,我认为效果很好。

但是最近我听说了很多关于 MongoDB 的非关系型数据库,或者,引用官方定义

一个可扩展的、高性能的、开源的、无模式的、面向文档的数据库。

我真的对处于领先地位很感兴趣,并且想了解下一个项目我将拥有的所有选项,并选择那里最好的技术。

在哪些情况下使用 MongoDB(或类似数据库)比使用“经典”关系数据库更好?总体而言,MongoDB 与 MySQL 的优势是什么?或者至少,为什么会如此不同?

如果您有指向文档和/或示例的指针,那也会有很大帮助。

4

8 回答 8

58

以下是 MongoDB 在构建 Web 应用程序方面的一些优势:

  1. 基于文档的数据模型。存储的基本单元类似于 JSON、Python 字典、Ruby 哈希等。这是一种能够保存数组和其他文档的丰富数据结构。这意味着您通常可以在单个实体中表示需要多个表才能在关系数据库中正确表示的构造。如果您的数据是不可变的,这将特别有用。
  2. 深度查询能力。MongoDB 支持使用几乎与 SQL 一样强大的基于文档的查询语言对文档进行动态查询。
  3. 没有架构迁移。由于 MongoDB 是无模式的,因此您的代码定义了您的模式。
  4. 水平可扩展性的清晰路径。

您需要阅读更多关于它的信息并使用它来获得更好的想法。这是一个在线演示:

http://try.mongodb.org/

于 2010-01-22T15:27:01.737 回答
23

有很多优点。

例如,您的数据库架构将更具可扩展性,您不必担心迁移,代码编写起来会更愉快......例如这是我的模型代码之一:

class Setting
  include MongoMapper::Document

  key :news_search, String, :required => true
  key :is_availaible_for_iphone, :required => true, :default => false

  belongs_to :movie
end

添加密钥只是添加一行代码!

从长远来看,还会出现其他优势,例如更好的可扩展性和速度。

...但请记住,非关系数据库并不关系数据库好。如果您的数据库有很多关系和规范化,那么使用 MongoDB 之类的东西可能没什么意义。这一切都是为了找到适合工作的工具。

如果想了解更多内容,我建议您查看“为什么我认为 Mongo 之于数据库就像 Rails 之于框架”或mongodb 网站上的这篇文章。如果您会说法语,请看一下这篇解释如何从头开始设置 MongoDB 的文章。

编辑:我差点忘了告诉你Ryan这个 railscast。这很有趣,让你想马上开始!

于 2010-01-22T13:21:20.963 回答
5

无模式的优点是您可以转储其中的任何负载,并且没有人会抱怨它或说它是错误的。

这也意味着无论你倾倒在其中的什么,在你这样做之后仍然完全没有意义。

有些人会认为这是一个严重的劣势,有些人不会。

关系数据库具有完善的模式这一事实是由于它具有完善的扩展谓词集这一事实,这些谓词使我们能够将意义附加到数据库中记录的内容,并且这些谓词是也是我们这样做的必要前提。

如果没有完善的模式,没有外延谓词,也没有外延谓词,用户就无法从其中填充的内容中获得任何意义。

于 2010-01-22T23:03:15.617 回答
3

在我的项目中使用了两个数据库之后,我对 Postgres 和 Mongo 的体验。

Postgres(关系型数据库管理系统)

如果您未来的应用程序有一个需要大量连接的复杂模式,或者所有数据都有关系,或者我们的写作量很大,建议使用 Postgres。Postgres 是开源的、速度更快、符合 ACID 并且在磁盘上使用更少的内存,并且在 JSON 存储方面也具有良好的性能,并且包括具有 3 级事务隔离的事务的完全可序列化性。

留在 Postgres 的最大优势是我们拥有两全其美的优势。我们可以将数据存储到具有约束、一致性和速度的 JSONB 中。另一方面,我们可以将所有 SQL 特性用于其他类型的数据。底层引擎非常稳定,可以很好地应对各种数据量。它还可以在您选择的硬件和操作系统上运行。Postgres 提供 NoSQL 功能以及完整的事务支持,存储带有字段数据约束的 JSON 文档。

Postgres 的一般约束

水平扩展 Postgres 要困难得多,但可行。

Postgres 无法完全实现快速读取操作。

没有 SQL 数据库

Mongo DB(有线老虎)

MongoDB 在“水平尺度”维度上可能会击败 Postgres。存储 JSON 是 Mongo 的优化目标。Mongo 以称为 BSONb 的二进制格式存储其数据,它(大致)只是 JSON 超集的二进制表示。MongoDB 完全按照设计的方式存储对象。根据 MongoDB 的说法,对于写入密集型应用程序,Mongo 表示,新引擎(Wired Tiger)为用户提供了高达 10 倍的写入性能提升(我应该试试这个),存储利用率降低 80%,有助于降低存储成本,实现硬件的更大利用率。

MongoDb 的一般约束

使用无模式存储引擎会导致隐式模式问题。这些模式不是由我们的存储引擎定义的,而是基于应用程序行为和期望定义的。

独立的 NoSQL 技术不符合 ACID 标准,因为它们牺牲了关键数据保护以支持非结构化应用程序的高吞吐量性能。在 NoSQL 数据库上应用 ACID 并不难,但它会在某种程度上使数据库变得缓慢和不灵活。“大多数 NoSQL 限制在较新的版本和发行版中进行了优化,在很大程度上克服了以前的限制”。

于 2017-03-21T09:17:49.630 回答
2

这都是关于权衡的。MongoDB 速度快但不是 ACID,它没有事务。在某些用例中它比 MySQL 更好,而在另一些用例中则更差。

于 2010-01-22T22:15:08.917 回答
1

用 MongoDB 编写的波纹管:权威指南。

有几个很好的理由:

  1. 将不同类型的文档保存在同一个集合中对于开发人员和管理员来说可能是一场噩梦。开发人员需要确保每个查询只返回某种类型的文档,或者执行查询的应用程序代码可以处理不同形状的文档。如果我们要查询博客文章,那么清除包含作者数据的文档会很麻烦。
  2. 获取集合列表比提取集合中的类型列表要快得多。例如,如果我们在集合中有一个类型键来说明每个文档是“skim”、“whole”还是“chunky monkey”文档,那么在单个集合中查找这三个值会比查找要慢得多拥有三个独立的集合并查询它们的名称
  3. 将相同类型的文档分组到同一个集合中可以实现数据局部性。从仅包含帖子的集合中获取几篇博客帖子可能比从包含帖子和作者数据的集合中获取相同的帖子需要更少的磁盘查找。
  4. 当我们创建索引时,我们开始在我们的文档上强加一些结构。(在唯一索引的情况下尤其如此。)这些索引是按集合定义的。通过仅将单一类型的文档放入同一个集合中,我们可以更有效地索引我们的集合
于 2013-07-01T13:06:17.933 回答
0

在询问了具有文本存储的数据库之后),我看了一眼 MongoDB 和类似的系统。
如果我理解正确,它们应该更易于使用和设置,而且速度更快。或许也更安全,因为缺少 SQL 可以防止 SQL 注入……
显然,MongoDB 主要用于 Web 应用程序。
基本上,他们自己说,这些数据库不适合复杂的查询、数据挖掘等。但它们擅长快速检索大量平面数据。

于 2010-01-22T13:21:50.230 回答
0
  1. MongoDB支持按字段搜索,正则表达式搜索。包括用户定义的java脚本函数。
  2. MongoDB 可以用作文件系统,利用多台机器上的负载平衡和数据复制功能来存储文件。
于 2013-12-18T06:02:34.730 回答