MongoDB Schema Design Pattern - Schema Versioning Pattern
用一句簡單的話說
設計再好的 schema 也可能有發生改變的時候,而 schema versioning pattern 能在沒有 downtime 的情況下改變 schema
場景
  Schema Versioning Pattern 相較於其他的 design pattern 來說較簡單,做法是在文件內部維護一個版本欄位,例如 schemaVersion,來標識這筆數據使用的是哪個版本的結構。這樣,應用程式在讀取數據時可以根據版本號進行對應的處理。
不像關聯式資料庫需要遵守固定的 schema,MongoDB 的多態性 (Polymorphism) 讓不同的 schema 可以共存在一個 collection,讓更新 schema 變得更有彈性。
實際處理流程如下
假設我們有一個以下結構的 users collection:
| { | 
隨著應用場景變更,我們想新增 phone 欄位
第一步:設計新版的 schema,並加上一個 field schemaVersion 標記目前 schema 的版本
| { | 
第二步:在 application code 中加上新舊版兼容的邏輯並部署
在應用程式中,我們可以透過 schemaVersion 來套用對應的邏輯。例如:
| function handleUser(user) { | 
第三步:進行 schema 的轉換,將已存在的舊版 schema 改成新版,依照即時性有以下兩種做法
- 在 app code 將被提取的 document 改成新的 schema
- 建立 background task 去更新它
第四步:確認所有 schemas 都已經被更新完成,將 server 中兼容舊有的 schema 邏輯移除
影片說明 (en)