ChatGPT解决这个技术问题 Extra ChatGPT

何时使用 MongoDB 或其他面向文档的数据库系统? [关闭]

关闭。这个问题是基于意见的。它目前不接受答案。想改进这个问题?更新问题,以便可以通过编辑这篇文章用事实和引用来回答它。 8年前关闭。改进这个问题

我们为视频和音频剪辑、照片和矢量图提供平台。我们从 MySQL 作为数据库后端开始,最近包含用于存储文件的所有元信息的 MongoDB,因为 MongoDB 更符合要求。例如:照片可能有 Exif 信息,视频可能有音轨,我们也想在其中存储元信息。视频和矢量图不共享任何共同的元信息等,所以我知道,MongoDB 非常适合存储这些非结构化数据并使其可搜索。

但是,我们会继续开发我们的平台并添加功能。现在接下来的步骤之一就是为我们的用户提供一个论坛。现在出现的问题是:使用 MySQL 数据库,这将是存储论坛和论坛帖子等的一个不错的选择,还是使用 MongoDB 呢?

所以问题是:何时使用 MongoDB,何时使用 RDBMS。如果您可以选择,您会选择 mongoDB 还是 MySQL,为什么要选择它?

不知道为什么这显然不是基于意见的。这里有一个明确的正确或错误答案。

K
Ken Y-N

NoSQL: If Only It Was That Easy 中,作者写到了 MongoDB:

MongoDB 不是键/值存储,它更多。它也绝对不是 RDBMS。我没有在生产中使用过 MongoDB,但我已经用它构建了一个测试应用程序,它是一个非常酷的工具包。它似乎非常高效,并且已经或即将拥有容错和自动分片(也就是它会扩展)。我认为 Mongo 可能是迄今为止我见过的最接近 RDBMS 替代品的东西。它不适用于所有数据集和访问模式,但它是为典型的 CRUD 内容而构建的。存储本质上是一个巨大的散列,并能够选择任何这些键,是大多数人使用关系数据库的目的。如果您的数据库是 3NF 并且您不进行任何连接(您只是选择一堆表并将所有对象放在一起,也就是大多数人在 Web 应用程序中所做的),MongoDB 可能会为您提供帮助。

然后,在结论中:

真正要指出的是,如果你因为无法选择数据库而无法做出超级棒的东西,那你就做错了。如果你知道mysql,就用它。在您真正需要时进行优化。像 ak/v 商店一样使用它,像 rdbms 一样使用它,但是看在上帝的份上,构建你的杀手级应用!这对大多数应用程序都无关紧要。 Facebook 仍然大量使用 MySQL。 Wikipedia 大量使用 MySQL。 FriendFeed 经常使用 MySQL。 NoSQL 是一个很棒的工具,但它肯定不会成为你的竞争优势,它不会让你的应用程序变得热门,而且最重要的是,你的用户不会关心这些。我将在什么基础上构建下一个应用程序?可能是Postgres。我会使用 NoSQL 吗?也许。我也可能使用 Hadoop 和 Hive。我可能会将所有内容保存在平面文件中。也许我会开始在 Maglev 上进行黑客攻击。我会使用最适合这项工作的东西。如果我需要报告,我不会使用任何 NoSQL。如果需要缓存,我可能会使用 Tokyo Tyrant。如果我需要 ACIDity,我不会使用 NoSQL。如果我需要大量的计数器,我会使用 Redis。如果我需要交易,我会使用 Postgres。如果我有大量单一类型的文档,我可能会使用 Mongo。如果我需要每天编写 10 亿个对象,我可能会使用 Voldemort。如果我需要全文搜索,我可能会使用 Solr。如果我需要对易失性数据进行全文搜索,我可能会使用 Sphinx。

我喜欢这篇文章,我觉得它信息量很大,它很好地概述了 NoSQL 的前景和炒作。但是,这是最重要的部分,在 RDBMS 和 NoSQL 之间进行选择时,问自己正确的问题确实很有帮助。值得一读恕我直言。

Alternate link to article


谢谢,这确实是一篇非常有趣的文章。
@iddqd ROFL!伙计,这太搞笑了。 “如果你愚蠢到完全忽略可靠性只是为了获得基准,我建议你将数据传输到 /dev/null,它会非常快”:D
感谢炒作意识的答案。
希望 BJ Clark 不会选择在同一个项目中使用所有这些技术。那将是一个学习曲线。
E
Elnur Abdurrakhimov

在将 MongoDb 用于社交应用程序两年后,我见证了没有 SQL RDBMS 的真正意义。

您最终会编写作业来完成诸如连接来自不同表/集合的数据之类的事情,这是 RDBMS 会自动为您完成的事情。您使用 NoSQL 的查询能力被严重削弱。 MongoDb 可能是最接近 SQL 的东西,但仍然远远落后。相信我。 SQL 查询超级直观、灵活且功能强大。 MongoDb 查询不是。 MongoDb 查询只能从一个集合中检索数据,并且只能利用一个索引。 MongoDb 可能是最灵活的 NoSQL 数据库之一。在许多情况下,这意味着更多往返于服务器以查找相关记录。然后你开始去规范化数据——这意味着后台作业。它不是关系数据库这一事实意味着您不会(被某些人认为表现不佳)外键约束来确保您的数据是一致的。我向您保证,这最终会在您的数据库中造成数据不一致。做好准备。您很可能会开始编写流程或检查以保持数据库的一致性,这可能不会比让 RDBMS 为您执行更好。忘记像hibernate这样的成熟框架。

我相信 98% 的项目使用典型的 SQL RDBMS 可能比使用 NoSQL 好得多。


有趣的想法...
另一方面,查询功能和您描述的连接应该不是问题:如果您使用 MongoDB,那么您仍然需要做一些工作来设计您的集合以及您将在其中放入哪些数据,这样您就不需要复杂的JOIN 等等。无论如何,数据库不是瓶颈,对于某些用例,有像 Memcache 这样的变通方法。如果从头开始,您可能会发现设计和使用 MongoDB 更简单、更快(作为使用目标代码的开发人员,我不需要 ORM)。当然你必须写一些脚本,但实际上并不难,而且你可以重用代码
大多数人不会将 NoSQL 数据库用于创建它们的非常具体的用例,然后重新发明了这么多轮子。 NoSQL vs. SQL debate 表明,许多人使用 NoSQL 的体验仿佛回到了 20 到 30 年前的 pre-Codd, pre-relational, pre-SQL times。或者,正如迈克尔·斯通布雷克所说:"What Goes Around Comes Around"
第 3 项“并仅利用一个索引”今天仍然有效吗?我现在才进入 MongoDB,从我目前阅读/查看的内容来看,它似乎可以支持多个索引?
#2、#3、#5 今天不再正确(我知道这个答案是很久以前写的)。另外:如果你最终得到 #1 / #4,这意味着你使用了 MongoDB,但不知道它是什么以及它应该做什么。适合工作的工具...
L
Lior Cohen

存储这些非结构化数据

正如您所说,MongoDB 最适合存储非结构化数据。这可以将您的数据组织成文档格式。这些称为 NoSQL 数据存储(MongoDBCouchDBVoldemort)的 RDBMS 替代方案对于大规模扩展并需要从这些大数据存储中更快地访问数据的应用程序非常有用。

并且这些数据库的实现比常规的 RDBMS 更简单。由于这些是直接序列化到磁盘中的简单键值或文档样式的二进制对象。这些数据存储不强制执行 ACID 属性和任何模式。这不提供任何交易能力。所以这可以扩大规模,我们可以实现更快的访问(读取和写入)。

但相比之下,RDBM 对数据强制执行 ACID 和模式。如果您想使用结构化数据,您可以继续使用 RDBM。

我会选择 MySQL 来为这类东西创建论坛。因为这不会扩大规模。这是一个非常简单(常见)的应用程序,它在数据之间具有结构化的关系。


“我会选择 mysql 来创建论坛之类的东西。”真的吗?我认为使用面向文档的数据库编写论坛之类的东西比使用关系数据库要容易得多(如果你是从头开始编写的话)。如果您不是特别需要 RDBMS 的功能,我会说使用 MongoDB 或类似的数据库,以便于使用和扩展。
2018 年:MongoDB 也支持 ACID
J
Journeyman

请注意,Mongo 本质上存储 JSON。如果您的应用程序正在处理大量 JS 对象(带有嵌套)并且您想要持久化这些对象,那么使用 Mongo 有一个非常强大的论据。它使您的 DAL 和 MVC 层超薄,因为它们没有解包所有 JS 对象属性并试图将它们强制适合它们不自然适合的结构(模式)。

我们有一个系统,其核心包含几个复杂的 JS 对象,我们喜欢 Mongo,因为我们可以非常非常轻松地持久化所有内容。我们的对象也是相当无定形和非结构化的,Mongo 毫不犹豫地吸收了这种复杂性。我们有一个自定义报告层,可以破译人类消费的无定形数据,这并不难开发。


F
Fred

谁需要分布式的分片论坛?也许是 Facebook,但除非你正在创建一个 Facebook 竞争对手,否则只需使用 Mysql、Postgres 或任何你最喜欢的东西。如果您想尝试 MongoDB,可以,但不要指望它会为您带来魔力。它会有它的怪癖和一般的肮脏,就像其他一切一样,我相信你已经发现了,如果你真的已经在研究它了。

当然,MongoDB 可能被大肆宣传,表面上看起来很容易,但您会遇到更成熟的产品已经克服的问题。不要那么容易被引诱,而是等到“nosql”成熟,或者死亡。

就个人而言,我认为“nosql”会因碎片化而枯萎和消亡,因为没有固定的标准(几乎按照定义)。所以我个人不会为任何长期项目打赌。

在我的书中,唯一可以节省“nosql”的是它是否可以无缝集成到 Ruby 或类似语言中,并使语言“持久化”,几乎没有任何编码和设计开销。这可能会实现,但我会等到那时,而不是现在,当然它需要更加成熟。

顺便说一句,您为什么要从头开始创建论坛?有大量的开源论坛可以进行调整以满足大多数需求,除非你真的在创建下一代论坛(我对此表示怀疑)。


感谢您的回答。集成一个论坛是一团糟——我们已经这样做了,并决定不再这样做:我们不需要成千上万的功能,而是完全集成到我们的软件中。
m
mdirolf

如果您需要复杂的事务,我会说使用 RDBMS。否则我会选择 MongoDB——使用起来更灵活,而且你知道它可以在你需要的时候进行扩展。 (虽然我有偏见 - 我在 MongoDB 项目上工作)


复杂事务在 MongoDB 中不起作用,但它们在其他 NoSQL 数据库中起作用,例如 MarkLogic(我也有偏见,因为我为 MarkLogic 运行开发人员社区)。
感谢您对 MarkLogic 的提示——我不知道。
我想听听 mdirolf 的意见。为什么MongoDB选择不实现事务?
S
Sushant Gupta

您可能想要更喜欢 Mongo 的两个主要原因是

架构设计的灵活性(JSON 类型的文档存储)。

可扩展性 - 只需添加节点,它就可以很好地水平扩展。

它适用于大数据应用。 RDBMS 不适合大数据。


K
Kazuki Ohta

我看到很多公司都在使用 MongoDB 从应用程序日志中进行实时分析。它的无模式确实适合应用程序日志,其中记录模式往往会不时更改。此外,它的 Capped Collection 功能很有用,因为它会自动清除旧数据以保持数据适合内存。

这是我真正认为 MongoDB 适合的一个领域,但通常更推荐 MySQL/PostgreSQL。网络上有很多文档和开发人员资源,以及它们的功能和健壮性。


F
Flexo

你知道,关于连接和“复杂事务”的所有这些东西——但多年前,正是蒙蒂本人解释了 COMMIT / ROLLBACK 的“需要”,并说“所有这些都在逻辑类中完成” (而不是数据库)无论如何' - 所以这又是同一件事。需要一个笨拙但非常整洁和快速的数据存储/检索引擎,用于 99% 的 Web 应用程序所做的工作。


谢谢,你在这里提出了一个有趣的观点。我真的会对 Monty 的解释感兴趣,因为我不确定在纯应用程序逻辑中跨多个表的更新回滚有多复杂——我不确定这是否真的可能?
我也不确定“最好”的方式。我们总是只跟踪对数据库所做的一切,然后在应用程序级别以代码的形式允许或撤消它。我们从未在任何地方、任何地方依赖过交易。 Mongo 文档建议使用元数据来跟踪可回滚事务的哪些部分已经发生,事务处于什么状态,以防它中断并需要回滚。有趣的是,我们已经与 MySQL 和其他人一起这样做了。这不是更多的工作,而是专注于正在发生的事情、时间、地点和原因,而不是黑箱化它。
在某处的 10gen 网站上有一条关于此的说明……提到如何手动使用“互锁”字段或“棘轮”来指示多步骤过程的状态。在我看来,如果你放大 MySQL 引擎本身,“块事务”仍然扩展为一系列步骤,无论如何;只是联锁或棘轮以比在数据库字段中手动跟踪更小、更快的方式完成。
我们还没有找到限制 MongoDB 守护进程的好方法——它几乎吞噬了所有可用的 RAM 用于其索引和内存中的数据存储,尽管当其他 proc 需要它时它会迅速产生内存。尽管如此,最好有一个 'use_max_memory' 或其他一些容易定义的限制,以确保 MongoDB 不会失控并将服务器发送到交换抖动(我们已经多次看到这种情况,即使在最新版本中也是如此)。至少 MySQL 接受各种可定义的限制和操作提示。
没有直接关系,但有点类似:我们使用了 memcached,但由于仍未解决的 Memcache/Memcached PHP 驱动程序惨败而放弃了它。我们使用 MongoDB 作为一个快速的临时 key:val 存储(它工作得很好!),直到发现 apc_store() 是多么快速和简单。如果我们发现 APC 被我们用来存储在 memcached 中的临时 crud(与存储的预编译 PHP 相比)填满,我们将恢复到 MongoDB 的 key:val 存储。
A
Adrien Hadj-Salah

如前所述,您可以在很多选项中进行选择,看看所有这些选项:http://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redis

我的建议是找到你的最佳组合:如果你需要 ACID 并且你想加入一些表,MySQL + Memcache 真的很棒 MongoDB + Redis 非常适合文档存储 Neo4J 非常适合图形数据库

我做什么:我从 MySQl + Memcache 开始,因为我习惯了,然后我开始使用其他数据库框架。例如,在一个项目中,您可以结合 MySQL 和 MongoDB!


MySQL + memcached 会给你最终的一致性。在 RDMB 上下文中我不考虑 ACID。