Cách tốt nhất để tối ưu hoá hiệu suất và mở rộng quy mô dữ liệu trong Firebase Realtime Database là phân tách dữ liệu của bạn trên nhiều thực thể Realtime Database, còn gọi là phân đoạn cơ sở dữ liệu. Phân đoạn giúp bạn linh hoạt mở rộng quy mô vượt quá giới hạn áp dụng cho từng phiên bản cơ sở dữ liệu, ngoài việc cân bằng tải và tối ưu hoá hiệu suất.
Trường hợp nên phân đoạn dữ liệu
Bạn nên phân đoạn dữ liệu trên nhiều cơ sở dữ liệu nếu đang sử dụng Realtime Database và thuộc bất kỳ trường hợp nào sau đây:
- Bạn muốn mở rộng quy mô vượt quá giới hạn 200.000 kết nối đồng thời, 1.000 thao tác ghi/giây hoặc bất kỳ giới hạn nào khác cho một phiên bản cơ sở dữ liệu.
- Bạn có nhiều tập dữ liệu riêng biệt và muốn tối ưu hoá hiệu suất (ví dụ: một ứng dụng trò chuyện phục vụ các nhóm người dùng riêng biệt, độc lập).
- Bạn muốn cân bằng tải trên nhiều cơ sở dữ liệu để cải thiện thời gian hoạt động và giảm nguy cơ quá tải cho một phiên bản cơ sở dữ liệu.
Cách phân đoạn dữ liệu
Để phân đoạn dữ liệu, hãy làm theo các bước sau (được mô tả chi tiết hơn ở bên dưới):
- Ánh xạ dữ liệu của bạn với nhiều cơ sở dữ liệu theo nhu cầu cụ thể của ứng dụng.
- Tạo nhiều thực thể cơ sở dữ liệu.
- Định cấu hình ứng dụng để ứng dụng kết nối với thực thể Realtime Database cần thiết cho mỗi tập dữ liệu.
Liên kết dữ liệu
Khi bạn liên kết dữ liệu với nhiều cơ sở dữ liệu, hãy cố gắng đáp ứng các điều kiện sau:
- Mỗi truy vấn chỉ chạy trên một phiên bản cơ sở dữ liệu. Realtime Database không hỗ trợ truy vấn trên các phiên bản cơ sở dữ liệu.
- Không chia sẻ hoặc sao chép dữ liệu trên các phiên bản cơ sở dữ liệu (hoặc chia sẻ hoặc sao chép ở mức tối thiểu).
- Mỗi phiên bản ứng dụng chỉ kết nối với một cơ sở dữ liệu tại bất kỳ thời điểm nào.
Khi liên kết dữ liệu, hãy cân nhắc áp dụng các chiến lược sau:
Tạo "phân đoạn chính"
Lưu trữ bản đồ về cách dữ liệu của bạn được lưu trữ trên các phiên bản cơ sở dữ liệu. Bằng cách này, bạn có thể tra cứu theo phương thức lập trình để biết phiên bản cơ sở dữ liệu nào tương ứng với ứng dụng kết nối. Xin lưu ý rằng việc này có thể gây tốn tài nguyên hơn so với việc kết nối trực tiếp với một phiên bản cơ sở dữ liệu cụ thể khi bạn cần.
Nhóm dữ liệu theo danh mục hoặc theo khách hàng
Lưu trữ dữ liệu trong các phiên bản cơ sở dữ liệu riêng biệt, được nhóm theo người dùng hoặc loại dữ liệu. Ví dụ: nếu xây dựng một ứng dụng trò chuyện phục vụ nhiều tổ chức, bạn có thể tạo một phiên bản cơ sở dữ liệu cho mỗi tổ chức và lưu trữ tất cả dữ liệu trò chuyện trong các phiên bản cơ sở dữ liệu riêng biệt.
Trong trường hợp này, tổ chức A và tổ chức B không chia sẻ dữ liệu, không có dữ liệu trùng lặp trong cơ sở dữ liệu của bạn và bạn chỉ thực hiện truy vấn đối với một phiên bản cơ sở dữ liệu duy nhất. Ngoài ra, người dùng trong mỗi tổ chức chỉ kết nối với cơ sở dữ liệu của tổ chức khi họ sử dụng ứng dụng trò chuyện.
Sau đó, bạn có thể tạo trước một số phiên bản cơ sở dữ liệu và sử dụng mã nhận dạng của tổ chức để liên kết một nhóm với phiên bản cơ sở dữ liệu của nhóm đó. Ví dụ: tổ chức A liên kết với Cơ sở dữ liệu theo thời gian thực A.
Cách bạn liên kết dữ liệu cho ứng dụng phụ thuộc vào trường hợp sử dụng cụ thể, nhưng các điều kiện và chiến lược nêu trên có thể giúp bạn xác định điều gì phù hợp với dữ liệu của mình.
Tạo nhiều phiên bản Realtime Database
Nếu đang sử dụng gói giá Blaze, bạn có thể tạo tối đa 1.000 thực thể cơ sở dữ liệu trong cùng một dự án Firebase.

Trong bảng điều khiển Firebase, hãy chuyển đến thẻ Cơ sở dữ liệu và bộ nhớ > Cơ sở dữ liệu theo thời gian thực > Dữ liệu.
Chọn Create new database (Tạo cơ sở dữ liệu mới) trong trình đơn thả xuống.
Tuỳ chỉnh Tham chiếu cơ sở dữ liệu và Security Rules, sau đó nhấp vào Tôi hiểu.
Lặp lại quy trình này để tạo số lượng phiên bản cơ sở dữ liệu mà bạn cần. Mỗi phiên bản cơ sở dữ liệu có một bộ Firebase Realtime Database Security Rules riêng, vì vậy, bạn có thể tinh chỉnh quyền truy cập vào dữ liệu của mình.
Bạn có thể tạo và quản lý các phiên bản cơ sở dữ liệu trong bảng điều khiển Firebase hoặc sử dụng API REST Quản lý cơ sở dữ liệu theo thời gian thực.
Quản lý và tương tác với các thực thể cụ thể bằng CLI
Bạn có thể quản lý và tương tác với các thực thể Realtime Database cụ thể bằng cách sử dụng CLI Firebase.
Theo mặc định, các lệnh CLI sẽ tương tác với thực thể cơ sở dữ liệu mặc định của bạn. Tuy nhiên, bạn có thể tương tác với một thực thể cơ sở dữ liệu không mặc định bằng cách sử dụng cờ --instance DATABASE_NAME
Ví dụ: sử dụng lệnh sau để chạy trình phân tích cho một phiên bản cơ sở dữ liệu có tên là my-example-shard.firebaseio.com:
firebase database:profile --instance "my-example-shard"
Các lệnh sau hỗ trợ cờ --instance:
firebase database:getfirebase database:profilefirebase database:pushfirebase database:removefirebase database:setfirebase database:update
Chỉnh sửa và triển khai Realtime Database Security Rules cho từng thực thể
Đảm bảo rằng Realtime Database Security Rules của bạn cho phép quyền truy cập thích hợp vào từng phiên bản cơ sở dữ liệu trong dự án. Mỗi cơ sở dữ liệu có một bộ quy tắc riêng mà bạn có thể chỉnh sửa và triển khai từ bảng điều khiển Firebase hoặc sử dụng Firebase CLI để triển khai mục tiêu.
Để chỉnh sửa và triển khai các quy tắc từ bảng điều khiển Firebase, hãy làm theo các bước sau:
Trong bảng điều khiển Firebase, hãy chuyển đến thẻ Cơ sở dữ liệu và bộ nhớ > Cơ sở dữ liệu theo thời gian thực > Quy tắc.
Chọn cơ sở dữ liệu bạn muốn chỉnh sửa, sau đó sửa đổi các quy tắc.
Để chỉnh sửa và triển khai các quy tắc từ CLI Firebase, hãy làm theo các bước sau:
Sửa đổi các quy tắc trong tệp quy tắc cho các phiên bản cơ sở dữ liệu của bạn (ví dụ:
foo.rules.json).Tạo và áp dụng mục tiêu triển khai để liên kết các cơ sở dữ liệu sử dụng cùng một tệp quy tắc. Ví dụ:
firebase target:apply database main my-db-1 my-db-2
firebase target:apply database other my-other-db-3
Cập nhật tệp cấu hình
firebase.jsonbằng các mục tiêu triển khai:{ "database": [ {"target": "main", "rules": "foo.rules.json"}, {"target": "other", "rules": "bar.rules.json"} ] }Chạy lệnh triển khai:
firebase deploy
Hãy đảm bảo rằng bạn luôn chỉnh sửa và triển khai các quy tắc từ cùng một nơi. Việc triển khai các quy tắc từ CLI Firebase sẽ ghi đè mọi nội dung chỉnh sửa mà bạn đã thực hiện trong bảng điều khiển Firebase, đồng thời việc chỉnh sửa các quy tắc ngay trong bảng điều khiển Firebase sẽ ghi đè mọi thay đổi gần đây mà bạn đã triển khai thông qua CLI Firebase.
Kết nối ứng dụng với nhiều phiên bản cơ sở dữ liệu
Sử dụng tệp đối chiếu cơ sở dữ liệu để truy cập vào dữ liệu được lưu trữ trong các phiên bản cơ sở dữ liệu phụ. Bạn có thể lấy thông tin tham chiếu cho một phiên bản cơ sở dữ liệu cụ thể theo URL hoặc ứng dụng. Nếu không chỉ định URL, bạn sẽ nhận được thông tin tham chiếu cho phiên bản cơ sở dữ liệu mặc định của ứng dụng.
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
// 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();
Tối ưu hoá các kết nối trên mỗi cơ sở dữ liệu
Nếu mỗi ứng dụng khách cần kết nối với nhiều cơ sở dữ liệu trong một phiên, bạn có thể giảm số lượng kết nối đồng thời với mỗi phiên bản cơ sở dữ liệu bằng cách chỉ kết nối với mỗi phiên bản cơ sở dữ liệu trong thời gian cần thiết.
Xem thêm lời khuyên
Nếu bạn cần thêm trợ giúp về việc phân đoạn dữ liệu trên nhiều phiên bản cơ sở dữ liệu, hãy liên hệ với các chuyên gia Firebase trên kênh Slack hoặc trên Stack Overflow.