如要最佳化 Firebase Realtime Database 中的效能並擴充資料,最佳做法是將資料分割至多個 Realtime Database 例項,也就是資料庫分割。資料分割提供彈性地擴充 適用於個別資料庫的限制 以及負載平衡和效能最佳化
分割資料的時機
如果您使用 Realtime Database,且符合下列任一情況,可能需要將資料分割至多個資料庫:
- 您希望擴充規模超出 200,000 個連線的上限 每秒 1,000 次寫入作業,或其他任何 單一資料庫執行個體的限制。
- 您擁有多個獨立資料集,並想盡量提升效能 (例如,即時通訊應用程式為個別獨立的使用者群組提供服務)。
- 您希望在多個資料庫的負載之間取得平衡,藉此增加運作時間,並 可降低單一資料庫執行個體超載的風險。
如何切割資料
如要分割資料,請按照下列步驟操作 (詳細說明如下):
- 根據應用程式的特定需求,將資料對應至多個資料庫。
- 建立多個資料庫例項。
- 設定應用程式,使其連線至必要的 Realtime Database 執行個體 個別資料集
對應資料
將資料對應至多個資料庫時,請盡可能滿足 下列情況:
- 每個查詢只會針對單一資料庫執行。Realtime Database 不支援跨資料庫執行個體的查詢。
- 資料庫執行個體之間不會共用或重複的資料 (或盡可能減少共用或重複內容)。
- 每個應用程式執行個體一次只能連線至一個資料庫。
建立資料對應時,請考慮採用下列策略:
建立「主資料分割」
儲存資料在各資料庫執行個體中的儲存方式對應表。這樣一來,您就能透過程式查詢 執行個體對應至連線用戶端。請注意 比起直接連線至特定資料庫,會產生較多的負擔 適時列出您需要的執行個體
依類別或客戶為資料進行值區
將資料儲存在孤立的資料庫執行個體,按照使用者或資料類型分組。 舉例來說,如果您建構的即時通訊應用程式可服務多個機構,您可以為每個機構建立資料庫執行個體,並將所有即時通訊資料儲存在專屬資料庫執行個體中。
在這種情況下,機構 A 和機構 B 不會共用資料,資料庫中也不會有任何重複的資料,而且您只會針對單一資料庫執行查詢。此外,各機構的使用者只有在使用即時通訊應用程式時,才會連線至所屬機構的資料庫。
接著,您可以預先建立多個資料庫執行個體,並使用組織的 ID 將團隊對應至其資料庫執行個體。舉例來說,機構 A 會對應至即時資料庫 A。
為應用程式對應資料的方式取決於您的特定用途,但上述條件和策略有助於您定義適合您資料的做法。
建立多個「Realtime Database」執行個體
如果您使用的是 Blaze 定價方案,可以在同一個 Firebase 專案中建立最多 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()// 透過網址取得次要資料庫執行個體 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 Realtime Database
並套用 Firebase CLI 指令舉例來說,您可以使用下列指令,為名為 my-example-shard.firebaseio.com
的資料庫執行個體執行分析工具:
firebase database:profile --instance "my-example-shard"
最佳化各個資料庫的連線
如果每個用戶端在工作階段期間需連線至多個資料庫,您可以 減少連至每個資料庫執行個體的同時連線數量 隨時連線至各個資料庫執行個體。
取得更多建議
如果您需要從多個資料庫執行個體分割資料的更多協助, 與 Firebase 專家聯絡 Slack 頻道 或 Stack Overflow 上,