如何在MongoDB设计存储你的数据(JSON化)?
第一步 定义要描述的数据集
当我们决定将数据存储下来的时候,我们首先要回答的一个问题就是:“我打算存储什么样的数据?这些数据之间有什么关系?实体之间有什么关系?实体的属性之间有什么关系”。
为了说明问题,我们这儿举例的场景是要描述 库存清单的数据库,库存清单数据 包括 物料名称、数量、规格大小、状态、标签说明、等级。
如下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化)?的更多相关文章
- MongoDB 存储引擎和数据模型设计
		标签: MongoDB NoSQL MongoDB 存储引擎和数据模型设计 1. 存储引擎 1.1 存储引擎是什么 1.2 MongoDB中的默认存储引擎 2. 数据模型设计 2.1 内嵌和引用 2. ... 
- MongoDB如何存储数据
		想要深入了解MongoDB如何存储数据之前,有一个概念必须清楚,那就是Memeory-Mapped Files. Memeory-Mapped Files 下图展示了数据库是如何跟底层系统打交道的. ... 
- 如何在open xml excel 中存储自定义xml数据?
		如何在open xml excel 中存储自定义xml数据? 而且不能放在隐藏的cell单元格内,也不能放在隐藏的sheet内,要类似web网站的Application变量,但还不能是VBA和宏之类的 ... 
- NoSQL生态系统——类似Bigtable列存储,或者Dynamo的key存储(kv存储如BDB,结构化存储如redis,文档存储如mongoDB)
		摘自:http://www.ituring.com.cn/article/4002# NoSQL系统的数据操作接口应该是非SQL类型的.但在NoSQL社区,NoSQL被赋予了更具有包容性的含义,其意为 ... 
- MongoDB设计系列
		原创文章,如果转载请标明出处.作者. https://www.cnblogs.com/alunchen/p/9762233.html 1 前言 MongoDB作为现今流行的非关系型文档数据库,已经有很 ... 
- mongodb的存储引擎
		mongodb版本为3.4 mongodb存储引起的一些概述 存储引擎是MongoDB的核心组件,负责管理数据如何存储在硬盘和内存上.从MongoDB 3.2 版本开始,MongoDB 支持多数据存储 ... 
- MongoDB索引存储BTree与LSM树(转载)
		1.为什么 MongoDB 使用B-树,而不是B+树 MongoDB 是一种 nosql,也存储在磁盘上,被设计用在数据模型简单,性能要求高的场合.性能要求高,我们看B-树与B+树的区别: B+树内节 ... 
- 【转载】如何在FPGA设计环境中添加加时序约束
		转自:http://bbs.ednchina.com/BLOG_ARTICLE_198929.HTM 如何在FPGA设计环境中加时序约束 在给FPGA做逻辑综合和布局布线时,需要在工具中设定时序 ... 
- 【转】iOS开发24:使用SQLite3存储和读取数据
		转自:http://my.oschina.net/plumsoft/blog/57626 SQLite3是嵌入在iOS中的关系型数据库,对于存储大规模的数据很有效.SQLite3使得不必将每个对象都加 ... 
随机推荐
- [Swift]LeetCode1026. 节点与其祖先之间的最大差值 | Maximum Difference Between Node and Ancestor
			Given the root of a binary tree, find the maximum value V for which there exists different nodes A a ... 
- redis缓存使用
			什么是缓存(cache): 在项目中没有必要每次请求都查询数据库的情况就可以使用缓存,让每次请求先查询缓存,如果命中,就直接返回缓存结果,如果没有命中,就查询数据库, 并将查询结果放入缓存,下次请求时 ... 
- Kubernetes 笔记 05 yaml 配置文件详解
			本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. Hi,大家好, ... 
- 死磕 java集合之CopyOnWriteArrayList源码分析
			欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. 简介 CopyOnWriteArrayList是ArrayList的线程安全版本,内部也是通过 ... 
- C#版 - PAT乙级(Basic Level)真题 之 1024.科学计数法转化为普通数字 - 题解
			版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. PAT Bas ... 
- Springboot 拦截器的背后
			今天写了个拦截器对一些mapping做了些处理,写完之后突然很想看看拦截器是怎么加进spring里面.对着源码debug了一遍.又有了新的收获. 1.拦截器的实现 1.实现HandlerInterce ... 
- javascript入门篇(二)
			对 象 对象:一组元素的集合 声明方式:字面量方式 var O = { } 构造函数方式:var obj = new object(); 为对象添加新属性,如:o.name = 'jerry' ... 
- 如何定制Linux外围文件系统?
			本文由云+社区发表 作者:我是乖宝宝哦 一般来说,我们所说的Linux系统指的是各种基于Linux Kernel和GNU Project的操作系统发行版.为了掌握Linux操作系统的使用,了解 Lin ... 
- Docker系列03—Docker 基础入门
			本文收录在容器技术学习系列文章总目录 1.概念介绍 1.1 容器 1.1.1 介绍 容纳其它物品的工具,可以部分或完全封闭,被用于容纳.储存.运输物品.物体可以被放置在容器中,而容器则可以保护内容物. ... 
- 痞子衡嵌入式:一表全搜罗常见低功耗广域物联网协议(NB-IoT/eMTC/LoRa/SigFox...)
			大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是低功耗广域物联网协议. 上一篇痞子衡给大家搜罗了短距离无线通信协议,它是物联网的基础,但它的应用距离比较短,对于长距离的物联网应用鞭长莫 ... 
