# JSON 文档模型设计特点

## MongoDB 文档模型设计的三个误区

1. 不需要模型设计
2. MongoDB应该用一个超级大文档来组织所有数据
3. MongoDB不支持关联或者事务

## 关于JSON文档模型设计

- 文档模型设计处于是物理模型设计阶段（`PDM`）

- JSON文档模型通过内嵌数组或引用字段来表示关系

- 文档模型设计不遵从第三范式，允许冗余

- 个人理解

  1. JSON文档模型将 一对多，多对多关系转为 引用字段 或 内嵌数组 的形式
  2. 而像mysql数据库设计第三范式，一般是不允许这种内嵌数组来表示多对多的关系的，多对多，一般需要抽成三张表，有一张中间表联系两个表
  3. 当然，话也不是那么绝对，现在mysql也支持了json字段，在某种程度下可以用json的内嵌数组来表示多对多关系

- 物理建模的分支图

  ![image-20200714180016576](../img/modeling/img_10.png)

## 为什么人们都说 MongoDB 是无模式

- 严格来说，MongoDB同样需要概念/逻辑建模

- 文档模型设计的物理层结构可以和逻辑层类似

- MongoDB无模式由来：可以省略物理建模的具体过程，简单来讲，就是MongoDB的物理建模是可以不用按照第三范式来抽出多个表的，所以很多时候，逻辑建模就基本完成了建模过程

- MongoDB建模图

  ![image-20200714180610177](../img/modeling/img_11.png)

## 逻辑模型-JSON模型

![image-20200714180857182](../img/modeling/img_12.png)

## 文档模型的设计原则：性能和易用

## 关系模型 vs 文档模型

|              | 关系数据库                           | JSON文档模型           |
| ------------ | ------------------------------------ | ---------------------- |
| 模型设计层次 | 概念模型<br />逻辑模型<br />物理模型 | 概念模型<br />逻辑模型 |
| 模型实体     | 表                                   | 集合                   |
| 模型属性     | 列                                   | 字段                   |
| 模型关系     | 关联关系（中间表），主外键           | 内嵌数组，引用字段     |

