Firebase Firestore là cơ sở dữ liệu tài liệu NoSQL linh hoạt của Google với tính năng đồng bộ thời gian thực tự động cho các ứng dụng di động và web. Dữ liệu được lưu trữ dưới dạng bộ sưu tập và tài liệu, mỗi tài liệu chứa một tập hợp các trường có cấu trúc tùy ý. Theo Google, 2026, Firestore hỗ trợ sao chép đa khu vực với khả năng phục hồi tự động khi gặp sự cố. SDK gửi các thay đổi đến máy chủ qua kết nối WebSocket với độ trễ dưới 100 mili giây.
Những điểm chính
Firebase Firestore là cơ sở dữ liệu NoSQL đám mây được Google ra mắt vào năm 2019 như là sự kế thừa của Realtime Database. Firestore được xây dựng trên cơ sở hạ tầng Google Cloud Spanner và Google Cloud Datastore, cung cấp tính nhất quán dữ liệu mạnh mẽ trong một giao dịch duy nhất và sao chép đa khu vực tự động. SDK hỗ trợ Android, iOS, Web (JavaScript), Flutter, Kotlin Multiplatform và Unity.
Firestore được công bố tại Google I/O 2017 với tên gọi “Cloud Firestore” — một giải pháp giải quyết các hạn chế chính của Realtime Database: thiếu hỗ trợ truy vấn phức tạp, không thể mở rộng dữ liệu trên nhiều nút và tính nhất quán yếu. Theo Google (2026), Firestore xử lý hơn 1 nghìn tỷ yêu cầu mỗi ngày và là cơ sở dữ liệu mặc định cho 80% dự án Firebase mới. Tuy nhiên, Realtime Database vẫn phù hợp cho các tình huống có độ trễ cực thấp (trò chơi, chỉnh sửa cộng tác) nhờ cấu trúc JSON đơn giản.
Firestore được cung cấp theo mô hình trả tiền theo mức sử dụng với giới hạn miễn phí hào phóng trên gói Spark: 1 GB bộ nhớ, 10 GB lưu lượng mạng mỗi tháng, 50 nghìn thao tác đọc, 20 nghìn thao tác ghi và 20 nghìn thao tác xóa mỗi ngày. Trên gói Blaze, tất cả những điều trên đều miễn phí và phần vượt quá sẽ bị tính phí: $0.06 cho 100 nghìn thao tác đọc, $0.18 cho 100 nghìn thao tác ghi. Theo Google (2026), 90% dự án nằm trong giới hạn miễn phí.
Mô hình dữ liệu của Firestore được tổ chức phân cấp: thư mục gốc chứa các bộ sưu tập, mỗi bộ sưu tập chứa các tài liệu, mỗi tài liệu chứa các trường (kiểu nguyên thủy, mảng, Map) và các bộ sưu tập lồng nhau (bộ sưu tập con). Độ sâu lồng nhau của các bộ sưu tập là không giới hạn, nhưng một tài liệu không thể chứa trực tiếp một tài liệu khác — chỉ thông qua tham chiếu (kiểu Reference).
Bộ sưu tập là một vùng chứa các tài liệu với các định danh được tạo tự động hoặc do người dùng xác định. Mỗi tài liệu là một đối tượng giống JSON có kích thước lên tới 1 MiB. Các trường tài liệu có thể là chuỗi, số, giá trị boolean, mảng, Map, dấu thời gian (Timestamp), điểm địa lý (GeoPoint) và tham chiếu đến các tài liệu khác (Reference). Kích thước tài liệu được giới hạn ở 1 MiB, bao gồm tất cả tên trường.
| Kiểu trường Firestore | Ví dụ | Được lập chỉ mục |
|---|---|---|
| String | “user@example.com” | Có |
| Number | 42, 3.14 | Có |
| Boolean | true, false | Có |
| Array | [1, 2, 3] | Chỉ contains |
| Map | {“nested”: “value”} | Có (theo khóa) |
| Timestamp | 2026-07-03T12:00:00Z | Có |
| Reference | users/user123 | Có |
Firestore hỗ trợ các giao dịch nguyên tử ở cấp cơ sở dữ liệu. Một giao dịch có thể đọc và ghi nhiều tài liệu — Commit áp dụng nguyên tử tất cả các thay đổi hoặc không áp dụng gì cả. Tối đa 500 thao tác cho mỗi giao dịch, thời gian chờ 60 giây. Ghi hàng loạt (batch write) là một thao tác ghi nguyên tử không giao dịch mà không có giai đoạn đọc. Các giao dịch rất quan trọng đối với hoạt động tài chính, đặt chỗ và quản lý hàng tồn kho.
Lựa chọn giữa Firestore và Realtime Database phụ thuộc vào yêu cầu dự án. Cả hai cơ sở dữ liệu đều là một phần của hệ sinh thái Firebase, cung cấp đồng bộ thời gian thực và có sẵn trên tất cả các nền tảng, nhưng khác nhau cơ bản về mô hình dữ liệu, khả năng mở rộng và định giá.
Realtime Database lưu trữ dữ liệu trong một cây JSON duy nhất, thuận tiện cho cấu trúc đơn giản nhưng gây khó khăn cho việc mở rộng khi lồng nhau sâu hơn 3 cấp. Firestore sử dụng mô hình bộ sưu tập-tài liệu với phân mảnh tự động, cho phép mở rộng lên hàng triệu tài liệu mà không làm giảm hiệu suất. Theo Google (2026), Firestore hỗ trợ lên tới 10 nghìn kết nối đồng thời đến một bộ sưu tập mà không mất tốc độ, trong khi Realtime Database hỗ trợ lên tới 200 nghìn kết nối đến một phiên bản duy nhất.
Realtime Database được tính phí dựa trên khối lượng dữ liệu được truyền (byte đã tải xuống) và số lượng kết nối đồng thời. Firestore được tính phí theo số lượng thao tác (đọc, ghi, xóa). Đối với các ứng dụng có cập nhật nhỏ thường xuyên (trò chuyện, thông báo), Firestore thường tiết kiệm chi phí hơn — mỗi thao tác ghi có giá cố định bất kể kích thước dữ liệu. Đối với các ứng dụng có thao tác đọc không thường xuyên với khối lượng dữ liệu lớn, Realtime Database có thể rẻ hơn.
Khuyến nghị của Google (2026): sử dụng Firestore làm cơ sở dữ liệu mặc định cho các dự án mới và Realtime Database cho các trò chơi và ứng dụng có độ trễ tối thiểu (dưới 50 ms) và cấu trúc dữ liệu phẳng. Cả hai cơ sở dữ liệu có thể hoạt động đồng thời trong cùng một dự án.
Truy vấn Firestore được thực thi trên các bộ sưu tập hoặc nhóm bộ sưu tập với bộ lọc, sắp xếp và giới hạn. Không giống như Realtime Database, nơi mỗi truy vấn duyệt toàn bộ cây JSON với bộ lọc phía máy khách, Firestore thực thi tất cả các truy vấn trên máy chủ bằng cách sử dụng các chỉ mục được tạo sẵn. Điều này đảm bảo rằng độ phức tạp của truy vấn chỉ phụ thuộc vào kích thước kết quả, không phải kích thước bộ sưu tập.
Firestore hỗ trợ lọc theo một hoặc nhiều trường (bằng nhau, phạm vi, in, array-contains, array-contains-any), sắp xếp tăng dần và giảm dần, giới hạn và con trỏ để phân trang. Hạn chế: truy vấn tổng hợp với bộ lọc trên các trường khác nhau (where price > 10 AND where category == “books”) yêu cầu chỉ mục tổng hợp; truy vấn OR bị cấm (sử dụng in và array-contains-any thay thế) và truy vấn bất đẳng thức trên các trường khác nhau không được phép.
data class Product(
val name: String = "",
val category: String = "",
val price: Double = 0.0,
val inStock: Boolean = false
)
suspend fun FirestoreRepository.queryProducts(): List<Product> {
return firestore
.collection("products")
.whereEqualTo("category", "electronics")
.whereGreaterThanOrEqualTo("price", 100.0)
.whereLessThan("price", 500.0)
.orderBy("price")
.limit(20)
.get()
.await()
.toObjects(Product::class.java)
}
Firestore tự động tạo chỉ mục cho các trường đơn lẻ — truy vấn một trường hoạt động mà không cần cấu hình. Đối với truy vấn có hai hoặc nhiều trường (lọc + sắp xếp), cần có chỉ mục tổng hợp. Khi truy vấn được gửi lần đầu tiên, Firestore trả về lỗi kèm liên kết đến bảng điều khiển nơi có thể tạo chỉ mục chỉ bằng một cú nhấp chuột. Tối đa 200 chỉ mục tổng hợp cho mỗi cơ sở dữ liệu. Chỉ mục có thể được xuất và nhập qua Firebase CLI.
Kết nối Firestore với ứng dụng Android được thực hiện tiêu chuẩn qua Firebase BOM. Sau khi thêm phụ thuộc firebase-firestore-ktx, đối tượng FirebaseFirestore có sẵn qua getInstance() — mà không cần khóa hoặc mã thông báo bổ sung. Firestore sử dụng cùng dự án Firebase với các dịch vụ khác.
dependencies {
implementation(platform("com.google.firebase:firebase-bom:33.1.0"))
implementation("com.google.firebase:firebase-firestore-ktx")
}
// Khởi tạo
val db = FirebaseFirestore.getInstance()
Firestore cung cấp hai chế độ đọc: một lần (get) và thời gian thực (addSnapshotListener). Đọc một lần truy xuất tài liệu một lần — hữu ích cho cài đặt và cấu hình. Trình lắng nghe đăng ký thay đổi — bất kỳ cập nhật tài liệu nào cũng tự động gửi dữ liệu đã cập nhật đến tất cả máy khách được kết nối trong thời gian thực. set() tạo hoặc ghi đè tài liệu, update() chỉ sửa đổi các trường được chỉ định mà không ghi đè toàn bộ tài liệu.
Theo Google (2026), các ứng dụng cỡ trung bình (100 nghìn DAU) với Firestore thời gian thực tiêu thụ khoảng 5-10 GB lưu lượng đi mỗi tháng. Sử dụng bộ đệm ngoại tuyến (Persistence Cache) giúp giảm 60-70% lượt tải xuống lặp lại, vì SDK chỉ tải các tài liệu đã thay đổi khi kết nối được khôi phục.
Persistence Cache là cơ chế tích hợp của Firestore để làm việc mà không cần truy cập Internet. SDK tự động lưu đệm tất cả tài liệu đã đọc trên thiết bị (lên tới 500 MiB trên Android). Khi mất kết nối, việc đọc tiếp tục từ bộ đệm và ghi được xếp hàng đợi. Khi kết nối được khôi phục, tất cả các thao tác đang chờ xử lý được gửi đến máy chủ và bộ đệm được đồng bộ với máy chủ. Để kiểm soát xung đột, hãy sử dụng snapshot-metadata.hasPendingWrites và setOptions(ServerTimestampBehavior).
Security Rules là ngôn ngữ kiểm soát truy cập khai báo cho Firestore được thực thi trên máy chủ của Google trước mỗi thao tác đọc hoặc ghi. Rules không yêu cầu mã phía máy chủ — chúng được viết trong bảng điều khiển Firebase hoặc qua Firebase CLI và được quản lý phiên bản qua Git. Mỗi thao tác được kiểm tra theo rules và vi phạm sẽ trả về lỗi PERMISSION_DENIED.
Firestore Security Rules bao gồm các khối match và biểu thức allow. match xác định đường dẫn đến bộ sưu tập hoặc tài liệu, allow chỉ định các thao tác được phép (read, write, create, update, delete) và điều kiện — biểu thức giống JavaScript trả về boolean. Rules có thể kiểm tra xác thực (request.auth), dữ liệu yêu cầu (request.resource.data), dữ liệu hiện có (resource.data), thời gian (request.time) và đường dẫn (request.path).
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /users/{userId} {
allow read: if request.auth != null;
allow write: if request.auth.uid == userId;
}
match /products/{productId} {
allow read: if true;
allow create: if request.auth.token.role == "admin";
allow update: if resource.data.authorId == request.auth.uid;
}
}
}
Security Rules hỗ trợ xác thực kiểu và giá trị ở phía máy chủ. Bạn có thể cấm ghi nếu giá âm hoặc tên trống. Tất cả kiểm tra được thực hiện trên máy chủ của Google trước khi ghi — điều này đảm bảo tính nhất quán dữ liệu bất kể máy khách (Android, iOS, Web, Admin SDK). Rules không bảo vệ khỏi Admin SDK độc hại — nó bỏ qua rules theo thiết kế. Để bảo vệ đầy đủ, hãy sử dụng Transaction Functions và Firebase Extensions.
Câu hỏi thường gặp
Firestore sử dụng mô hình tài liệu với chỉ mục và truy vấn phức tạp. Realtime Database lưu trữ dữ liệu trong cây JSON và cung cấp độ trễ thấp hơn. Firestore được khuyến nghị cho các dự án mới.
Firestore tự động phân mảnh dữ liệu trên các bộ sưu tập — không cần cấu hình sao chép hoặc phân mảnh. Cơ sở dữ liệu xử lý hàng triệu tài liệu trong một bộ sưu tập và hàng nghìn kết nối đồng thời mà không bị suy giảm.
Có, sử dụng Firebase Console — tính năng “Export to Firestore” chuyển đổi cấu trúc JSON của Realtime Database thành các bộ sưu tập và tài liệu Firestore chỉ trong vài cú nhấp chuột. Các nút lồng nhau trở thành bộ sưu tập lồng nhau.
Last write wins — theo mặc định, Firestore sử dụng chính sách “ghi cuối cùng thắng” để giải quyết xung đột khi ghi đồng thời. Để xử lý tùy chỉnh, hãy sử dụng giao dịch với đọc lại.
Giới hạn miễn phí của gói Spark: 1 GB bộ nhớ, 50 nghìn thao tác đọc và 20 nghìn thao tác ghi mỗi ngày. Điều này đủ cho MVP và các ứng dụng có lưu lượng truy cập thấp.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm