Giới thiệu

Firebase Firestore là một cơ sở dữ liệu đám mây - nghĩa là dữ liệu của bạn được lưu trữ trên máy chủ của Google, không phải trên máy tính của bạn. Nó giúp bạn lưu trữ và quản lý dữ liệu một cách an toàn và hiệu quả.
Cơ sở dữ liệu là gì? - Hãy tưởng tượng nó như một chiếc tủ có nhiều ngăn (collections) và trong mỗi ngăn có nhiều tài liệu (documents) chứa thông tin chi tiết. Firestore giúp bạn tổ chức, lưu trữ và tìm kiếm thông tin này một cách dễ dàng.

Cấu trúc cơ bản: Collections và Documents

Collection (Bộ sưu tập)

Một Collection là một tập hợp các documents cùng loại. Nó giống như một bảng trong Excel hoặc một thư mục chứa nhiều tệp. Ví dụ trong hệ thống Task Management:
  • tasks - Collection chứa tất cả công việc cần làm
  • tasks/{taskId}/comments - SubCollection chứa bình luận của từng task
  • projects - Collection chứa tất cả dự án
  • users - Collection chứa thông tin thành viên team

Document (Tài liệu)

Một Document là một bản ghi duy nhất trong collection, chứa các thông tin chi tiết. Nó giống như một hàng trong Excel. Ví dụ: Một document trong collection tasks có thể là:

Cấu trúc phân cấp


Các Kiểu Dữ liệu (Datatypes)

Firebase Firestore hỗ trợ nhiều kiểu dữ liệu khác nhau. Dưới đây là những loại phổ biến nhất:

1. Text (Văn bản)

Dùng để lưu: Tên, mô tả, email, địa chỉ, hoặc bất kỳ thông tin văn bản nào.

2. Number (Số)

Dùng để lưu: Giá tiền, số lượng, tuổi, hoặc bất kỳ con số nào.
Số nguyên vs Số thập phân
  • Số nguyên (Integer): 100, 50, 2024
  • Số thập phân (Decimal): 99.99, 4.5, 3.14

3. Boolean (Đúng/Sai)

Dùng để lưu: Tình trạng mở/tắt, có/không, hoặc trạng thái nhị phân.

4. Timestamp (Thời gian)

Dùng để lưu: Ngày giờ tạo, ngày giờ cập nhật, hoặc bất kỳ mốc thời gian nào.

5. Array (Mảng - Danh sách)

Dùng để lưu: Danh sách các mục, kỹ năng, hoặc thẻ.

6. Map (Bản đồ - Đối tượng)

Dùng để lưu: Thông tin chi tiết được nhóm lại, giống như một object.

7. Reference (Liên kết)

Dùng để lưu: Tham chiếu đến document khác (để liên kết dữ liệu).

8. Null (Không có giá trị)

Dùng để lưu: Khi một trường không có thông tin.

9. Enum Pattern (Giá trị cố định)

Firestore không có kiểu enum native. Thay vào đó, bạn dùng Text và tự quy ước tập giá trị hợp lệ — việc kiểm tra đúng/sai phải làm ở tầng application code.
Firestore không tự động chặn giá trị sai. Nếu code lưu status: "xyz", Firestore vẫn chấp nhận. Bạn phải validate ở phía app trước khi ghi xuống database.
Best practice: Định nghĩa các giá trị hợp lệ bằng const trong TypeScript để tránh lỗi typo:
TypeScript

Ví dụ Thực tế: Hệ thống Quản lý Dự án (ProjectOS)

Hãy xem cách tổ chức dữ liệu cho một hệ thống quản lý công việc như ProjectOS - nền tảng quản lý dự án cho các team phát triển phần mềm:
ProjectOS Collections:
  • projects - Các dự án trong hệ thống
  • tasks - Công việc hàng ngày của team
  • users - Thành viên team, vai trò, kỹ năng
  • budget - Chi phí dự án, phân bổ ngân sách
  • risks - Các rủi ro tiềm ẩn, mitigation plan
  • documents - Tài liệu, yêu cầu, architecture
  • meetings - Hội họp, ghi chú, quyết định
  • reports - Báo cáo tình trạng, phân tích hiệu suất

Best Practices - Cách tổ chức dữ liệu tốt

1. ✅ Đặt tên rõ ràng

2. ✅ Dùng ID có ý nghĩa (nếu có thể)

3. ✅ Tổ chức dữ liệu theo logic

Nhóm thông tin liên quan vào cùng một document hoặc sử dụng Map:

4. ✅ Tránh dữ liệu quá lớn

5. ✅ Dùng Timestamp để theo dõi thay đổi


Chiến lược Tổ chức Data - Flat vs Nested

Flat Structure (Dẹt)

Mỗi loại thông tin là một collection riêng:
Ưu điểm: Dễ quản lý, tìm kiếm nhanh, tiết kiệm không gian Nhược điểm: Cần nhiều query hơn để lấy toàn bộ thông tin

Nested Structure (Lồng nhau)

Thông tin được lồng trong document:
Ưu điểm: Thông tin liên quan được nhóm lại gọn gàng Nhược điểm: Có thể phức tạp hơn khi truy vấn
Lựa chọn nào tốt hơn? - Thường dùng Flat Structure cho dữ liệu đơn giản, và Nested Structure khi bạn có dữ liệu phức tạp hoặc có mối quan hệ mạnh mẽ giữa các thông tin.

Thao tác với Dữ liệu - Những điều cần biết

Thêm (Create)

Đọc (Read)

Cập nhật (Update)

Xóa (Delete)


Chi phí lưu trữ - Cần biết

Firebase Firestore tính phí dựa trên:
Mẹo tiết kiệm:
  • Nhóm các cập nhật nhỏ lại để giảm số lần ghi
  • Xóa dữ liệu cũ không cần dùng
  • Dùng indexing thông minh để tối ưu query
  • Tránh đọc toàn bộ documents khi chỉ cần một vài field

Tóm lược - Checklist thiết kế Dữ liệu

1

Xác định Collections

Quyết định những loại dữ liệu nào bạn cần (users, products, orders, …)
2

Chọn Datatypes phù hợp

Xác định từng field sẽ là Text, Number, Boolean, Array, Map, …
3

Đặt tên rõ ràng

Sử dụng tên tiếng Anh, snake_case hoặc camelCase, tránh viết tắt
4

Thiết kế ID Document

Quyết định ID tự động hay tự đặt (ví dụ: user_john_doe)
5

Chọn cấu trúc phù hợp

Dùng Flat hoặc Nested tùy nhu cầu
6

Thêm Timestamps

Luôn thêm createdAt và updatedAt để theo dõi
7

Kiểm tra quan hệ

Nếu cần liên kết dữ liệu, dùng Reference hoặc Array of IDs
8

Test với Dữ liệu thực

Thử tạo, cập nhật, xóa dữ liệu để chắc chắn cấu trúc hợp lý

Các câu hỏi thường gặp

Firebase Firestore lưu trữ dữ liệu trên máy chủ của Google với bản sao lưu tự động. Dữ liệu rất an toàn, nhưng bạn nên có chiến lược sao lưu định kỳ cho dữ liệu quan trọng.
Có, bạn có thể thay đổi hoặc thêm field bất kỳ lúc nào. Ví dụ: nếu lúc đầu age là Number, sau đó bạn có thể thêm dateOfBirth mà không ảnh hưởng đến dữ liệu cũ.
Có, mỗi document không được vượt quá 1MB. Nếu cần lưu dữ liệu lớn hơn (như ảnh), hãy dùng Firebase Storage và lưu link trong Firestore.
Firestore cho phép bạn tìm kiếm dựa trên các điều kiện, ví dụ:
  • Tất cả tasks có status: "in_progress" — xem việc đang làm dở
  • Tất cả tasks có assignee: users/dev-alice — việc của một người cụ thể
  • Tất cả tasks có dueDate trước ngày hôm nay — công việc đã quá hạn
  • Tất cả tasks thuộc projectId: projects/project-mobile-app — việc trong một dự án
Firestore tốt hơn nếu:
  • Bạn cần ứng dụng real-time
  • Dữ liệu không cấu trúc chặt chẽ
  • Ứng dụng mobile cần hoạt động offline
SQL Database tốt hơn nếu:
  • Dữ liệu có quan hệ phức tạp (nhiều bảng, join)
  • Bạn cần transaction phức tạp
  • Dữ liệu cấu trúc rất chặt chẽ

Bước tiếp theo

Sau khi hiểu rõ về datatype và cách tổ chức dữ liệu, bạn có thể:
  1. Thiết lập Firebase Project
  2. Thiết kế schema dữ liệu cho ứng dụng của mình
  3. Tạo collections và documents đầu tiên
  4. Bắt đầu lưu trữ và truy vấn dữ liệu thực

Ghi chú: Hướng dẫn này dành cho người không có background lập trình. Nếu bạn là developer, hãy tham khảo tài liệu chính thức của Firebase để biết chi tiết kỹ thuật hơn.