---
# System prepended metadata

title: Data Modeling
tags: [MongoDB]

---

# Data Modeling
###### tags: `MongoDB`

Data modeling是設計資料庫的重要過程，主要分三個步驟
1. 思考產品: 要生產的app是對應哪種情形使用的<br>例如購物商城app
2. 思考資料: 這個app的功能會用到那些資料，例如購物商城app會用到<br>i. 購物車相關資料<br>ii. 商品相關資料<br>iii. 買家相關資料<br> iv. 賣家相關資料<br> v. 下單相關的資料<br>etc.
3. 將資料結構化: 思考各項資料之間的關聯，將它們有邏輯地組成一個資料庫
![](https://i.imgur.com/gcZAXZa.png)


## 資料間的關聯
1. 一對一:<br> 一種資料只會有一個對應的值，例如一部電影會對上一個官方名字
2. 一對多:<br> 一對多之中又有不同數量的區隔，這關係到資料的規模<br>例如一部電影可以得到多個獎項<br>![](https://i.imgur.com/OujkHxz.png)<br>ii. 一部電影會有很多不同的評價<br>![](https://i.imgur.com/1lzFxzJ.png)<br>iii. 一個app在運作過程會產生許多log<br>![](https://i.imgur.com/LR6HN9Q.png)<br>這雖然看起來都是一對多，但他們的規模又有所不同，但這個規模對MongoDB來說很重要，工程師需要依照不同程度的規模來決定資料庫要使用正規化(normalized)或非正規化(denormalized)的模式來設計<br>

3. 多對多:<br>資料間多方向的關聯，例如:<br>一部電影會有很多演員在演，一個演員可以演很多部電影![](https://i.imgur.com/wyiEjhq.png)

## Normalized & Denormalized

### Normalized(又稱Referenced)
每一筆資料都有自己的來源(reference)，SQL資料庫就是用這種方式設計出來的<br>每個資料庫中的子資料都連接到各自的table![](https://i.imgur.com/RysirDO.png)
#### 優點
可以單獨拿出需要的資料
#### 缺點
單獨拿資料時需要較多query指令

### Denormalized(又稱Embeded)
每一筆資料都是自己一包，不用從其他地方做連接
![](https://i.imgur.com/wtt1xYd.png)
#### 優點
可以透過較少的query指令拿到資料
#### 缺點
無法單獨拿出子資料

### 如何選擇
可以透過三個分析結果來得到該使用哪種模式來設計資料庫
1. 考慮資料之間的關係<br>

| Enbedding | Referencing |
| ------- | ---------- |
| 一對多  | 一對多     |
|         |   多對多         |


2. 考慮資料被讀取及被寫入的頻率<br>

| Enbedding              | Referencing |
| -------------------- | ---------- |
| 讀取比較多           | 資料變更頻繁     |
| 讀取頻率大於寫入頻率             | 寫入頻率大於讀取頻率           |
| 不太需要快速改變資料 | 多對多     |
3. 資料貼合度<br>

| Enbedding            | Referencing |
| -------------------- | ---------- |
| 資料貼合度高(例如user就一定會需要email) | 需要頻繁使用獨立資料(例如一部電影會有不同的場景圖片，但有些地方我只需要圖片，並不需要電影的其他資訊)    |

### Referencing types
1. Child referencing<br>![](https://i.imgur.com/A6q09jP.png)

2. Parent referencing<br>![](https://i.imgur.com/otCKeuL.png)

3. Two-way referencing<br>![](https://i.imgur.com/DtXfmXW.png)

## Start modeling
![](https://i.imgur.com/JeHh3Bo.png)

