2011-11-17 54 views
1

我玩弄MongoDB中,我发现自己不断思考RDBMS和我需要你的帮助,让我的头出于此。你应该在MongoDB中嵌入多少?

所以我有我想标记的文件。随着每个文档/示例的提及,我将在文档中嵌入标签。然而,我的下一个虽然会是,在哪里保存slug(从该标签)。

如果每个文档的保存,而不是像

["tag1", "this is tag 2"] 

在保存它喜欢:

[{ "slug": "tag1", "tag": "tag1" }, { "slug": "this-is-tag-2", tag: "this is tag 2" }] 

或者我应该有一个包含一个独特的标签来塞匹配另一个集合? (因此,在获取所有文件之前,首先需要查询“slug-this-a-tag-2”)?

是不是将文件中的文件保存在文档中浪费空间(考虑到关系是不断是相同的?),并且在查询集合时可能会导致性能开销?

你会怎么做呢?

回答

0

这取决于你所要完成的任务。在RDBMS中,您可以搜索第一个真正的数据结构,其格式为n。对于文档存储中的特定数据集没有这种“正确的”数据结构 - 为了找到一个好的数据结构,您必须问自己:我的查询是什么样的?我会阅读的次数比我插入的次数多吗?

例如,对于嵌入将是一个有问题的查询:“显示了所用的标签,以受欢迎程度排列”,甚至更糟“显示我的朋友们的受欢迎程度排列使用的标记”。要快速执行以前的查询,您必须跟踪其他地方的可用标签和引用数量。对于后者,您应该使用RDBMS。

标记是罕见的情况下,我通常会嵌入一个,因为通常标签不经常改变,而且也没有必要有某种参照完整性(即你不能改变'一个标签')。但这取决于你在标注什么以及谁在做这件事。

我也不明白什么slug是好的:如果你需要的东西,你可以搜索,你可以简单地删除特殊的字符和空格,并在插入这个小写字符串?

+0

首先感谢答案。我理解你的观点,但是我对标签的需求,我猜想只限于'让我获得具有这个或这些标签的文档',或者'有多少文档具有标签'tag1',从我读过的应该是挺直的。至于slug,出现在那里的唯一原因就是能够快速创建/ tag/this-is-tag-2形式的URL,并且能够快速(安全地)检索所有相关文件。那么你会嵌入slu or,还是将它保存在另一个集合? – mobius

+0

您应该能够从标签中创建slu alone。然后它变得非常简单(标签集合中没有对象,只是字符串)并且嵌入将会很好地完成这项工作。如果标签是'疯狂的东西',你可以很容易地将它映射到URL'/ tagged/crazy-stuff'。重点在于数组中的嵌入对象比简单字段(如数组中的字符串)更难以使用(并且速度更慢)。 – mnemosyn

+0

我已经把它打开了,以防有人想发布答案,但因为你是唯一一个陷入了回答问题的人,所以我要把这个标记为正确的。谢谢! – mobius