想在「Firebase Realtime Database」中發揮最佳效能及調整資料的最佳方式 在於將資料拆分至多個 Realtime Database 執行個體 以及資料庫資料分割資料分割提供彈性地擴充 適用於個別資料庫的限制 以及負載平衡和效能最佳化
分割資料的時機
如果您使用了 Realtime Database,適用下列任一情況:
- 您希望擴充規模超出 200,000 個連線的上限 每秒 1,000 次寫入作業,或其他任何 單一資料庫執行個體的限制。
- 您擁有多個獨立資料集,並想盡量提高效能 (例如,即時通訊應用程式為個別獨立的使用者群組提供服務)。
- 您希望平衡多個資料庫的負載,以提高正常運作時間,並降低單一資料庫執行個體超載的風險。
如何切割資料
如要切割資料,請按照下列步驟操作 (詳情請見下文):
- 根據應用程式的特定需求,將資料對應至多個資料庫。
- 建立多個資料庫執行個體。
- 設定應用程式,使其連線至必要的 Realtime Database 執行個體 個別資料集
對應資料
將資料對應至多個資料庫時,請盡可能滿足 下列情況:
- 每個查詢只會針對單一資料庫執行。Realtime Database 不支援跨資料庫執行個體的查詢。
- 資料庫執行個體之間不會共用或重複的資料 (或盡可能減少共用或重複內容)。
- 每個應用程式執行個體在任何時間點都只會連線至一個資料庫。
對應資料時,建議您採用以下策略:
建立「主資料分割」
儲存資料在地圖上的儲存方式地圖 資料庫執行個體這樣一來,您就能透過程式查詢 執行個體對應至連線用戶端。請注意 比起直接連線至特定資料庫,會產生較多的負擔 適時列出您需要的執行個體
依類別或客戶區隔資料
將資料儲存在孤立的資料庫執行個體,按照使用者或資料類型分組。 舉例來說,如果您在服務中為多個機構提供服務, 您可以為各機構建立資料庫執行個體,並儲存所有對話記錄 不重複的資料庫執行個體中的資料
以本例中,A 和 B 機構不共用資料,也沒有 而且只能查詢資料庫中的各項重複資料,而且只能針對 單一資料庫執行個體此外,每個機構的使用者 連線至所屬機構的資料庫。
接著,您可以預先建立多個資料庫執行個體,並使用組織 ID 將團隊對應至其資料庫執行個體。舉例來說,機構 A 會對應至即時資料庫 A。
對應應用程式資料的方式取決於特定用途,但 事先提出條件和策略,您就能定義 資料。
建立多個 Realtime Database 執行個體
如果您採用 Blaze 定價方案,最多可以建立 1,000 個 資料庫執行個體。
Firebase 主控台,顯示「資料庫」區段中的內容相關選單
- 在 Firebase 控制台中,前往以下位置的「資料」分頁: 開發 >資料庫 專區。
- 在 Realtime Database 部分的選單中選取「建立新的資料庫」。
- 自訂資料庫參照和安全性規則,然後按一下「我知道了」。
視需要重複相同程序,建立任意數量的資料庫執行個體。每項 資料庫執行個體有專屬的 Firebase Realtime Database Security Rules 組合,因此您可以 微調資料的存取權
您可以透過 Firebase 控制台或 Realtime Database Management REST API。
為每個執行個體編輯及部署「Realtime Database Security Rules」
請確認Realtime Database Security Rules允許每個項目的適當存取 建立 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()
Objective-C
// Get the default database instance for an app@property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase database] 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 Realtime Database
並套用 Firebase CLI 指令例如,您可以使用以下指令執行
名為 my-example-shard.firebaseio.com
的資料庫執行個體的分析器:
firebase database:profile --instance "my-example-shard"
每個資料庫的連線最佳化
如果每個用戶端在工作階段期間需連線至多個資料庫,您可以 減少連至每個資料庫執行個體的同時連線數量 隨時連線至各個資料庫執行個體。
取得更多建議
如果您需要從多個資料庫執行個體分割資料的更多協助, 與 Firebase 專家聯絡 Slack 頻道 或 Stack Overflow 上,