MongoDB设计方法以及技巧示例详解

 更新时间:2020年12月8日 11:30  点击:1798

前言

MongoDB是一种流行的数据库,可以在不受任何表格schema模式的约束下工作。数据以类似JSON的格式存储,并且可以包含不同类型的数据结构。例如,在同一集合collection 中,我们可以拥有以下两个文档document:

{
  id: '4',
  name: 'Mark',
  age: '21',
  addresses : [
    { street: '123 Church St', city: 'Miami', cc: 'USA' },
    { street: '123 Mary Av', city: 'Los Angeles', cc: 'USA' }
  ]
}

{
  id: '15',
  name: 'Robin',
  department: 'New Business',
  example: 'robin@example.com'
}

为了能够充分利用MongoDB的优势,您必须了解并遵循一些基本的数据库设计原则。在讲解设计方法之前,我们必须首先了解MongoDB存储数据的结构。

一、 数据如何存储在MongoDB中

与传统的RDBMS关系型数据库不同,MongoDB并没有表Table,行row和列column的概念。它将数据存储在集合collections,文档documents和字段fields中。下图说明了与RDBMS类比的结构之间的关系:

二、数据库设计技巧和窍门

2.1.规范化存储与非规范化存储

因为MongoDB使用文档来存储数据,所以理解“规范化存储“”和“非规范化存储”的概念非常重要。

规范化存储:-规范化意味着将数据存储到多个集合collections中,并在它们之间设计关联关系。数据保存之后,更新数据比较容易。但是在读取数据的时候,规范化存储的缺点就显现出来。如果要从多个集合collections查找数据,则必须执行多个查询,从而使读取数据的速度变慢。 (比如:将网页标题、作者、内容分别存储到不同的collections中)

非规范化存储:-这种方式将若干对象数据,以嵌套的方式存储到单个文档中。它在读取数据的时候表现更好,但在写入时会变慢。这种存储数据的方式还将占用更多空间。 (比如:将网页标题、作者、内容分别存储到同一个collection中)

所以在两种存储数据方式之间进行选择之前,先评估一下你的应用数据库的使用方式。

如果您有一个不需要频繁更新的数据,更新的即时一致性不是很重要,但是在读取时需要良好的性能,那么非规范化可能是明智的选择。(比如:我们博客的博文,作者一旦保存之后,几乎就不在进行频繁的修改,但是面临着读者频繁的读取阅读操作)

如果数据库中的文档数据需要不断的更新,并且您希望在写入时具有良好的性能,那么您可能需要考虑规范化存储。(比如:需要频繁修改数据的业务类系统)

2.2. 一对多关系

与RDBMS相比,在MongoDB中对“一对多”关系建模需要进行更细粒度的设计。许多初学者陷入将文档数组嵌入父文档中的陷阱。正如我们在上文中介绍的,知道何时进行规范化存储或非规范化存储是非常重要的。因此设计者需要考虑关系的基数是“一个对少数几个”还是“一个对多个”?每种关系将具有不同的建模方法。

例如:下面“一个对少数几个”的建模示例。最好的建模方法是在父文档(persopn)中嵌入几个(address):

> db.person.findOne()
{
 name: 'Mark Kornfield',
 ssn: '1223-234-75554',
 addresses : [
   { street: '123 Church St', city: 'Miami', cc: 'USA' },
   { street: '123 Mary Av', city: 'Los Angeles', cc: 'USA' }
 ]
}

在“一个对多个”示例中,我们将考虑设计两个集合,即产品products集合和零件parts集合。每个零件都有一个“ ObjectID”,该“ ObjectID”将出现在产品集合的引用中。这样的设计可以让读写性能更高效。

> db.parts.findOne()
{
  _id : ObjectID('AAAA'),
  partno : '1224-dsdf-2215',
  name : 'bearing',
  price: 2.63

> db.products.findOne()
{
  name : 'car',
  manufacturer : 'Ford',
  catalog_number: 2234,
  parts : [   // array of references to Part documents
    ObjectID('AAAA'),  // reference to the bearing above
    ObjectID('F17C'),  // reference to a different Part
    ObjectID('D2AA'),
    // etc
]

2.3.设计模式可视化

尽管MongoDB是schemaless“无模式的”,但仍然存在将集合collections可视化为图表的方法。能够查看设计图,将对您理解和设计MongoDB的方式上产生重大影响。

DbSchema是可以很好地完成可视化设计工作的一个工具。如下图所示,它将通过读取集合和文档来推导架构。此外,您只需单击就可以修改图中的对象。在DbSchema中,您还可以为MongoDB创建外键,当然仅在本地创建,只用于设计目的。

2.4.智能索引

为了保持数据库的良好性能,有必要建立智能索引,这将简化写入和读取操作。知道MongoDB的索引优势和局限性非常重要,MongoDB保留用于排序操作的内存限制为32MB。如果你不使用索引,则排序时数据库将被迫将所有排序文档hold在内存里面,如果达到32M的限制,则数据库将返回错误或空集。

结论

对MongoDB的透彻理解与对数据库想要实现的目标的清晰了解是良好数据库设计的秘诀。

总结

到此这篇关于MongoDB设计方法以及技巧的文章就介绍到这了,更多相关MongoDB设计方法及技巧内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!

[!--infotagslink--]

相关文章

  • PHP添加MongoDB扩展实例教程

    由于要使用mikoomi mongodb plugin插件,所以需要php对mongodb的扩展支持,默认通过源安装的php并没有mongodb的扩展支持,具体可以通过php -m|grep mongo 验证 。这里就结...2016-11-25
  • photoshop设计一幅大鱼海棠动画片海报制作实例教程

    今天小编在这里就来给各位photoshop的这一款软件的使用者们来说一说设计一幅大鱼海棠动画片海报制作的实例教程,各位想知道具体制作步骤的使用者们,那么各位就快来看看...2016-09-14
  • photoshop打开很慢怎么办 ps打开慢的设置技巧

    photoshop软件是一款专业的图像设计软件了,但对电脑的要求也是越高越好的,如果配置一般打开ps会比较慢了,那么photoshop打开很慢怎么办呢,下面来看问题解决办法。 1、...2016-09-14
  • Jquery Ajax Error 调试错误的技巧

    JQuery使我们在开发Ajax应用程序的时候提高了效率,减少了许多兼容性问题,我们在Ajax项目中,遇到ajax异步获取数据出错怎么办,我们可以通过捕捉error事件来获取出错的信息。在没给大家介绍正文之前先给分享Jquery中AJAX参...2015-11-24
  • ps怎么制作倒影 ps设计倒影的方法

    ps软件是一款非常不错的图片处理软件,有着非常不错的使用效果。这次文章要给大家介绍的是ps怎么制作倒影,一起来看看设计倒影的方法。 用ps怎么做倒影最终效果&#819...2017-07-06
  • C语言程序设计第五版谭浩强课后答案(第二章答案)

    这篇文章主要介绍了C语言程序设计第五版谭浩强课后答案(第二章答案),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2021-04-02
  • php语言中使用json的技巧及json的实现代码详解

    目前,JSON已经成为最流行的数据交换格式之一,各大网站的API几乎都支持它。我写过一篇《数据类型和JSON格式》,探讨它的设计思想。今天,我想总结一下PHP语言对它的支持,这是开发互联网应用程序(特别是编写API)必须了解的知识...2015-10-30
  • Photoshop设计商务名片的5种常见思路分享

    今天小编在这里就来给Photoshop的这一款软件的使用者们来说下计商务名片的5种常见思路,各位想知道的使用者,那么下面就快来跟着小编一起看一看吧。 给各位Photosho...2016-09-14
  • 基于PHP给大家讲解防刷票的一些技巧

    刷票行为,一直以来都是个难题,无法从根本上防止。但是我们可以尽量减少刷票的伤害,比如:通过人为增加的逻辑限制。基于 PHP,下面介绍防刷票的一些技巧:1、使用CURL进行信息伪造$ch = curl_init(); curl_setopt($ch, CURLOP...2015-11-24
  • 图解Sublime Text3使用技巧

    通过本篇文章给大家介绍Sublime Text3使用技巧的相关知识,对sublime text3技巧相关知识感兴趣的朋友一起学习吧...2015-12-24
  • WPF实现类似360安全卫士界面的程序源码分享

    最近在网上看到了新版的360安全卫士,感觉界面还不错,于是用WPF制作了一个,时间有限,一些具体的控件没有制作,用图片代替了。感兴趣的朋友一起跟着小编学习WPF实现类似360安全卫士界面的程序源码分享...2020-06-25
  • 安装使用Mongoose配合Node.js操作MongoDB的基础教程

    这篇文章主要介绍了安装使用Mongoose来让Node.js操作MongoDB的基础教程,前端js+后端node+js操作MongoDB正是所谓最流行的一种JavaScript全栈开发方案,需要的朋友可以参考下...2016-03-03
  • photoshop安卓和苹果界面设计之尺寸规范详解

    今天小编在这里就来给各位photoshop的这一款软件的使用者们来说下安卓和苹果的界面设计之尺寸规范,各位想知道的使用者们,那么下面就快来跟着小编一起看看吧。 给...2016-09-14
  • Python爬虫必备技巧详细总结

    本篇文章介绍了我在爬虫过程中总结的几个必备技巧,都是经过实验的,通读本篇对大家的学习或工作具有一定的价值,需要的朋友可以参考下...2021-10-22
  • photoshop设计重影效果具体制作教程

    今天小编在这里就来给各位photoshop的这一款软件的使用者们来说一说设计重影效果具体的制作教程,各位想知道具体制作方法的软件使用者们,那么大家就来看下小编带来的教...2016-09-14
  • 分享12个非常实用的JavaScript小技巧

    这篇文章主要介绍了分享12个非常实用的JavaScript小技巧,这些小技巧可能在你的实际工作中或许能帮助你解决一些问题,需要的朋友可以参考下...2016-05-14
  • Illustrator结合photoshop设计可爱的卡通女厨师头像制作教程

    今天小编在这里就来给Illustrator的这一款软件的使用者们来说一说结合photoshop设计可爱的卡通女厨师头像的制作教程,各位想知道具体制作步骤的使用者们,那么下面就快来...2016-09-14
  • PS怎么设计T恤 PS制作T恤教程

    PS怎么设计T恤?很多人都想要在T恤上有自己喜欢的图案,那么自己设计T恤的图案是方法之一,本次为大家带来了详细的ps设计T恤教程,有兴趣的同学快来看看吧。 1、打开PS,新...2016-12-31
  • mongodb与mysql命令详细对比

    传统的关系数据库一般由数据库(database)、表(table)、记录(record)三个层次概念组成,MongoDB是由数据库(database)、集合(collection)、文档对象(document)三个层次组成。MongoDB对于关系型数据库里的表,但是集合中没有列、行和关...2013-09-11
  • 修复 Mac brew 安装 mongodb 报 Error: No available formula with the name ‘mongodb’ 问题详解

    最近在同事新的 Mac 电脑上安装 mongodb,报了错误 Error: No available formula with the name ‘mongodb’,今天就说说这个问题如何解决,需要的朋友可以参考下...2020-07-11