搭配使用 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 ...]
}

文件大小上限為 1 MB,這是將地標儲存為子集合的另一個原因,需要讓每份城市文件保持精簡,而不要使用巢狀清單來合併文件。

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 安全性規則,還是針對伺服器使用 Identity Access Management (IAM),都請務必保護 Cloud Firestore 和即時資料庫中的資料。這兩個資料庫的使用者驗證都會受到驗證處理,因此在您開始使用 Cloud Firestore 時,您不需要變更驗證的實作方式。

需要考量的主要差異

  • 行動和網頁 SDK 使用 Cloud Firestore 安全性規則,而伺服器 SDK 則使用 Identity Access Management (IAM) 來保護資料。
  • 除非您使用萬用字元,否則 Cloud Firestore 安全性規則不會串聯。文件與集合不會沿用規則。
  • 您不再需要另外驗證資料 (就像在即時資料庫中一樣)。
  • Cloud Firestore 會在執行查詢前先檢查規則,確認使用者俱備適當的存取權,可以存取查詢傳回的所有資料。

將歷來資料移至 Cloud Firestore

將資料與安全性結構對應至 Cloud Firestore 的資料與安全性模型後,即可開始新增資料。將應用程式從即時資料庫移至 Cloud Firestore 後,如果您預計查詢歷來資料,請將舊資料匯出到新的 Cloud Firestore 資料庫。如果您打算在應用程式中同時使用即時資料庫和 Cloud Firestore,可以略過這個步驟。

為了避免使用舊資料覆寫新資料,建議您先新增歷史資料。如果您要同時將新資料同時新增至兩個資料庫 (如下一個步驟所述),請務必優先處理透過 Cloud Functions 新增至 Cloud Firestore 的新資料。

如要將歷來資料遷移至 Cloud Firestore,請按照下列步驟操作:

  1. 從即時資料庫匯出資料,或使用最近的備份
    1. 前往 Firebase 控制台的「Realtime Database」(即時資料庫) 部分。
    2. 在「Data」分頁中,選取資料庫的根層級節點,然後從選單中選取「Export 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 來維持資料庫之間的一致性,請確保不會像迴圈中複製兩個資料庫之間的寫入作業。將函式切換至單一資料庫,或完全移除函式,並開始針對仍與 Realtime 資料庫連結的應用程式逐步停用寫入功能。處理應用程式的方式取決於您的特定需求和使用者。

  2. 確認您的資料受到妥善保護。請驗證您的 Cloud Firestore 安全性規則或 IAM 設定。