如要最佳化 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 主控台中,依序前往「Develop」>「Database」 區段中的「Data」分頁標籤。
- 在「Realtime Database」部分的選單中,選取「建立新資料庫」。
- 自訂資料庫參照和安全性規則,然後點選「我知道了」。
重複執行這個程序,即可視需要建立任意數量的資料庫執行個體。每個資料庫執行個體都有自己的 Firebase Realtime Database Security Rules 組合,因此您可以微調資料存取權。
您可以在 Firebase 控制台中建立及管理資料庫執行個體,也可以使用 Realtime Database Management REST API。
編輯及部署各個執行個體的 Realtime Database Security Rules
請確認您的 Realtime Database Security Rules 允許存取專案中每個資料庫執行個體的適當存取權。每個資料庫都有一組規則,您可以透過 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, 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 Realtime Database。舉例來說,您可以使用下列指令,為名為 my-example-shard.firebaseio.com
的資料庫執行個體執行分析工具:
firebase database:profile --instance "my-example-shard"
最佳化各個資料庫的連線
如果每個用戶端在工作階段中都需要連線至多個資料庫,您可以減少與每個資料庫執行個體的同時連線數量,方法是只在必要時連線至每個資料庫執行個體。
取得更多建議
如需進一步瞭解如何在多個資料庫執行個體中分割資料,請透過 Slack 頻道或 Stack Overflow 與 Firebase 專家聯絡。