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

您可以在應用中同時使用 Firebase 實時數據庫和 Cloud Firestore,並利用每個數據庫解決方案的優勢來滿足您的需求。例如,你可能想利用實時數據庫的支持存在,簡列如構建存在於雲計算公司的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 用作主數據庫,並減少實時數據庫對遷移數據的使用。考慮仍與實時數據庫相關的應用程序版本,以及您計劃如何繼續支持它們。

確保你考慮結算成本兩個實時數據庫雲公司的FireStore

映射您的數據

實時數據庫中的數據結構為一棵樹,而 Cloud Firestore 通過文檔、集合和子集合支持更明確的數據層次結構。如果您將部分數據從實時數據庫移動到 Cloud Firestore,您可能需要為您的數據考慮不同的架構。

要考慮的主要差異

如果您將數據從現有的實時數據庫樹移動到 Cloud Firestore 文檔和集合,請記住可能會影響您在 Cloud Firestore 中構建數據的方式的數據庫之間的以下主要差異:

  • 淺查詢在分層數據結構中提供了更大的靈活性。
  • 複雜查詢提供更多粒度並減少對重複數據的需求。
  • 查詢游標提供更健壯的分頁。
  • 事務不再需要所有數據的公共根,並且效率更高。
  • 實時數據庫和 Cloud Firestore 的結算費用不同。在許多情況下,Cloud Firestore 可能比實時數據庫更昂貴,尤其是當您依賴許多小型操作時。考慮減少對數據庫的操作數並避免不必要的寫入。了解更多關於在不同的計費實時數據庫和雲之間的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')

了解更多關於雲計算公司的FireStore數據模型,並看看我們的解決方案對如何構建雲數據庫的FireStore更多的想法。

保護您的數據

無論您使用的雲計算公司的FireStore安全規則適用於Android,iOS或Web客戶端,或身份訪問管理(IAM)的服務器,請確保你是在保護雲計算公司的FireStore數據以及實時數據庫。用戶身份驗證由兩個數據庫的 Authentication 處理,因此您在開始使用 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. 轉至實時數據庫部分在火力地堡控制台。
    2. 數據選項卡,選擇您的數據庫的根級別的節點,然後從菜單中選擇導出JSON。
  2. 創建雲公司的FireStore新的數據庫,並添加數據

    將部分數據移至 Cloud Firestore 時,請考慮以下策略:

    • 編寫一個自定義腳本,為您移植數據。雖然我們不能提供這個腳本的模板,因為每個數據庫都會有獨特的需求,我們的雲計算公司的FireStore專家鬆弛通道堆棧溢出可以查看你的腳本或諮詢建議為你的具體情況。
    • 使用服務器 SDK(Node.js、Java、Python 或 Go)將數據直接寫入 Cloud Firestore。有關設置服務器的SDK說明,請參閱入門
    • 為了加快大數據遷移,使用批量寫入和發送多達500操作在一個單一的網絡請求。
    • 為了保持在雲公司的FireStore速率限制,限制操作500的寫入/秒為每個集合。

將新數據添加到 Cloud Firestore

要保持數據庫之間的奇偶校驗,請實時向兩個數據庫添加新數據。每當客戶端寫入實時數據庫時,使用 Cloud Functions 觸發寫入 Cloud Firestore。確保 Cloud Firestore 優先處理來自 Cloud Functions 的新數據,而不是您通過歷史數據遷移進行的任何寫入。

創建一個函數,以便在客戶端每次將數據寫入實時數據庫時將新數據或更改數據寫入 Cloud Firestore。了解更多關於實時數據庫觸發器雲功能。

將 Cloud Firestore 設為遷移數據的主數據庫

如果您決定使用 Cloud Firestore 作為某些數據的主要數據庫,請確保您考慮到您設置的任何數據鏡像功能並驗證您的 Cloud Firestore 安全規則。

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

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