您可以在應用程式中同時使用 Firebase 即時資料庫和 Cloud Firestore,並利用各種資料庫解決方案的優勢來滿足您的需求。例如,您可以按照在 Cloud Firestore 中建構內容,運用即時資料庫的支援來提供支援。
進一步瞭解資料庫之間的差異。
將資料移至 Cloud Firestore
如果您決定將部分資料從即時資料庫遷移至 Cloud Firestore,請考慮以下流程。每個資料庫的需求和結構不同,因此沒有自動化的遷移路徑。您可以改以下列一般進展操作:
將即時資料庫的資料結構和安全性規則對應至 Cloud Firestore。即時資料庫和 Cloud Firestore 都依賴 Firebase 驗證,因此您不需要變更應用程式的使用者驗證機制。不過,安全性規則和資料模型有所不同,在開始將資料移至 Cloud Firestore 前,請務必謹慎考慮這些差異。
移動歷來資料。 在 Cloud Firestore 中設定新的資料結構時,您可以從即時資料庫對應及移動現有資料到新的 Cloud Firestore 執行個體。不過,如果您的應用程式同時使用兩種資料庫,則不需要將歷來資料移出即時資料庫。
即時將新資料鏡像到 Firestore。 在將新資料新增至即時資料庫時,使用 Cloud Functions 將新資料寫入新的 Cloud Firestore 資料庫。
將 Cloud Firestore 設為遷移資料的主要資料庫。 遷移部分資料後,使用 Cloud Firestore 做為主要資料庫,並減少遷移資料的即時資料庫使用次數。請考量仍與即時資料庫繫結的應用程式版本,以及計畫如何繼續支援這些版本。
請務必計入即時資料庫和 Cloud Firestore 的帳單費用。
對應資料
即時資料庫中的資料採用單一樹狀結構,而 Cloud Firestore 則能透過文件、集合和子集合支援更明確的資料階層。如果您將部分資料從即時資料庫移至 Cloud Firestore,建議您考慮採用其他架構來儲存資料。
需要考量的主要差異
如果您將資料從現有的即時資料庫樹狀結構移至 Cloud Firestore 文件和集合,請注意下列資料庫之間的主要差異可能會影響您在 Cloud Firestore 中建構資料的方式:
- 淺層查詢可在階層式資料結構中更有彈性。
- 複雜的查詢可提供更精確的精細程度,並減少重覆資料的需求。
- 查詢遊標提供更強大的分頁功能。
- 交易不再需要資料的共同根位置,因此效率更高。
- 即時資料庫和 Cloud Firestore 的帳單費用不同。在許多情況下,Cloud Firestore 的費用可能高於即時資料庫,尤其是若您仰賴許多小型作業時更是如此。請考慮減少資料庫的作業數量,並避免不必要的寫入作業。進一步瞭解即時資料庫和 Cloud Firestore 的計費方式差異。
最佳做法應用實例
以下範例反映了在資料庫之間轉移資料時,您可能需要考慮的幾個事項。相較於即時資料庫使用的模式,您可以採用淺層讀取和改善查詢功能,處理更多自然的資料結構。
假設有一個城市導遊應用程式,可協助使用者在全球各個城市找到值得注意的地標。由於即時資料庫缺少淺層讀取,您可能需要在兩個頂層節點中建構資料,如下所示:
// /cities/$CITY_KEY
{
name: "New York",
population: 8000000,
capital: False
}
// /city-landmark/$CITY_KEY/$LANDMARK_KEY
{
name: "Empire State Building",
category: "Architecture"
}
Cloud Firestore 具有淺層讀取功能,因此查詢集合中的文件無法提取子集合的資料。因此,您可以將地標資訊儲存在子集合中:
// /cities/$CITY_ID
{
name: "New York",
population: 8000000,
capital: False,
landmarks: [... subcollection ...]
}
文件大小上限為 1 MB,這是將地標儲存為子集合的另一個原因,需要讓每份城市文件保持精簡,而不要使用巢狀清單來合併文件。
Cloud Firestore 的進階查詢功能,可減少重複存取常見存取模式資料的需求。舉例來說,假設城市指南應用程式中的畫面顯示依人口排序的所有首都城市。在即時資料庫中,最有效率的做法是分別維護一份與 cities
清單中重複資料的大寫城市清單,如下所示:
{
cities: {
// ...
},
capital-cities: {
// ...
}
}
在 Cloud Firestore 中,您可以按照單一查詢的人口順序,提供首都城市清單:
db.collection('cities')
.where('capital', '==', true)
.orderBy('population')
進一步瞭解 Cloud Firestore 資料模型,並參閱我們的解決方案,進一步瞭解如何建構 Cloud Firestore 資料庫。
確保資料安全
無論您使用適用於 Android、Apple 或 Web 用戶端的 Cloud Firestore 安全性規則,還是針對伺服器使用 Identity Access Management (IAM),都請務必保護 Cloud Firestore 和即時資料庫中的資料。這兩個資料庫的使用者驗證都會受到驗證處理,因此在您開始使用 Cloud Firestore 時,您不需要變更驗證的實作方式。
需要考量的主要差異
- 行動和網頁 SDK 使用 Cloud Firestore 安全性規則,而伺服器 SDK 則使用 Identity Access Management (IAM) 來保護資料。
- 除非您使用萬用字元,否則 Cloud Firestore 安全性規則不會串聯。文件與集合不會沿用規則。
- 您不再需要另外驗證資料 (就像在即時資料庫中一樣)。
- Cloud Firestore 會在執行查詢前先檢查規則,確認使用者俱備適當的存取權,可以存取查詢傳回的所有資料。
將歷來資料移至 Cloud Firestore
將資料與安全性結構對應至 Cloud Firestore 的資料與安全性模型後,即可開始新增資料。將應用程式從即時資料庫移至 Cloud Firestore 後,如果您預計查詢歷來資料,請將舊資料匯出到新的 Cloud Firestore 資料庫。如果您打算在應用程式中同時使用即時資料庫和 Cloud Firestore,可以略過這個步驟。
為了避免使用舊資料覆寫新資料,建議您先新增歷史資料。如果您要同時將新資料同時新增至兩個資料庫 (如下一個步驟所述),請務必優先處理透過 Cloud Functions 新增至 Cloud Firestore 的新資料。
如要將歷來資料遷移至 Cloud Firestore,請按照下列步驟操作:
- 從即時資料庫匯出資料,或使用最近的備份。
- 前往 Firebase 控制台的「Realtime Database」(即時資料庫) 部分。
- 在「Data」分頁中,選取資料庫的根層級節點,然後從選單中選取「Export JSON」。
在 Cloud Firestore 中建立新的資料庫,並新增資料。
將部分資料移至 Cloud Firestore 時,請考慮以下策略:
- 撰寫可攜碼轉移資料的自訂指令碼。我們無法提供這個指令碼的範本,因為每個資料庫的需求都不一樣,因此 Slack 頻道或 Stack Overflow 上的 Cloud Firestore 專家可以查看您的指令碼或針對您的具體情況提供建議。
- 使用伺服器 SDK (Node.js、Java、Python 或 Go) 將資料直接寫入 Cloud Firestore。如需設定伺服器 SDK 的操作說明,請參閱「開始使用」一文。
- 如要加快大型資料遷移作業,請使用批次寫入功能,並在單一網路要求中傳送最多 500 項作業。
- 為避免超過 Cloud Firestore 頻率限制,請將每個集合的作業寫入每秒 500 次。
將新資料新增至 Cloud Firestore
為了保持資料庫之間的一致性,請即時將新資料新增至兩個資料庫。每當用戶端寫入即時資料庫時,使用 Cloud Functions 觸發寫入 Cloud Firestore 的作業。請確保 Cloud Firestore 優先於來自 Cloud Functions 的新資料,而非您從歷來資料遷移作業進行的任何寫入作業。
建立函式,在每次用戶端將資料寫入即時資料庫時,將新的或變動資料寫入 Cloud Firestore。進一步瞭解 Cloud Functions 的即時資料庫觸發條件。
將 Cloud Firestore 設為遷移資料的主要資料庫
如果您決定使用 Cloud Firestore 做為部分資料的主要資料庫,請務必考量您已設定及驗證 Cloud Firestore 安全性規則的所有資料鏡像函式。
如果您使用 Cloud Functions 來維持資料庫之間的一致性,請確保不會像迴圈中複製兩個資料庫之間的寫入作業。將函式切換至單一資料庫,或完全移除函式,並開始針對仍與 Realtime 資料庫連結的應用程式逐步停用寫入功能。處理應用程式的方式取決於您的特定需求和使用者。
確認您的資料受到妥善保護。請驗證您的 Cloud Firestore 安全性規則或 IAM 設定。