使用多個資料庫調度資源

在 Firebase 即時資料庫中最佳化效能並調度資料的最佳方式,是將資料分割至多個即時資料庫執行個體 (又稱為資料庫資料分割)。資料分割除了提供負載平衡和效能最佳化功能,還可讓您靈活調度資源,不受限制適用於個別資料庫執行個體的限制

資料分割資料的時機

如果您使用即時資料庫,且符合下列任一情況,可能會想要分割多個資料庫中的資料:

  • 您想要擴充的範圍超過單一資料庫執行個體的 200,000 個同時連線上限、每秒寫入作業 1,000 次,或任何其他限制
  • 您有多個獨立的資料集,並希望發揮最佳效能 (例如服務為獨立的獨立使用者群組提供的即時通訊應用程式)。
  • 您想要平衡多個資料庫的負載,以提高運作時間,並降低單一資料庫執行個體超載的風險。

如何分割資料

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

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

對應資料

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

  • 每項查詢都只會針對單一資料庫執行個體執行。即時資料庫不支援跨資料庫執行個體查詢功能。
  • 不得跨資料庫執行個體共用或複製資料,或盡可能減少共用或重複資料的情形。
  • 每個應用程式執行個體在任何指定時刻都只會連線至一個資料庫。

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

建立「主資料分割」

儲存資料庫執行個體資料儲存方式的對應圖。如此一來,您就能透過程式輔助方式,查詢與連線用戶端對應的資料庫執行個體。請注意,相較於直接連線至您需要的特定資料庫執行個體,這種方式可能具有更高的負擔。

依類別或客戶區分資料

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

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

接著,您也可以預先建立多個資料庫執行個體,並使用機構 ID 將團隊對應至其資料庫執行個體。舉例來說,機構 A 對應至即時資料庫 A。

應用程式對應資料的方式取決於特定用途,但上述的條件和策略可協助您定義哪些項目適合資料。

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

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

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

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

重複這個程序,根據需求建立任意數量的資料庫執行個體。每個資料庫執行個體都有一組專屬的 Firebase 即時資料庫安全性規則,可讓您微調資料的存取權。

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

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

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

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

    1. 前往「Develop」(開發) >「Database」(資料庫) 區段,前往「Rules」(規則) 分頁
    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, nonatomic) 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 專家聯絡。