使用多個資料庫調度資源

讓 Firebase 即時資料庫發揮最佳效能並擴充資料的最佳方式 在於將資料拆分為多個即時資料庫執行個體 以及資料庫資料分割資料分割提供彈性地擴充 適用於個別資料庫的限制 以及負載平衡和效能最佳化

分割資料的時機

如果您使用了 即時資料庫,可因應以下任何情況:

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

如何分割資料

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

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

對應資料

將資料對應至多個資料庫時,請盡可能滿足 下列情況:

  • 每項查詢都只會針對單一資料庫執行個體執行。 即時資料庫不支援跨資料庫執行個體的查詢功能。
  • 資料庫執行個體之間不會共用或重複的資料 (或盡可能減少共用或重複內容)。
  • 每個應用程式執行個體一次只能連線至一個資料庫。

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

建立「主資料分割」

儲存資料在地圖上的儲存方式地圖 資料庫執行個體這樣一來,您就能透過程式查詢 執行個體對應至連線用戶端。請注意 比起直接連線至特定資料庫,會產生較多的負擔 適時列出您需要的執行個體

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

將資料儲存在孤立的資料庫執行個體,按照使用者或資料類型分組。 舉例來說,如果您在服務中為多個機構提供服務, 您可以為各機構建立資料庫執行個體,並儲存所有對話記錄 不重複的資料庫執行個體中的資料

以本例中,A 和 B 機構不共用資料,也沒有 而且只能查詢資料庫中的各項重複資料,而且只能針對 單一資料庫執行個體此外,每個機構的使用者 連線至所屬機構的資料庫。

接著,您就能預先建立多個資料庫執行個體 ,以便將團隊對應至資料庫執行個體。例如: 即時資料庫 A 的對應

對應應用程式資料的方式取決於特定用途,但 事先提出條件和策略,您就能定義 資料。

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

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

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

  1. 在 Firebase 控制台中,前往以下指標的「資料」分頁: 開發 >資料庫 專區。
  2. 從「即時資料庫」專區的選單中選取「建立新資料庫」
  3. 自訂資料庫參考資料並 「安全性規則,然後點選「我知道了」

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

您可以透過 Firebase 控制台或 Realtime Database Management REST API

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

請確認即時資料庫安全性規則允許各項 建立 Deployment 資料庫執行個體每個資料庫都有自己的一組規則 可以在 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 部署的最新變更。

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

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

Web

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);

Web

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()
// 透過網址取得次要資料庫執行個體 var ref: 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];
// 透過網址取得次要資料庫執行個體 @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 即時資料庫 並套用 Firebase CLI 指令例如,您可以使用以下指令執行 名為 my-example-shard.firebaseio.com 的資料庫執行個體的分析器:

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

每個資料庫的連線最佳化

如果每個用戶端在工作階段期間需連線至多個資料庫,您可以 減少連至每個資料庫執行個體的同時連線數量 隨時連線至各個資料庫執行個體。

取得更多建議

如果您需要從多個資料庫執行個體分割資料的更多協助, 與 Firebase 專家聯絡 Slack 頻道Stack Overflow 上,