这并不是负面的,因为我一直在阅读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本身的执行方式不同?
答案 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
}