2013-01-04 75 views
4

我正在学习MongoDB,我有一个关于数据重复的问题。在SQL世界中,您尝试对数据进行规范化。例如,我有一个带有类别的表格,另一个带有产品。每个产品可能属于许多类别,因此这些表格之间存在连接。MongoDB中的非规范化数据

但是我在MongoDB中认为你不这么想吗?相反,每个产品都有嵌入式文档(一个或多个)?这就是它的方式吗?你不在乎数据是否重复?

回答

7

在SQL世界里,你去尝试标准化数据

并非总是如此,归到死的地步对其造成性能开销,但是这是事实,我个人同正常化并不适用于MongoDB的作为我做SQL。

如果您知道规范化表单(http://en.wikipedia.org/wiki/Database_normalization),我喜欢将MongoDB视为转到1NF,然后再返回到非归一化。

你不关心数据是否重复?

哦,是的,我们做。如果数据重复错误,更新会很痛苦。

让我举一个例子:categoryproduct将是两个独立的实体,不存在否认。这两个实体是标准化的(product的重复数据已经从category指定)。另一种思考方式是:所有产品是否只存在于一个类别中?

因此,在顶层实体中,您可以看到,与1NF轻松应用于MongoDB相同的规则相对适用。

在复制的前面,当然,您不希望将每个产品分别存储在每个类别中(我对上述问题的回答是否定的),因此您自然希望将分类和产品分开。

您通常会在这里与中等规格化表格建立多对多关系。这就是解除归一化的地方。你可以说一个类别将有一个该类别唯一的产品列表,因此你可以将多对多关系表取消归类到列表中作为列表(或以其他方式进入产品行)。这不会产生重复,因为该列表对于该类别是唯一的(很可能)。这当然意味着该类别或产品将包含相关行的列表_id而不是对象本身。

有时候,重复是非常重要的,主要是为了优化或没有JOIN的变通;如果你曾经做过足够大的网站,这个规则也适用于SQL。

重复的典型使用场景是类似Facebook的帖子分享和评论等统计信息的聚合字段,甚至该帖子的5个最新评论也将被复制到帖子行中。

因此,它不是忽略模式设计,而是更多地针对MongoDB特性进行调整。通常如果你这样做,你会发现你自然会设计一个好的模式。

作为一个额外的参考,你可以参考这里:http://docs.mongodb.org/manual/core/data-modeling

+0

谢谢,只是举另外一个例子太多。如果您有个人收藏,您是否会将地址文档嵌入每个人中,还是将其作为参考资料的自己的收藏? – LuckyLuke

+0

我现在从您添加的链接中看到,我的所有问题都已得到解答。 – LuckyLuke