Check out what’s new from Firebase at Google I/O 2022. Learn more

將 Cloud Firestore 與 Firebase 實時數據庫結合使用

您可以在應用中同時使用 Firebase 實時數據庫和 Cloud Firestore,並利用每個數據庫解決方案的優勢來滿足您的需求。例如,您可能希望利用實時數據庫對狀態的支持,如在 Cloud Firestore 中構建狀態中所述。

了解有關數據庫之間差異的更多信息。

將數據移動到 Cloud Firestore

如果您決定要將部分數據從實時數據庫遷移到 Cloud Firestore,請考慮以下流程。因為每個數據庫都有獨特的需求和結構考慮,所以沒有自動遷移路徑。相反,您可以遵循以下一般進展:

  1. 將數據結構和安全規則從實時數據庫映射到 Cloud Firestore。實時數據庫和 Cloud Firestore 都依賴 Firebase 身份驗證,因此您無需更改應用的用戶身份驗證。但是,安全規則和數據模型不同,在開始將數據移動到 Cloud Firestore 之前仔細考慮這些差異非常重要。

  2. 移動歷史數據。在 Cloud Firestore 中設置新數據結構時,您可以將現有數據從實時數據庫映射並移動到新的 Cloud Firestore 實例。但是,如果您在應用程序中同時使用這兩個數據庫,則無需將歷史數據移出實時數據庫。

  3. 將新數據實時鏡像到 Firestore。在新的 Cloud Firestore 數據庫添加到實時數據庫時,使用 Cloud Functions 將新數據寫入其中。

  4. 將 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 ...]
}

文檔的最大大小為 1MB,這是將地標存儲為子集合的另一個原因,可以使每個城市文檔保持較小,而不是使用嵌套列表來膨脹文檔。

Cloud Firestore 的高級查詢功能減少了為常見訪問模式複制數據的需要。例如,考慮城市指南應用程序中的一個屏幕,顯示按人口排序的所有首府城市。在實時數據庫中,最有效的方法是維護一個單獨的首都城市列表,該列表複製cities列表中的數據,如下所示:

{
   cities: {
    // ...
   },

   capital-cities: {
     // ...
   }
}

在 Cloud Firestore 中,您可以將按人口順序排列的首府城市列表表示為單個查詢:

db.collection('cities')
    .where('capital', '==', true)
    .orderBy('population')

閱讀有關Cloud Firestore 數據模型的更多信息,並查看我們的解決方案,了解有關如何構建 Cloud Firestore 數據庫的更多想法。

保護您的數據

無論您是為 Android、Apple 或網絡客戶端使用Cloud Firestore 安全規則,還是為服務器使用身份訪問管理 (IAM) ,請確保您在 Cloud Firestore 和實時數據庫中保護您的數據。用戶身份驗證由兩個數據庫的身份驗證處理,因此您在開始使用 Cloud Firestore 時無需更改身份驗證的實現。

需要考慮的主要差異

  • 移動和網絡 SDK 使用 Cloud Firestore 安全規則,而服務器 SDK 使用身份訪問管理 (IAM) 來保護數據。
  • Cloud Firestore 安全規則不會級聯,除非您使用通配符。文檔和集合不會繼承規則。
  • 您不再需要單獨驗證數據(就像在實時數據庫中所做的那樣)。
  • Cloud Firestore 在執行查詢之前會檢查規則,以確保用戶對查詢返回的所有數據具有適當的訪問權限。

將歷史數據移至 Cloud Firestore

將數據和安全結構映射到 Cloud Firestore 的數據和安全模型後,您就可以開始添加數據了。如果您計劃在將應用從實時數據庫移至 Cloud Firestore 後查詢歷史數據,請將舊數據的導出添加到新的 Cloud Firestore 數據庫。如果您計劃在應用中同時使用實時數據庫和 Cloud Firestore,則可以跳過此步驟。

為避免用舊數據覆蓋新數據,您可能需要先添加歷史數據。如果您同時向兩個數據庫添加新數據(如下一步所述),請確保優先考慮由 Cloud Functions 添加到 Cloud Firestore 的新數據。

要將歷史數據遷移到 Cloud Firestore,請按以下步驟操作:

  1. 從實時數據庫導出數據或使用最近的備份
    1. 轉到 Firebase 控制台中的實時數據庫部分
    2. 從“數據”選項卡中,選擇數據庫的根級節點,然後從菜單中選擇“導出 JSON ”。
  2. 在 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 安全規則。

  1. 如果您使用 Cloud Functions 來維護數據庫之間的奇偶校驗,請確保您沒有在循環中跨兩個數據庫重複寫入操作。將您的函數切換為寫入單個數據庫,或完全刪除該函數並開始逐步淘汰仍與實時數據庫相關聯的應用程序中遷移數據的寫入功能。你如何為你的應用處理這個取決於你的特定需求和你的用戶。

  2. 驗證您的數據是否得到適當保護。驗證您的 Cloud Firestore 安全規則或 IAM 設置。