Google 致力于为黑人社区推动种族平等。查看具体举措
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

將Cloud Firestore與Firebase實時數據庫一起使用

您可以在應用程序中同時使用Firebase Realtime數據庫和Cloud Firestore,並利用每種數據庫解決方案的優勢來滿足您的需求。例如,您可能想利用Realtime Database對狀態的支持,如Cloud Firestore中的Build Presence中所述。

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

將數據移至Cloud Firestore

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

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

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

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

  4. 使Cloud Firestore成為用於遷移數據的主數據庫。遷移了某些數據後,將Cloud Firestore用作主數據庫,並減少實時數據庫對已遷移數據的使用。考慮仍與該數據綁定到Realtime Database的應用程序版本,以及您打算如何繼續支持它們。

確保您同時考慮了實時數據庫Cloud Firestore的計費費用

映射您的數據

實時數據庫中的數據被構造為一棵樹,而Cloud Firestore通過文檔,集合和子集合支持更明確的數據層次結構。如果您將某些數據從Realtime Database移至Cloud Firestore,則可能需要考慮使用其他架構的數據。

需要考慮的主要差異

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

  • 淺查詢在分層數據結構中提供了更大的靈活性。
  • 複雜的查詢提供了更高的粒度,並減少了重複數據的需求。
  • 查詢游標提供更可靠的分頁。
  • 事務不再需要所有數據的公共根,並且效率更高。
  • 實時數據庫和Cloud Firestore之間的計費費用有所不同。在許多情況下,Cloud Firestore可能比實時數據庫貴,尤其是在您依賴許多小型操作的情況下。考慮減少對數據庫的操作數量,並避免不必要的寫入。詳細了解Realtime Database和Cloud Firestore之間的計費差異。

最佳實踐

以下示例反映了在數據庫之間轉移數據時可能要考慮的一些事項。您可以利用淺讀和改進的查詢功能來獲得比Realtime Database可能使用的更自然的數據結構。

考慮一個城市指南應用程序,它可以幫助用戶在世界各地的城市中找到著名的地標。由於實時數據庫缺少淺層讀取,因此您可能不得不在兩個頂級節點中構造數據,如下所示:

// /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列表中的數據重複,如下所示:

{
   cities: {
    // ...
   },

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

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

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

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

保護您的數據

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

需要考慮的主要差異

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

將歷史數據移至Cloud Firestore

將數據和安全性結構映射到Cloud Firestore的數據和安全性模型後,即可開始添加數據。如果您打算在將應用程序從實時數據庫移動到Cloud Firestore之後查詢歷史數據,則將舊數據的導出添加到新的Cloud Firestore數據庫。如果您打算在應用程序中同時使用Realtime Database和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 Firestore成為遷移數據的主數據庫

如果您決定將Cloud Firestore用作某些數據的主數據庫,請確保說明已設置的任何數據鏡像功能並驗證Cloud Firestore安全規則。

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

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