搭配使用 Cloud Firestore 與 Firebase 即時資料庫

您可以在應用程式中同時使用 Firebase 即時資料庫和 Cloud Firestore。 並利用各項資料庫解決方案的優勢。舉例來說, 或運用即時資料庫的支援來掌握業務狀況 在 Cloud Firestore 中建構可用性

進一步瞭解 資料庫之間的差異

將資料移至 Cloud Firestore

如果您決定將部分資料從即時資料庫遷移至 請考慮使用 Cloud Firestore由於每個資料庫都有 因此不需要考量特定需求和結構性考量 自動化遷移路徑您可以改以下列一般進展操作:

  1. 將即時資料庫的資料結構和安全性規則對應至 以及 Cloud Firestore 即時資料庫和 Cloud Firestore 都依賴 Firebase 驗證。 因此您不需要變更應用程式的使用者驗證。不過, 安全性規則與資料模型不同,請務必審慎設定 因此在開始將資料遷移至雲端前,請先考量這些差異 以及 Firestore

  2. 移動歷來資料。 您在 Cloud Firestore 中設定新的資料結構時 對應即時資料庫中的現有資料,並移至新的 Cloud Firestore 執行個體。不過,如果您的應用程式同時使用這兩種資料庫 您不需要將歷來資料移出即時資料庫

  3. 即時將新資料鏡像到 Firestore。 使用 Cloud Functions 將新資料寫入新的 Cloud Firestore 新增的資料庫

  4. 將 Cloud Firestore 設為遷移資料的主要資料庫。 完成部分資料遷移後,請使用 Cloud Firestore 做為主要資料庫,減少遷移後的即時資料庫用量 資料。考量仍在使用的應用程式版本 這些資料的即時資料庫,以及您打算如何持續支援這些資料。

請務必考量帳單費用 適用於即時資料庫Cloud Firestore

對應資料

即時資料庫中的資料採用單一樹狀結構,而 Cloud Firestore 則是 支援更明確的資料階層,包括文件、集合和 子集合。如果將部分資料從即時資料庫移至 Cloud Firestore 以及 Cloud Storage

需要考量的主要差異

如果將現有即時資料庫樹狀結構中的資料移至 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 資料庫

確保資料安全

您是否使用 Cloud Firestore 安全性規則執行以下作業: Android、Apple 或 Web 用戶端,或 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 Functions 使用 Cloud Firestore

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

  1. 從即時資料庫匯出資料 使用最近的備份
    1. 前往 即時資料庫專區
    2. 在「資料」分頁中,選取資料庫的根層級節點,然後選取 從選單中「Export JSON」
  2. 在 Cloud Firestore 中建立新的資料庫,並 新增資料

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

    • 撰寫可攜碼轉移資料的自訂指令碼。雖然我們無法提供 這個指令碼的範本,因為每個資料庫都有其獨特的需求 Slack 頻道上的 Cloud Firestore 專家 或在 Stack Overflow 上 可以查看您的腳本,或是針對您的特殊情況提供建議。
    • 使用伺服器 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 設定