MongoDB初学者 - 规范化还是不规范化?

时间:2013-07-13 05:14:19

标签: mongodb non-relational-database database nosql

我将尝试尽可能地直截了当 来自MySQL并根据表格思考,让我们使用以下示例:

假设我们有一个房地产网站,我们正在显示房屋清单 通常,我会使用下表:

  • 房屋 - 手头的房地产资产
  • 业主 - 房屋所有者(与房屋的一对多关系)
  • 代理商 - 房地产经纪机构(与房屋的多对多关系)
  • 图像 - 与房屋的多对一关系
  • 评论 - 与房屋的多对一关系

据我所知,MongoDB让您可以灵活地在不同的集合中设计您的Web应用程序,其中包含与关系数据库(规范化)非常相似的唯一ID,并且为了享受快速选择,您可以在集合,相关对象和数据中嵌套(未归一化)。

回到我们的房地产公司列表,用于填充它的查询在普通关系数据库中非常昂贵,对于每个房子,您需要查询其图像,评论,所有者和放大器。代理商,每个实体都与其字段位于不同的表中,您可能会使用连接并将多个查询合并为一个 - 昂贵!

输入MongoDB - 您不需要连接,并且您可以将房屋的所有相关数据存储在房屋集合的房屋项目中,选择从未更快,这是一个db天堂! 但是当您需要添加/更新/删除相关评论/代理/所有者/图像时会发生什么?

这对我来说是一个谜,如果我需要猜测,每个相关的集合都存在于其自己的集合中,并且在house表中的数据之上,并且一旦这些相关数据中的一个被添加/更新/删除你必须在自己的集合以及房屋集合上更新它。在此更新时 - 我是否还需要查询其他集合以确保我使用所有更新的相关数据更新房屋记录?
我只是在这里猜测,非常感谢您的反馈。

谢谢,
微开

3 个答案:

答案 0 :(得分:3)

尝试这种方法:

确定哪个实体(或多个实体)是英雄

对于'hero',我指的是数据库所在的实体。让我们举个例子吧。房地产示例中的英雄是房子*。

制定所有权

浏览其他实体,例如所有者,代理商,图片和评论,并问问自己将信息与房屋放在一起是否合理。您是否会对关系数据库中的任何外键进行级联删除?如果是这样,则意味着所有权。

确定数据是否已经非标准化

您将拥有遍布多个房屋的代理商(可能还有所有者)的详细信息。那有关系吗?

您的房屋收藏可能如下所示:

house: {
owner,
agency,
images[], // recommend references to GridFS here
reviews[] // you probably won't get too many of these for a single house
}

*实际上,它可能是房子的广告(因为房屋通常在房地产网站上做广告,这可能是你真正感兴趣的)所以只考虑

答案 1 :(得分:2)

Sarah Mei撰写了一篇内容丰富的文章,介绍了nosql dbs中数据完整性可能出现的各种问题。选择重复数据或使用id,基于代码的连接以及保持数据完整性的挑战。她认为任何带有基于代码的连接的nosql db都会在某些时候丢失数据完整性。 Imho文章评论与文章本身在理解这些问题和可能的解决方案方面一样有价值。

链接:http://www.sarahmei.com/blog/2013/11/11/why-you-should-never-use-mongodb/comment-page-1/

答案 2 :(得分:1)

我只想从MongoDB的角度进行规范化复习 -

规范化的目标是什么?

  • 使数据库免于修改异常 - 对于MongoDB,看起来嵌入数据主要会导致此问题。实际上,我们应该尽量避免在MongoDB中的文档中嵌入数据,这可能会造成这些异常。有时,出于性能原因,我们可能需要复制文档中的数据。然而,这不是默认方法。默认是避免它。
  • 扩展时应尽量减少重新设计 - MongoDB足够灵活,因为它允许添加密钥而无需重新设计所有文档
  • 避免偏向任何特定的访问模式 - 这是我们在MongoDB中描述模式时不会担心的事情。 MongoDB背后的一个想法是将您的数据库调整为我们尝试编写的应用程序以及我们尝试解决的问题。