mysql - MongoDB 适合处理 SQL 类型的数据吗?

标签 mysql node.js mongodb database-design

我有一个相当大的应用程序,将数据存储在 MongoDB (Mongoose) 中,尽管事实上我的数据绝对是连续的,并且可以很好地呈现为具有模式的表。具体是我有很多对象之间的关系。因此,我需要执行非常深入的填充 - 每个请求总共 25 个以上。

一个好方法是为 MySQL 重写应用程序。然而,MongoDB 上绑定(bind)了大量代码。问题是:如果通过 ObjectID 的对象之间的关系越来越多,它是否仍然像 MySQL 一样高效,或者我应该深入代码并将应用程序完整移至 MySQL?

在这两种情况下我都使用 ORM。现在, Mongoose ,如果我移动 — 续集。

Mongo 在处理关系方面真的高效吗?我的意思是,SQL 被设计用来连接带有关系的表,我希望它有一些 secret 的优化。 Mongo 的关系似乎有点不寻常。因此,我担心从逻辑上讲,从 Mongo 中的 25 个集合收集数据或从 MySQL 中的 25 个表连接数据的相同查询对于 Mongo 来说可能会更慢。

这是我正在使用的架构示例。填充的字段标有 *。

Man
 -[friends_ids] --> [Man]*
                     -friends_ids*: ...
                     -pets_ids*: ...
                     -...
 -[pets_ids] -> [Pet]*
                 -name
                 -avatars*: [Avatar]
                            -path
                            -size
-...

我对人际关系的看法。让我们想象一下 Man 对象应该有 [friends] 字段。把它拿出来吧。

MySQL ORM:

  1. 从 MANS 表中查找 Man,其中 id=:id。
  2. 从 MAN-TO-MANS 表中查找 friend id = :步骤 1 中 Man 的 id 的所有记录
  3. 从 MANS 表中查找 id = :步骤 2 中的 Men 的 id 的所有记录
  4. 将其加入一个 Man 对象并填充好友字段

蒙戈:

  1. 从 MANS 集合中找到 Man,其中 _id=:_id。在此步骤中获取其好友 _id 的数组(未填充)
  2. 从 MANS 集合中查找步骤 1 中 _id = :_id of Men 的所有文档
  3. 将其加入一个 Man 对象并填充好友字段

没有连接表的请求。我说得对吗?

最佳答案

So I need to perform very deep populations — 25+ for each request in total.

一个常见的误解是 MongoDB 不支持 JOIN。虽然这部分正确,但也完全不正确。事实上,MongoDB 不支持服务器端连接

MongoDB 的座右铭是客户端连接。

这句座右铭可能对你不利;应用程序并不总是了解 JOIN 的最佳方式,因此您必须在 MongoDB 中非常仔细地选择架构、查询和 JOIN,以确保您的查询不会效率低下。

25+ 对于 MongoDB 来说是完全可能的,这不是问题。问题在于您正在执行什么 JOIN。

这导致:

Is Mongo really efficient in working with relations?

让我举一个例子来说明 MongoDB 实际上比 MySQL 更快。

假设您有一个 group 集合,其中每个 group 文档都包含一个 user_ids 字段,该字段表示为 ObjectId< 数组user 集合中的 _id 字段直接相关。

在这种特定情况下,执行两项查询(一项针对组,一项针对用户)可能比 MySQL 更快,因为 MongoDB 不需要使用 IO 带宽来自动写出结果集来执行常见任务。

尽管如此,任何复杂的事情都会让您感到沮丧,因为应用程序并不真正知道如何使用索引交叉和合并来创建性能稍差的 JOIN。

例如,假设您希望在一个查询中在 3 个表之间进行 JOIN,并通过 3 个 JOINed 表进行分页。这可能会降低 MongoDB 的性能,同时又不会执行如此低效的 JOIN。

但是,您可能还会发现这些 JOIN 无论如何都不可扩展,并且实际上会破坏您在 MySQL 上获得的任何性能。

if there will be growing amount of relations between objects by ObjectID, will it be still so efficient as MySQL or should I dive into code and move app complete to MySQL?

取决于查询,但我至少给了你一些指示。

关于mysql - MongoDB 适合处理 SQL 类型的数据吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24746763/

相关文章:

php - 我可以在 PHP 中混合使用 MySQL API 吗?

php - Node.js API 与 express 和 mysql - 仅在设置时应用搜索参数

MongoDB Count 和 groupby 子文档

node.js - MongoDb:使用唯一索引插入或更新多个文档

java - 在 mysql 中选择特定表的操作时触发电子邮件或信息

mysql - 如何将其他表中的选择分组为sql中的一列?

node.js - 从一年中的周数获取该月的周数

javascript - 如何终止 Mocha 测试运行?

javascript - 使用 NodeJS 时内存泄漏

mongodb - Numberlong(x) 和 Numberlong ("x"之间的区别)