將 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 設定。