我正在学习 MongoDB,我有一个关于数据重复的问题。在 SQL 世界中,您尝试规范化数据。例如,我有一个包含类别的表格和另一个包含产品的表格。每个产品可能属于许多类别,因此这些表之间存在连接。
但是,我认为在 MongoDB 中您不这样认为是对的吗?相反,每个产品是否都有嵌入的类别文档?就是这样吗?您不在乎数据是否重复?
我正在学习 MongoDB,我有一个关于数据重复的问题。在 SQL 世界中,您尝试规范化数据。例如,我有一个包含类别的表格和另一个包含产品的表格。每个产品可能属于许多类别,因此这些表之间存在连接。
但是,我认为在 MongoDB 中您不这样认为是对的吗?相反,每个产品是否都有嵌入的类别文档?就是这样吗?您不在乎数据是否重复?
在 SQL 世界中,您尝试规范化数据
并非总是如此,标准化到死亡点会导致性能下降,但我个人确实不会像使用 SQL 那样对 MongoDB 应用相同的标准化。
如果您知道规范化的形式(http://en.wikipedia.org/wiki/Database_normalization),我喜欢认为 MongoDB 会进入 1NF,然后再返回去规范化。
您不在乎数据是否重复?
哦,是的,我们有。如果数据重复错误,更新会很痛苦。
让我给你举个例子:这将是两个独立的实体category
,product
这是不可否认的。这两个实体被规范化(的重复数据已从 中product
分离出来category
)。另一种思考方式是:所有产品都只存在于一个类别中吗?
因此,在顶级实体上,如您所见,相同的规则相对适用,1NF 很容易应用于 MongoDB。
当然,在重复方面,您不希望将每个产品单独存储在每个类别中(我对上面的问题回答否),因此您自然希望将类别和产品分开。
您通常会在此处与中间规范化表建立多对多关系。这就是反规范化可以发挥作用的地方。您可以说一个类别将具有该类别独有的产品列表,因此您可以将多对多关系表反规范化为类别行作为列表(或反过来进入产品行)。这不会产生重复,因为该列表对于该类别是唯一的(很可能)。这当然意味着类别或产品将_id
包含相关行的列表而不是对象本身。
有时重复是必要的,主要是为了优化或解决没有 JOIN 的问题;如果您曾经做过足够大的站点,则此规则也适用于 SQL。
复制的典型使用场景是统计数据的聚合字段,例如 Facebook 帖子分享和评论,甚至该帖子的 5 条最新评论也可能会复制到帖子行。
因此,这不是忽略模式设计的情况,而是更多地针对 MongoDB 的特性对其进行调整。通常,如果您这样做,您会发现您自然而然地设计了一个好的模式。
作为附加参考,您可以在此处参考:http: //docs.mongodb.org/manual/core/data-modeling