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:

{
"_id": ObjectId("123"),
"name": "Alice",
"email": "[email protected]"
}

隨著應用場景變更,我們想新增 phone 欄位

第一步:設計新版的 schema,並加上一個 field schemaVersion 標記目前 schema 的版本

{
"_id": ObjectId("123"),
"name": "Alice",
"email": "[email protected]",
"phone": "+123456789",
"schemaVersion": 2
}

第二步:在 application code 中加上新舊版兼容的邏輯並部署

在應用程式中,我們可以透過 schemaVersion 來套用對應的邏輯。例如:

function handleUser(user) {
if (!user.schemaVersion) {
...
}
else if (user.schemaVersion === 2) {
...
}
}

第三步:進行 schema 的轉換,將已存在的舊版 schema 改成新版,依照即時性有以下兩種做法

  1. 在 app code 將被提取的 document 改成新的 schema
  2. 建立 background task 去更新它

第四步:確認所有 schemas 都已經被更新完成,將 server 中兼容舊有的 schema 邏輯移除


影片說明 (en)