这个Mongo查询是否与此SQL查询相同?我正确地想着Mongo吗?

时间:2014-05-07 12:06:35

标签: php mysql sql mongodb

这并不是负面的,因为我一直在阅读Mongo文件。我是这个概念的新手。 Mongo被吹捧为这个杀死MySQL的超高效数据库,但我阅读的所有Mongo语句似乎都可以减少,因此没有更高效的SQL。也许我采取了错误的做法。

假设你有两张桌子:

User

ID    Name    FavoriteColor
1     John    1
2     Jona    2
3     Jack    1

Color

ID    Name
1     Red
2     Green
3     Blue

要获取用户的颜色,我会这样做

SELECT
  `u`.`Name`,
  `c`.`color`
FROM `user` AS `u`
LEFT JOIN `color` AS `c` ON `u`.`FavoriteColor` = `c`.`id`

不确定该语法是否正确,我没有在我面前使用MySQL。

现在Mongo不支持连接(人们说这是Mongo的重点)所以如果我这样做,我会迭代用户集合,然后对于每个记录,我会根据用户最喜欢的颜色ID查询colors数据库。 “迭代”颜色集合(应该只返回一行)。但这似乎与(在PHP中)完全相同:

<?
        $query = "SELECT `Name`, `FavoriteColor` FROM `users`";
        $result = mysql_query($query);
        while($row = mysql_fetch_array($result)) {
             $username = $row["Name"];
             $query = "SELECT `Name` FROM `Color` WHERE `id` = " . $row["FavoriteColor"] . " LIMIT 1";
             $result = mysql_query($query);
             $color = "";
             //I know we return only one row but I am illustrating the concept of scanning the entire color table
             while($row2 = mysql_fetch_array($result)) {
                  $color = $row2["Name"];
             }

             echo "Hi I'm $username and my favorite color is $color <br>";
        }
?>

从效率的角度来看,我看不出MongoDB如何能比SQL快得多(加入或php迭代的方式似乎仍然是一样的)。在一天结束时,它必须扫描整个用户表,对于每个用户,它必须扫描整个颜色表以使colorID与喜欢的颜色相匹配。

我是否应该尝试在逻辑上减少MongoDB存储在行\ colums \表中,或者MongoDB本身的执行方式不同?

3 个答案:

答案 0 :(得分:1)

您对MongoDb中缺少联接支持是正确的。它允许自动分发MongoDB集合,而不会有被要求在两个分布式集合(表)之间进行连接的风险。如果可能,它将导致在服务器上进行大量工作,并且根本不可扩展。

所以它不支持连接,但它是面向文档的数据库,它支持嵌入式文档。它显着影响数据库结构设计。现在您可以选择是嵌入还是创建新集合(表),具体选择取决于数据本身和数据使用模式,因此您需要了解数据使用模式。 回到你的例子,这两个表可能会合并到一个集合user中,你可以这样:

{
  name: John,
  favoriteColor: Red
}

在这种情况下,检索相同数据不需要连接。它是完全不同的结构设计。但是,MongoDB不支持约束(除了唯一性),您需要注意不要尝试使用不存在的颜色。为此,您可以使用单独的color集合,并在将数据插入集合user时检查数据。

总结: MongoDB的效率不是更快地执行相同的操作,而是能够使用不同的范例来模拟旧问题。

答案 1 :(得分:1)

为了能够理解MongoDb,您需要尝试从RDBMS学到的东西中脱离思路。

MongoDB是一个&#34;动态架构&#34; system,一个基于文档的数据库,围绕对象概念的数据。

在您发布的示例中,您正在使用的结构仍在为您的设计实现更多关系数据库方法。为了扩展复杂的数据和开发速度,并记住没有加入支持,我建议你重新审视你的设计,并且&#34;去标准化&#34;您的馆藏即使您认为它可能看起来多余(基于过去40年来数据库的设计方式)

答案 2 :(得分:-1)

首先,Mongo可能会杀死MYSQL,但它甚至不接近MYSQL。

User

ID    Name    FavoriteColor
1     John    RED
2     Jona    GREEN
3     Jack    RED

这就是你的数据在mongo中的样子。 Mongo不支持连接,但支持嵌入式文档。如果您要经常查询该数据,建议您始终将数据放入mongo中的单个集合中。总之,没有颜色表/集合。最有可能的是,获取用户和颜色的查询将是

db.collection.find({},{name:1,favoriteColor:1})

您的收藏文档将如下所示。

{
  id: 1
  name: John
  FavCol: RED
}