获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

將 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 時更改身份驗證的實現。

需要考慮的主要差異

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