讓 Firebase 即時資料庫發揮最佳效能並擴充資料的最佳方式 在於將資料拆分為多個即時資料庫執行個體 以及資料庫資料分割資料分割提供彈性地擴充 適用於個別資料庫的限制 以及負載平衡和效能最佳化
分割資料的時機
如果您使用了 即時資料庫,可因應以下任何情況:
- 您希望擴充規模超出 200,000 個連線的上限 每秒 1,000 次寫入作業,或其他任何 單一資料庫執行個體的限制。
- 您有多個各自獨立的資料集,且想要提升成效 (例如為獨立使用者群組提供服務的即時通訊應用程式)。
- 您希望在多個資料庫的負載之間取得平衡,藉此增加運作時間,並 可降低單一資料庫執行個體超載的風險。
如何分割資料
如要分割資料,請按照下列步驟操作 (詳細說明如下):
- 根據應用程式的特定需求,將資料對應至多個資料庫。
- 建立多個資料庫執行個體。
- 設定應用程式,使其連線至必要的即時資料庫執行個體 個別資料集
對應資料
將資料對應至多個資料庫時,請盡可能滿足 下列情況:
- 每項查詢都只會針對單一資料庫執行個體執行。 即時資料庫不支援跨資料庫執行個體的查詢功能。
- 資料庫執行個體之間不會共用或重複的資料 (或盡可能減少共用或重複內容)。
- 每個應用程式執行個體一次只能連線至一個資料庫。
對應資料時,建議您採用以下策略:
建立「主資料分割」
儲存資料在地圖上的儲存方式地圖 資料庫執行個體這樣一來,您就能透過程式查詢 執行個體對應至連線用戶端。請注意 比起直接連線至特定資料庫,會產生較多的負擔 適時列出您需要的執行個體
依類別或客戶為資料進行值區
將資料儲存在孤立的資料庫執行個體,按照使用者或資料類型分組。 舉例來說,如果您在服務中為多個機構提供服務, 您可以為各機構建立資料庫執行個體,並儲存所有對話記錄 不重複的資料庫執行個體中的資料
以本例中,A 和 B 機構不共用資料,也沒有 而且只能查詢資料庫中的各項重複資料,而且只能針對 單一資料庫執行個體此外,每個機構的使用者 連線至所屬機構的資料庫。
接著,您就能預先建立多個資料庫執行個體 ,以便將團隊對應至資料庫執行個體。例如: 即時資料庫 A 的對應
對應應用程式資料的方式取決於特定用途,但 事先提出條件和策略,您就能定義 資料。
建立多個即時資料庫執行個體
如果您採用 Blaze 定價方案,最多可以建立 1,000 個 資料庫執行個體。
視需要重複相同程序,建立任意數量的資料庫執行個體。每項 資料庫執行個體有一套專屬的 Firebase 即時資料庫安全性規則 微調資料的存取權
您可以透過 Firebase 控制台或 Realtime Database Management REST API。
編輯及部署各個執行個體的即時資料庫安全性規則
請確認即時資料庫安全性規則允許各項 建立 Deployment 資料庫執行個體每個資料庫都有自己的一組規則 可以在 Firebase 控制台中編輯及部署 使用 Firebase CLI 部署目標。
如要透過 Firebase 控制台編輯及部署規則,請按照下列步驟操作:
- 前往 「規則」分頁 [開發] > [資料庫」區段。
- 選取要編輯的資料庫,然後修改規則。
如要透過 Firebase CLI 編輯及部署規則,請按照下列步驟操作:
- 修改資料庫執行個體的規則檔案規則 (例如
foo.rules.json
)。 - 建立部署目標並套用,以便連結使用相同規則檔案的資料庫。例如:
firebase target:apply database main my-db-1 my-db-2
firebase target:apply database other my-other-db-3
使用部署目標更新
firebase.json
設定檔:{ "database": [ {"target": "main", "rules": "foo.rules.json"}, {"target": "other", "rules": "bar.rules.json"} ] }
執行部署指令:
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
// Get the default database instance for an appvar ref: DatabaseReference! ref = Database.database().reference()// 透過網址取得次要資料庫執行個體 var ref: DatabaseReference! ref = Database.database("https://testapp-1234.firebaseio.com")reference()
Objective-C
// 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 上,