8

我会尽量做到直截了当。
来自 MySQL 并从表的角度思考,让我们使用以下示例:

假设我们有一个房地产网站,并且我们
正常显示房屋列表,我会使用下表:

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

我知道 MongoDB 让您可以灵活地在具有唯一 ID 的不同集合中设计 Web 应用程序,就像关系数据库(规范化)一样,并且为了享受快速选择,您可以嵌套在集合中,相关对象和数据(未规范化)。

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

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

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

谢谢,
Ajar

4

3 回答 3

3

试试这个方法:

找出哪个(或多个)实体是英雄

对于“英雄”,我指的是数据库所围绕的实体。让我们举个例子。房地产示例的主角是房子*。

制定所有权

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

确定数据去规范化是否真的很重要

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

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

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

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

于 2013-07-13T08:41:25.467 回答
2

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

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

于 2015-06-06T21:45:06.500 回答
2

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

标准化的目标是什么?

  • 将数据库从修改异常中解放出来- 对于MongoDB,看起来嵌入数据主要会导致这种情况。事实上,我们应该尽量避免将数据嵌入MongoDB可能产生这些异常的文档中。有时,出于性能原因,我们可能需要在文档中复制数据。但是,这不是默认方法。默认是避免它。
  • 扩展时应尽量减少重新设计-MongoDB足够灵活,因为它允许在不重新设计所有文档的情况下添加键
  • 避免偏向任何特定的访问模式——这是我们在描述MongoDB. 其背后的想法之一MongoDB是将您的数据库调整到我们正在尝试编写的应用程序和我们正在尝试解决的问题。
于 2016-08-29T05:52:54.973 回答