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)