# 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)