在MongoDB的数据有灵活的模式。不像SQL数据库,(SQL数据库)要求你必须在插入数据之前决定和声明一个表的模式。MongoDB的集合不强制文档的结构。这个灵活性有利于文档到实体或对象的映射。

每一个文档能够匹配所要表示实体的数据字段,即使数据的变化非常显著。但在实际操作中,一个集合的文档共享一个相似的结构。

数据模型的关键挑战在于平衡应用的须要,数据库引擎的性能和数据存取模式。当设计数据模型时,要考虑数据在应用里的使用情况(如。查询、更新和处理数据),以及数据本身的内在结构。

文档结构

在为MongoDB应用设计数据模型时的关键是环绕文档的结构和应用时怎样表示数据间的联系。有两个工具来同意应用来表示这些关系:引用和嵌入文档( references and embedded documents)。

  • 引用

引用通过包含连接或一个文档到还有一个文档间的引用存储着数据间的关系。应用可以解析这些引用来訪问到相关数据。

广义上说,这些都是归一化的数据模型(normalized data models).

上图的数据模型使用引用来联系文档。

contract文档和access文档都保护着user文档的引用。

以下介绍归一化数据模型在使用引用的优缺点:

归一化模型使用引用描写叙述文档间的关系。一般地。使用归一化模型的情况有。

  1. 当嵌入会导致数据反复且不会提供有效的读性能。
  2. 表示更复杂的多对多的关系
  3. 对大型分级数据建模

引用比嵌入式文档的灵活性更大。但client应用必须处理引用带来的查询问题。总之,归一化数据模型须要很多其它的往返server。

  • 嵌入数据

嵌入式文档通过在一个单一文档结构里存储相关数据来捕获数据间的关系。MongoDB的文档使在一个文档里的一个字段或字段数据嵌入一个文档作为子文档详细可能性。这些非规范化数据使得应用能够在一个单一数据库操作力获取和操纵数据。

上图的数据模型就是嵌入式字段保护全部的相关信息。

以下讨论嵌入子文档的数据模型的优缺点:

使用MongoDB,你能够在一个单一结构或文档嵌入相关数据。这个模型是著名的“非规范化”模型,利用了MongoDB丰富文档的优势。

嵌入数据模型同意应用在同样的数据库记录里存储相关片段信息。

因此。应用在完毕一个常规操作时,仅仅需处理非常少的查询或更新。

一般,当以下情形时可使用嵌入数据模型:

  1. 实体间有“包括关系”
  2. 实体间有一对多的关系。在这些关系里。“多“或子文档常常被看做"一"或父文档的上下文里

一般来说,嵌入提供了更好的读性能,以及在单一数据库操作里请求和获取相关数据的能力。嵌入数据模型使得在哪一个原子操作里更新相关数据成为可能。

然而,在一个文档的嵌入数据模型可能导致文档创建后的增长。

文档的增长会影响写性能并导致数据碎片问题。而且,在MongoDB里的文档大小必须小于最大的BSON文档大小。对大型二进制数据,考虑GridFS。

写操作的原子性

在MongoDB,写操作在文档这一级是原子的,而且没有单一的写操作能原子性的影响多个文档或集合。

一个有嵌入数据的非规范化数据模型在一个单一文档里包括了能表示一个实体的相关数据。

这有利于写操作的原子性,由于单一的写操作能直接对一个实体插入或更新数据。规范化数据会在多个集合里分散了数据,这会要求多次写操作。因此不是原子性的。

然而,有利于原子性写的模式会限制一个应用使用数据的方法或改动数据的方法。因此须要平衡原子性和平衡性。

文档增长

有的更新,比方向数组加入元素或加入新的字段,会增大文档的大小。

假设文档的大小超过了给该文档分配的空间,MongoDB会又一次定位这个文档。文档的增长会影响规范化和非规范化数据的选择。

数据使用和性能

当设计一个文档模型,要考虑应用将怎样使用你的数据库。比方。假设你的应用仅使用近期插入的数据,考虑使用 Capped Collections.或者,你的应用须要总是读操作。加入索引是常见的提升性能的办法。

MongoDB:数据模型介绍的更多相关文章

  1. MongoDB数据模型(一)

    原文地址 一.数据模型介绍 MongoDB中的数据有着灵活的架构.与SQL数据库不同,因为SQL数据库必须先定义表结构,然后才能向其中插入数据,而MongoDB的集合不强制任何文档结构.这个灵活性方便 ...

  2. 第二课 MongoDB 数据模型

    1.课程大纲 本课程主要介绍MongoDB数据模型相关知识.包含文档.集合与数据库的基本概念.用法及命名规则:MongoDB主要的数据类型介绍以及MongoDB Shell的简单介绍与使用. 文档 ( ...

  3. MongoDB数据模型和索引学习总结

    MongoDB数据模型和索引学习总结 1. MongoDB数据模型: MongoDB数据存储结构: MongoDB针对文档(大文件採用GridFS协议)採用BSON(binary json,採用二进制 ...

  4. MongoDB入门(介绍、安装、增删改查)

    文章作者公众号bigsai,已收录在回车课堂,如有帮助还请不吝啬点个赞赞支持一下! 课程导学 大家好我是bigsai,我们都学过数据库,但你可能更熟悉关系(型)数据库例如MySQL,SQL SERVE ...

  5. MongoDB应用介绍之前

    MongoDb企业应用实战(一) 写在MongoDB应用介绍之前   故事背景: 本人有幸,经老友( 现为x知名快递公司技术总监 ) 推荐进入中国前三大民营快递公司之一工作,在此非常感谢他,在此也非常 ...

  6. MongoDB shell 介绍

    MongoDB shell 介绍 MongoDB自带javascript shell, 可在shell中使用命令行与MongoDB实列交互.shell可以执行管理操作,检查运行实列等等操作. 一:如何 ...

  7. MongoDb企业应用实战(一) 写在MongoDb应用介绍之前(i)

    故事背景: 本人有幸,经老友( 现为x知名快递公司技术总监 ) 推荐进入中国前三大民营快递公司之一工作,在此非常感谢他,在此也非常感谢我在第一家公司帮助我进步的兄弟(我在时的项目经理,现为 x  知名 ...

  8. MongoDb企业应用实战(一) 写在MongoDB应用介绍之前(ii)

    上一篇: MongoDb企业应用实战(一) 写在MongoDB应用介绍之前(i) 有段时间没跟大家去分享和探讨过一些问题,分享过一些经验了(失败过的,痛苦过的才最有看点啊,不知道各位同仁们怎么去看这个 ...

  9. MongoDB的介绍安装与基本使用

    MongoDB的介绍安装 关于MongoDB的介绍于安装可参考:https://www.cnblogs.com/DragonFire/p/9135630.html 除了官网下载,可以下载他人下载好分享 ...

随机推荐

  1. checkStyle使用手册

    1. Annotations(注解:5个) Annotation Use Style(注解使用风格) 这项检查可以控制要使用的注解的样式. Missing Deprecated(缺少deprecad) ...

  2. 关于加号传递到后端会变为空格的c#例子

    参考博客:http://blog.csdn.net/nsdnresponsibility/article/details/50965262 以前在一次传递参数的情况中遇到,特此记录一下. 之前传递的参 ...

  3. luogu2051 [AHOI2009]中国象棋

    巨水,调了好久,心态爆炸 #include <iostream> #include <cstring> #include <cstdio> using namesp ...

  4. 对于一棵二叉树,请设计一个算法,创建含有某一深度上所有结点的链表。 给定二叉树的根结点指针TreeNode* root,以及链表上结点的深度,请返回一个链表ListNode,代表该深度上所有结点的值,请按树上从左往右的顺序链接,保证深度不超过树的高度,树上结点的值为非负整数且不超过100000。

    /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x ...

  5. 【转】SQL索引一步到位

    原文:http://www.cnblogs.com/AK2012/archive/2013/01/04/2844283.html SQL索引一步到位(此文章为“数据库性能优化二:数据库表优化”附属文章 ...

  6. [android开发篇]权限分类:正常权限和危险权限

    https://developer.android.com/guide/topics/security/permissions.html#normal-dangerous 系统权限 本文内容 安全架构 ...

  7. HDU-1829 A Bug's Life。并查集构造,与POJ1709异曲同工!

    A Bug's Life                                                     Find them, Catch them 都是并查集构造的题,不久前 ...

  8. 九度oj 题目1342:寻找最长合法括号序列II

    题目描述: 假如给你一个由’(‘和’)’组成的一个随机的括号序列,当然,这个括号序列肯定不能保证是左右括号匹配的,所以给你的任务便是去掉其中的一些括号,使得剩下的括号序列能够左右括号匹配且长度最长,即 ...

  9. 九度oj 题目1201:二叉排序树

    题目描述: 输入一系列整数,建立二叉排序数,并进行前序,中序,后序遍历. 输入: 输入第一行包括一个整数n(1<=n<=100).    接下来的一行包括n个整数. 输出: 可能有多组测试 ...

  10. Mysql 主外键与索引之间的区别和联系

    系数据库依赖于主键,它是数据库物理模式的基石.主键在物理层面上只有两个用途: 惟一地标识一行. 作为一个可以被外键有效引用的对象. 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部 ...