第一步 定义要描述的数据集

当我们决定将数据存储下来的时候,我们首先要回答的一个问题就是:“我打算存储什么样的数据?这些数据之间有什么关系?实体之间有什么关系?实体的属性之间有什么关系”。

为了说明问题,我们这儿举例的场景是要描述 库存清单的数据库,库存清单数据 包括 物料名称、数量、规格大小、状态、标签说明、等级。

如下list是我们希望关于库存清单的部分格式数据

name quantity size status tags rating
journal 25 14x21,cm A brown, lined 9
notebook 50 8.5x11,in A college-ruled,perforated 8
paper 100 8.5x11,in D watercolor 10
planner 75 22.85x30,cm D 2019 10
postcard 45 10x,cm D double-sided,white 2

(备注: cm 为长度单位,厘米;in 也是长度单位:1in=25.4mm==2.54cm)

第二步 JSON 化 思维

上面表中的size 和 tags 栏位 都存储了多个值,例如Size 既有大小 的数字描述还有它们单位的描述,tags 这种标签的说明更是难以统一,可能此物料只有一个属性说明,而其他物料可能有多个属性的说明。这种字段如果在关系型数据库中存储,假设存储在一个字段中,那么查询起来比较费时,模式化也比较困难。如果拆开放到不同的表中,完整性就不是很好,表的设计也是难以清晰,表Join查询也会有性能下降。

在MongoDB 数据中,数据都是以文档的形式存储的。这些文档都是以JSON(JavaScript Object Notation)格式设计存在的【物理盘上实际是以BSON格式存储的】。JSON文档支持内嵌字段。因此,我们可以将关联性强的数据或同一个List中的数据存储在同一个文档中,此时,不再需要存储在SQL数据库中多个表中【如果在SQL数据库,需要多个表,来描述关联】。

JSON 格式就是将数据存为 键/值对 。在JOSN文档中,键和值 之间用 冒号(:)隔开;一个个键/值之间用逗号(,)隔开,同一个文档中的一组键/值包含在一个花括号({})中。

例如,下面List中的 name 和 quantity 字段数据 JSON化,

name quantity size status tags rating
notebook 50 8.5x11,in A college-ruled,perforated 8

将这两个栏位JOSN化,就是下面这个形式:

{"name": "notebook", "qty": 50}

第三步 针对多值字段,选择合适的数据模型

针对多值的字段,我们可以从内嵌模型、数组 List 模型两种数据模型中选择一种。

例如上面 库存清单数据的那个例子,我们可以将Size,设计成内嵌模型,这个Size 可以有三个属性:高、宽、计量单位。

{ "h": 11, "w": 8.5, "uom": "in" }

一些商品原料,可能又多个等级得分,我们可以将这些等级得分存储在一个数组list中,例如上面例子中的ratings栏位。

[ { "score": 8 }, { "score": 9 } ]

上面例子中的tags 也可以存放在数组list中

[ "college-ruled", "perforated" ]

那么其中的关于notebook的记录数据 如下
notebook 50 8.5x11,in A college-ruled,perforated 8,9

而将其 JOSN 化后,要存的文档样式如下:

{
"name": "notebook",
"qty": 50,
"rating": [ { "score": 8 }, { "score": 9 } ],
"size": { "height": 11, "width": 8.5, "unit": "in" },
"status": "A",
"tags": [ "college-ruled", "perforated"]
}
以上过程就是数据记录的JSON过程、文档化过程。

注: 以上内容作者翻译自 MongoDB 官网,网址为 https://docs.mongodb.com/guides/server/introduction。
因作者非专业翻译人员,难免有错误或不准确的地方,请见谅。

如何在MongoDB设计存储你的数据(JSON化)?的更多相关文章

  1. MongoDB 存储引擎和数据模型设计

    标签: MongoDB NoSQL MongoDB 存储引擎和数据模型设计 1. 存储引擎 1.1 存储引擎是什么 1.2 MongoDB中的默认存储引擎 2. 数据模型设计 2.1 内嵌和引用 2. ...

  2. MongoDB如何存储数据

    想要深入了解MongoDB如何存储数据之前,有一个概念必须清楚,那就是Memeory-Mapped Files. Memeory-Mapped Files 下图展示了数据库是如何跟底层系统打交道的. ...

  3. 如何在open xml excel 中存储自定义xml数据?

    如何在open xml excel 中存储自定义xml数据? 而且不能放在隐藏的cell单元格内,也不能放在隐藏的sheet内,要类似web网站的Application变量,但还不能是VBA和宏之类的 ...

  4. NoSQL生态系统——类似Bigtable列存储,或者Dynamo的key存储(kv存储如BDB,结构化存储如redis,文档存储如mongoDB)

    摘自:http://www.ituring.com.cn/article/4002# NoSQL系统的数据操作接口应该是非SQL类型的.但在NoSQL社区,NoSQL被赋予了更具有包容性的含义,其意为 ...

  5. MongoDB设计系列

    原创文章,如果转载请标明出处.作者. https://www.cnblogs.com/alunchen/p/9762233.html 1 前言 MongoDB作为现今流行的非关系型文档数据库,已经有很 ...

  6. mongodb的存储引擎

    mongodb版本为3.4 mongodb存储引起的一些概述 存储引擎是MongoDB的核心组件,负责管理数据如何存储在硬盘和内存上.从MongoDB 3.2 版本开始,MongoDB 支持多数据存储 ...

  7. MongoDB索引存储BTree与LSM树(转载)

    1.为什么 MongoDB 使用B-树,而不是B+树 MongoDB 是一种 nosql,也存储在磁盘上,被设计用在数据模型简单,性能要求高的场合.性能要求高,我们看B-树与B+树的区别: B+树内节 ...

  8. 【转载】如何在FPGA设计环境中添加加时序约束

    转自:http://bbs.ednchina.com/BLOG_ARTICLE_198929.HTM 如何在FPGA设计环境中加时序约束    在给FPGA做逻辑综合和布局布线时,需要在工具中设定时序 ...

  9. 【转】iOS开发24:使用SQLite3存储和读取数据

    转自:http://my.oschina.net/plumsoft/blog/57626 SQLite3是嵌入在iOS中的关系型数据库,对于存储大规模的数据很有效.SQLite3使得不必将每个对象都加 ...

随机推荐

  1. [Swift]LeetCode347. 前K个高频元素 | Top K Frequent Elements

    Given a non-empty array of integers, return the k most frequent elements. Example 1: Input: nums = [ ...

  2. [Swift]LeetCode515. 在每个树行中找最大值 | Find Largest Value in Each Tree Row

    You need to find the largest value in each row of a binary tree. Example: Input: 1 / \ 3 2 / \ \ 5 3 ...

  3. Ubuntu 16.04下使用Eclipse:创建工程时卡死的解决方法

    问题如下: Ubuntu 16.04下使用Eclipse创建工程时出现卡顿和卡死,新建一个MapReduce项目卡了一下午,鼠标变成了圆圈进度条转了一下午,还关不掉. 当我直接去关闭新建项目的窗口时, ...

  4. linux 关机命令shutdown

    linux系统,正确的关机很重要,因为linux是多任.多用户系统,在后台可能同时有很多人在主机上面工作.不正确的挂机可能会导致数据中断. 1.关机前的操作(可以不进行) 可以使用who命令查看系统有 ...

  5. 了解 HTTPS,读这篇文章就够了

    今天接到个活儿,让我科普 HTTPS .讲 HTTP 我都“方”,想要通俗易懂的说完 HTTPS, 我有点“圆”.在讲什么是 HTTPS 之前,我们先来看个漫画.   △ 图片来源于阮一峰的网络日志 ...

  6. Xamarin.Android多窗口传值【1】

    这种非常常见的场景我觉得大家都遇到过,那么我么可以通过Activity进行编码传值. using System.Text; using System; using Android.App; using ...

  7. Jenkins时区设置为北京时间

    打开 [系统管理]->[脚本命令行]运行下面的命令 System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone', 'Asia/ ...

  8. asp.net core 系列 7 Razor框架路由(上)

    一.概述 在上二篇中,主要是介绍了asp.net core mvc中路由的使用,这篇继续介绍路由在ASP.NET Core Razor中的使用.Razor Pages应该使用默认的传统路由,从应用程序 ...

  9. Config非对称加解密

    对称加密和非对称加密区别1. 对称加密对称加密指的就是加密和解密使用同一个秘钥,所以叫做对称加密.对称加密只有一个秘钥,作为私钥. 常见的对称加密算法:DES,AES,3DES等等. 2. 非对称加密 ...

  10. Google SwipeRefreshLayout(Goolge官方下拉刷新控件)尝鲜

    前天Google官方终于出了Android刷新控件——SwipeRefreshLayout. 使用前先需要将android.support.v4.jar升级到19.1.升级后,可能会出现SDK版本与A ...