使用多個資料庫調度資源

如要在 Firebase 即時資料庫中最佳化效能並擴充資料,最好的方法是將資料分割至多個即時資料庫執行個體,也稱為資料庫資料分割。除了負載平衡和效能最佳化之外,資料分割還可讓您靈活地擴充,超出個別資料庫執行個體適用的限制

分割資料的時機

如果您使用即時資料庫,且符合以下任何情況,則可能需要跨多個資料庫分割資料:

  • 您想要擴充的規模超出單一資料庫執行個體 200,000 個同時連線的限制、每秒 1,000 次寫入作業,或者單一資料庫執行個體的任何其他限制
  • 您有多個獨立的資料集,且想要改善效能 (例如為獨立使用者群組提供服務的即時通訊應用程式)。
  • 您想平衡多個資料庫之間的負載,藉此改善運作時間,並降低單一資料庫執行個體超載的風險。

如何分割資料

如要分割資料,請按照下列步驟操作 (詳細說明如下):

  1. 根據應用程式的特定需求,將資料對應至多個資料庫。
  2. 建立多個資料庫執行個體。
  3. 設定應用程式,使其連線至每個資料集所需的即時資料庫執行個體。

對應資料

將資料對應至多個資料庫時,請嘗試符合下列條件:

  • 每項查詢都只會針對單一資料庫執行個體執行,即時資料庫不支援跨資料庫執行個體的查詢功能。
  • 資料庫執行個體之間不會共用或重複的資料,且資料共用或重複性最低。
  • 每個應用程式執行個體一次只能連線至一個資料庫。

對應資料時,建議您採用以下策略:

建立「主資料分割」

儲存資料在資料庫執行個體間儲存方式的對應圖。這樣一來,您就可以透過程式輔助,查詢哪個資料庫執行個體與連線用戶端對應。請注意,在您需要的時候,這種做法可能會比直接連線至您需要的特定資料庫執行個體更多的負擔。

依類別或客戶為資料進行值區

將資料儲存在孤立的資料庫執行個體,按照使用者或資料類型分組。舉例來說,如果您建構的即時通訊應用程式服務多個機構,可以為每個機構建立資料庫執行個體,並將所有即時通訊資料儲存在不重複的資料庫執行個體中。

在此情況下,機構 A 和機構 B 不會共用資料,且資料庫中沒有重複資料,而且您只對單一資料庫執行個體執行查詢。此外,每個機構中的使用者只有在使用即時通訊應用程式時,才能連線至所屬機構的資料庫。

然後,您可以預先建立多個資料庫執行個體,並使用機構的 ID 將團隊對應至其資料庫執行個體。例如,機構 A 對應至即時資料庫 A。

對應應用程式資料的方式取決於特定用途,但上文列出的條件與策略可協助您定義適合資料的方式。

建立多個即時資料庫執行個體

如果您採用 Blaze 定價方案,則同一個 Firebase 專案中最多可以建立 1,000 個資料庫執行個體。

透過「資料庫」專區中的內容選單,在 Firebase 控制台建立資料庫

  1. 在 Firebase 控制台中,前往「Develop」(開發) >「Database」(資料庫) 區段的「Data」(資料) 分頁。
  2. 從「即時資料庫」專區的選單中選取「建立新資料庫」
  3. 自訂資料庫參考資料「安全性規則」,然後按一下「Gotit」

視需要重複相同程序,建立任意數量的資料庫執行個體。每個資料庫執行個體都有一套專屬的 Firebase 即時資料庫安全性規則,因此您可以微調資料的存取權。

您可以在 Firebase 控制台或使用 Realtime Database Management REST API 建立及管理資料庫執行個體。

編輯及部署各個執行個體的即時資料庫安全性規則

請確認您的即時資料庫安全性規則允許專案內每個資料庫執行個體的適當存取權。每個資料庫都有專屬的一組規則,您可以透過 Firebase 控制台編輯和部署這些規則,或使用 Firebase CLI 部署目標

  • 如要透過 Firebase 控制台編輯及部署規則,請按照下列步驟操作:

    1. 前往「開發」>「資料庫」部分的「規則」分頁
    2. 選取要編輯的資料庫,然後修改規則。
  • 如要透過 Firebase CLI 編輯及部署規則,請按照下列步驟操作:

    1. 修改資料庫執行個體的規則檔案規則 (例如 foo.rules.json)。
    2. 建立部署目標並套用,以便連結使用相同規則檔案的資料庫。例如:
      firebase target:apply database main my-db-1 my-db-2
      firebase target:apply database other my-other-db-3
    3. 使用部署目標更新 firebase.json 設定檔:

      {
        "database": [
          {"target": "main", "rules": "foo.rules.json"},
          {"target": "other", "rules": "bar.rules.json"}
        ]
      }
      
    4. 執行部署指令:

      firebase deploy

請務必持續在同一處編輯及部署規則。從 Firebase CLI 部署規則會覆寫您在 Firebase 控制台所做的任何編輯,而直接在 Firebase 控制台編輯規則,會覆寫您透過 Firebase CLI 部署的任何近期變更。

將應用程式連線至多個資料庫執行個體

使用資料庫參考資料,存取儲存在次要資料庫執行個體中的資料。您可以網址或應用程式,取得特定資料庫執行個體的參照。如未指定網址,即可取得應用程式預設資料庫執行個體的參照。

網頁模組 API

import { initializeApp } from "firebase/app";
import { getDatabase } from "firebase/database";

const app1 = initializeApp({
  databaseURL: "https://testapp-1234-1.firebaseio.com"
});

const app2 = initializeApp({
  databaseURL: "https://testapp-1234-2.firebaseio.com"
}, 'app2');

// Get the default database instance for an app1
const database1 = getDatabase(app1);

// Get a database instance for app2
const database2 = getDatabase(app2);

網路命名空間 API

const app1 = firebase.initializeApp({
  databaseURL: "https://testapp-1234-1.firebaseio.com"
});

const app2 = firebase.initializeApp({
  databaseURL: "https://testapp-1234-2.firebaseio.com"
}, 'app2');

// Get the default database instance for an app1
var database1 = firebase.database();

// Get a database instance for app2
var database2 = firebase.database(app2);
Swift
注意:這項 Firebase 產品不適用於 App Clip 目標。
// Get the default database instance for an app
var ref: DatabaseReference!

ref = Database.database().reference()
// 透過網址變數參照:DatabaseReference 取得次要資料庫執行個體!ref = Database.database("https://testapp-1234.firebaseio.com")reference()
Objective-C
注意:這項 Firebase 產品不適用於 App Clip 目標。
// Get the default database instance for an app
@property (strong, nonatomic) FIRDatabaseReference *ref;

self.ref = [[FIRDatabase database] reference];
// 透過 URL @property (strong、非 atomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase databaseWithURL:@"https://testapp-1234.firebaseio.com"] reference];

Kotlin+KTX

// Get the default database instance for an app
val primary = Firebase.database.reference

// Get a secondary database instance by URL
val secondary = Firebase.database("https://testapp-1234.firebaseio.com").reference

Java

// Get the default database instance for an app
DatabaseReference primary = FirebaseDatabase.getInstance()
        .getReference();

// Get a secondary database instance by URL
DatabaseReference secondary = FirebaseDatabase.getInstance("https://testapp-1234.firebaseio.com")
        .getReference();

使用 Firebase CLI 時指定執行個體

使用 --instance 選項指定要套用 Firebase CLI 指令的 Firebase 即時資料庫。例如,使用以下指令為名為 my-example-shard.firebaseio.com 的資料庫執行個體執行分析器:

firebase database:profile --instance "my-example-shard"

每個資料庫的連線最佳化

如果每個用戶端都必須在工作階段期間連線至多個資料庫,您可以只在必要時連線至每個資料庫執行個體,藉此減少每個資料庫執行個體同時連線的數量。

取得更多建議

如需在多個資料庫執行個體之間分割資料的更多協助,請在我們的 Slack 頻道Stack Overflow 上與 Firebase 專家聯絡。