Catch up on highlights from Firebase at Google I/O 2023. 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 Functions 將新數據寫入新的 Cloud Firestore 數據庫。

  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 或 Web 客戶端使用Cloud Firestore 安全規則,還是對服務器使用身份訪問管理 (IAM) ,請確保保護 Cloud Firestore 和實時數據庫中的數據。用戶身份驗證由兩個數據庫的身份驗證處理,因此當您開始使用 Cloud Firestore 時,無需更改身份驗證的實現。

需要考慮的主要差異

  • 移動和 Web 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 設置。