Firebase Cloud FireStore

I. Tổng quan
Cloud Firestore là một cơ sở dữ liệu NoSQL của Google Firebase, được thiết kế để lưu trữ và đồng bộ dữ liệu giữa các ứng dụng di động, web và máy chủ.
Cloud Firestore tổ chức dữ liệu dưới dạng các tài liệu (documents) trong các bộ sưu tập (collections). Mỗi tài liệu chứa các trường và giá trị, tạo nên một cấu trúc dữ liệu linh hoạt và phản ánh cấu trúc ứng dụng:
Collection (Bộ sưu tập) -> Document (Tài liệu) -> Fields (Trường và giá trị)
Một trong những đặc điểm nổi bật của Cloud Firestore là khả năng hỗ trợ cập nhật thời gian thực. Dữ liệu được tự động đồng bộ giữa các thiết bị, giúp ứng dụng luôn duy trì thông tin mới nhất.
II. Chi phí
Theo thông tin mới nhất trên: https://firebase.google.com/pricing
- Số lượng tài liệu bạn đọc, viết và xóa .
- Số lượng mục chỉ mục khớp với các truy vấn tổng hợp . Bạn bị tính phí một lần đọc tài liệu cho mỗi lô có tối đa 1000 mục nhập chỉ mục khớp với truy vấn.
- Dung lượng lưu trữ mà cơ sở dữ liệu của bạn sử dụng , bao gồm cả chi phí dành cho siêu dữ liệu và chỉ mục.
- Lượng băng thông mạng mà bạn sử dụng .
1. Document writes
Chi phí ghi dữ liệu trong Cloud Firestore của Firebase phụ thuộc vào số lần bạn thực hiện các write operations, bao gồm việc thêm mới, cập nhật hoặc xóa dữ liệu.
Document writes sẽ được tính như sau:
mỗi thao tác add, set hoặc update được tính là một lần ghi
====== Thêm Mới Một Tài Liệu
// Thêm mới một tài liệu vào một bộ sưu tập
var newDocumentRef = FirebaseFirestore.instance.collection('users').add({
'name': 'John Doe',
'age': 25,
});
// Mỗi lần thêm mới một tài liệu là một write operation
====== Cập Nhật Một Trường Trong Một Tài Liệu
// Cập nhật trường 'age' trong một tài liệu
var userDocRef = FirebaseFirestore.instance.collection('users').doc('user_id');
userDocRef.update({
'age': 26,
});
// Mỗi lần cập nhật một trường trong một tài liệu là một write operation
===== Batch Writes
// Sử dụng batch writes để thêm mới và cập nhật nhiều tài liệu trong một batch
var batch = FirebaseFirestore.instance.batch();
// Thêm mới một tài liệu
batch.set(FirebaseFirestore.instance.collection('users').doc('user1'), {'name': 'Alice', 'age': 30});
// Cập nhật một tài liệu
batch.update(FirebaseFirestore.instance.collection('users').doc('user2'), {'age': 28});
// Thực hiện batch writes
batch.commit();
// Tổng số lần ghi là tổng số lần thực hiện mỗi thao tác trong batch
===== Atomic Transactions
// Sử dụng transaction để thực hiện một write operation có tính atomic
FirebaseFirestore.instance.runTransaction((transaction) async {
// Đọc dữ liệu hiện tại
var userDocRef = FirebaseFirestore.instance.collection('users').doc('user_id');
var snapshot = await transaction.get(userDocRef);
var currentAge = snapshot.data()?['age'] ?? 0;
// Thực hiện cập nhật dữ liệu
transaction.update(userDocRef, {'age': currentAge + 1});
});
// Mỗi lần thực hiện transaction là một write operation
2. Document deletes
===== Xóa 1 tài liệu độc lập
// Xóa một tài liệu từ bộ sưu tập
var userDocRef = FirebaseFirestore.instance.collection('users').doc('user_id');
userDocRef.delete();
// Mỗi lần xóa một tài liệu là một document delete
===== Batch write với thao tác xóa
// Sử dụng batch writes để xóa nhiều tài liệu trong một batch
var batch = FirebaseFirestore.instance.batch();
// Xóa một tài liệu
batch.delete(FirebaseFirestore.instance.collection('users').doc('user1'));
// Xóa một tài liệu khác
batch.delete(FirebaseFirestore.instance.collection('users').doc('user2'));
// Thực hiện batch writes
batch.commit();
// Tổng số lần xóa là tổng số lần thực hiện mỗi thao tác xóa trong batch
===== Atomic Transactions với Thao Tác Xóa
// Sử dụng transaction để thực hiện một thao tác xóa có tính atomic
FirebaseFirestore.instance.runTransaction((transaction) async {
// Xóa một tài liệu
var userDocRef = FirebaseFirestore.instance.collection('users').doc('user_id');
transaction.delete(userDocRef);
});
// Mỗi lần thực hiện transaction với thao tác xóa là một document delete
3. Document reads
Document Reads được tính dựa trên số lượng tài liệu thực sự được đọc từ cơ sở dữ liệu, không phải là số lượng tài liệu được trả về từ truy vấn.
===== Đọc 1 tài liệu
// Đọc một tài liệu từ bộ sưu tập
var userDocRef = FirebaseFirestore.instance.collection('users').doc('user_id');
var snapshot = await userDocRef.get();
// Mỗi lần đọc một tài liệu là một Document Read
===== Truy vấn nhiều tài liệu
// Thực hiện một truy vấn để đọc nhiều tài liệu
var querySnapshot = await FirebaseFirestore.instance.collection('users').where('age', isGreaterThan: 25).get();
// Mỗi lần đọc một tài liệu trong kết quả truy vấn là một Document Read. truy vấn trong DB với 10 tài liệu thỏa mãn thì Document read được tính là 10.
Ngoài ra: Có một khoản phí tối thiểu cho một lần đọc tài liệu cho mỗi truy vấn bạn thực hiện, ngay cả khi truy vấn không trả về kết quả nào.
===== Truy vấn tổng hợp
Đối với các truy vấn tổng hợp như count() , sum() và avg() 1 Document Read cho mỗi lô có tối đa 1000 mục nhập chỉ mục khớp với truy vấn. Kể cả 0 có chỉ mục nào phù hợp thì vẫn tính 1. Ví dụ: phép toán count() khớp từ 0 đến 1000 mục nhập chỉ mục sẽ được tính phí cho 1 Document Read. Đối với thao tác count() khớp với 1500 mục nhập chỉ mục, bạn sẽ bị tính phí cho 2 Document Read.
===== Đọc Thông Qua Stream
// Đọc dữ liệu thông qua stream với 1 user_id cụ thể
var userDocRef = FirebaseFirestore.instance.collection('users').doc('user_id');
var stream = userDocRef.snapshots();
// Mỗi lần có sự thay đổi dữ liệu, là một Document Read
// Đọc dữ liệu từ collection thông qua stream với cả 1 collection
var collectionRef = FirebaseFirestore.instance.collection('users');
var stream = collectionRef.snapshots();
// Lần đầu tiên, Firebase sẽ gửi một snapshot với toàn bộ dữ liệu trong 'users'
// Chi phí Document Reads sẽ phụ thuộc vào số lượng tài liệu trong 'users'. Ví dụ có 10 users thì sẽ là 10 Document Read
// Sau đó, mỗi khi có sự thay đổi trong 'users', Firebase sẽ gửi các snapshot cập nhật
// Chi phí Document Reads cho mỗi cập nhật sẽ phụ thuộc vào số lượng tài liệu thay đổi trong cập nhật đó
III. Demo với Flutter
Create database
Lưu ý: Location sau khi chọn thì sẽ không thể thay đổi được
Tạm thời để allow read, write là true để cho phép đọc và ghi lên Firestore.
Thêm lib trong Flutter
- flutter pub add cloud_firestore
Thêm mới dữ liệu và kiểm tra trên console
Đọc dữ liệu trong collection chúng ta có: