Bạn có thể sử dụng cả Firebase Realtime Database và Cloud Firestore trong ứng dụng, đồng thời tận dụng lợi ích của từng giải pháp cơ sở dữ liệu sao cho phù hợp với nhu cầu của mình. Ví dụ: bạn có thể muốn tận dụng tính năng hỗ trợ của Realtime Database cho trạng thái hiện diện, như được nêu trong phần Xây dựng trạng thái hiện diện trong Cloud Firestore.
Tìm hiểu thêm về sự khác biệt giữa các cơ sở dữ liệu.
Đang di chuyển dữ liệu sang Cloud Firestore
Nếu bạn quyết định di chuyển một số dữ liệu từ Realtime Database sang Cloud Firestore, hãy cân nhắc quy trình sau. Vì mỗi cơ sở dữ liệu đều có nhu cầu và cấu trúc riêng, nên không có đường dẫn di chuyển tự động. Thay vào đó, bạn có thể làm theo trình tự chung sau:
Ánh xạ cấu trúc dữ liệu và quy tắc bảo mật từ Realtime Database sang Cloud Firestore. Cả Realtime Database và Cloud Firestore đều dựa vào Xác thực Firebase, nên bạn không cần thay đổi phương thức xác thực người dùng cho ứng dụng của mình. Tuy nhiên, các quy tắc bảo mật và mô hình dữ liệu của hai cơ sở dữ liệu này khác nhau, nên bạn cần phải xem xét kỹ những điểm khác biệt đó trước khi bắt đầu di chuyển dữ liệu sang Cloud Firestore.
Di chuyển dữ liệu trước đây. Khi thiết lập cấu trúc dữ liệu mới trong Cloud Firestore, bạn có thể ánh xạ và di chuyển dữ liệu hiện có từ Realtime Database sang phiên bản Cloud Firestore mới. Tuy nhiên, nếu đang sử dụng cả hai cơ sở dữ liệu trong ứng dụng, bạn không cần phải di chuyển dữ liệu trong quá khứ ra khỏi Realtime Database.
Phản ánh dữ liệu mới vào Firestore theo thời gian thực. Sử dụng Cloud Functions để ghi dữ liệu mới vào cơ sở dữ liệu Cloud Firestore mới khi dữ liệu được thêm vào Realtime Database.
Đặt Cloud Firestore làm cơ sở dữ liệu chính cho dữ liệu đã di chuyển. Sau khi bạn di chuyển một số dữ liệu, hãy sử dụng Cloud Firestore làm cơ sở dữ liệu chính và giảm mức sử dụng Realtime Database cho dữ liệu đã di chuyển. Hãy cân nhắc các phiên bản ứng dụng vẫn liên kết với Realtime Database cho dữ liệu đó và cách bạn dự định tiếp tục hỗ trợ các phiên bản đó.
Hãy đảm bảo bạn tính đến chi phí được lập hoá đơn cho cả Realtime Database và Cloud Firestore.
Liên kết dữ liệu
Dữ liệu trong Realtime Database được cấu trúc dưới dạng một cây duy nhất, trong khi Cloud Firestore hỗ trợ hệ phân cấp dữ liệu rõ ràng hơn thông qua tài liệu, tập hợp và tập hợp con. Nếu di chuyển một số dữ liệu từ Realtime Database sang Cloud Firestore, bạn nên cân nhắc một cấu trúc khác cho dữ liệu của mình.
Những điểm khác biệt chính cần cân nhắc
Nếu bạn di chuyển dữ liệu từ cây Realtime Database hiện có sang tài liệu và tập hợp Cloud Firestore, hãy lưu ý những điểm khác biệt chính sau đây giữa các cơ sở dữ liệu có thể ảnh hưởng đến cách bạn cấu trúc dữ liệu trong Cloud Firestore:
- Truy vấn nông mang lại sự linh hoạt hơn trong cấu trúc dữ liệu phân cấp.
- Các truy vấn phức tạp cung cấp mức độ chi tiết cao hơn và giảm nhu cầu về dữ liệu trùng lặp.
- Con trỏ truy vấn cung cấp tính năng phân trang mạnh mẽ hơn.
- Các giao dịch không còn yêu cầu một gốc chung cho tất cả dữ liệu của bạn và hiệu quả hơn.
- Chi phí được lập hoá đơn khác nhau giữa Realtime Database và Cloud Firestore. Trong nhiều trường hợp, Cloud Firestore có thể tốn kém hơn Realtime Database, đặc biệt là nếu bạn dựa vào nhiều thao tác nhỏ. Hãy cân nhắc việc giảm số lượng thao tác trên cơ sở dữ liệu và tránh các thao tác ghi không cần thiết. Tìm hiểu thêm về sự khác biệt trong việc thanh toán giữa Realtime Database và Cloud Firestore.
Các phương pháp hay nhất trong thực tế
Ví dụ sau đây phản ánh một số điểm cần cân nhắc khi bạn chuyển dữ liệu giữa các cơ sở dữ liệu. Bạn có thể tận dụng các tính năng đọc nông và truy vấn cải tiến để có cấu trúc dữ liệu tự nhiên hơn so với cấu trúc dữ liệu mà bạn có thể đã sử dụng với Realtime Database.
Hãy xem xét một ứng dụng hướng dẫn về thành phố giúp người dùng tìm thấy các địa danh nổi tiếng ở các thành phố trên khắp thế giới. Vì Realtime Database thiếu tính năng đọc nông, nên bạn có thể phải cấu trúc dữ liệu trong hai nút cấp cao nhất như sau:
// /cities/$CITY_KEY
{
name: "New York",
population: 8000000,
capital: False
}
// /city-landmark/$CITY_KEY/$LANDMARK_KEY
{
name: "Empire State Building",
category: "Architecture"
}
Cloud Firestore có các lượt đọc nông, vì vậy, việc truy vấn tài liệu trong một tập hợp sẽ không lấy dữ liệu từ các tập hợp con. Do đó, bạn có thể lưu trữ thông tin về địa danh trong một tập hợp con:
// /cities/$CITY_ID
{
name: "New York",
population: 8000000,
capital: False,
landmarks: [... subcollection ...]
}
Tài liệu có kích thước tối đa là 1 MB. Đây cũng là một lý do khác để lưu trữ các địa danh dưới dạng một tập hợp con, giúp mỗi tài liệu về thành phố luôn nhỏ gọn, thay vì làm phình to tài liệu bằng các danh sách lồng nhau.
Khả năng truy vấn nâng cao của Cloud Firestore giúp giảm nhu cầu sao chép dữ liệu cho các mẫu truy cập phổ biến. Ví dụ: hãy xem xét một màn hình trong ứng dụng hướng dẫn thành phố cho thấy tất cả thủ đô được sắp xếp theo dân số.
Trong Realtime Database, cách hiệu quả nhất để thực hiện việc này là duy trì một danh sách riêng biệt gồm các thủ đô sao chép dữ liệu từ danh sách cities, như sau:
{
cities: {
// ...
},
capital-cities: {
// ...
}
}
Trong Cloud Firestore, bạn có thể biểu thị danh sách các thủ đô theo thứ tự dân số dưới dạng một truy vấn:
db.collection('cities')
.where('capital', '==', true)
.orderBy('population')
Đọc thêm về mô hình dữ liệu Cloud Firestore và xem Giải pháp của chúng tôi để biết thêm ý tưởng về cách định cấu trúc cơ sở dữ liệu Cloud Firestore.
Bảo mật dữ liệu của bạn
Cho dù bạn đang sử dụng Cloud Firestore Security Rules cho ứng dụng Android, Apple hoặc Web hay Quản lý danh tính và quyền truy cập (IAM) cho máy chủ, hãy đảm bảo rằng bạn đang bảo mật dữ liệu của mình trong Cloud Firestore cũng như Realtime Database. Tính năng Xác thực xử lý việc xác thực người dùng cho cả hai cơ sở dữ liệu, vì vậy, bạn không cần thay đổi cách triển khai tính năng Xác thực khi bắt đầu sử dụng Cloud Firestore.
Những điểm khác biệt chính cần cân nhắc
- SDK dành cho thiết bị di động và web sử dụng Cloud Firestore Security Rules, trong khi SDK máy chủ sử dụng tính năng Quản lý danh tính và quyền truy cập (IAM) để bảo mật dữ liệu.
- Cloud Firestore Security Rules không xếp tầng trừ phi bạn sử dụng ký tự đại diện. Tài liệu và tập hợp không kế thừa các quy tắc.
- Bạn không cần phải xác thực dữ liệu riêng biệt nữa (như bạn đã làm trong Realtime Database).
- Cloud Firestore kiểm tra các quy tắc trước khi thực thi một truy vấn để đảm bảo rằng người dùng có quyền truy cập thích hợp vào tất cả dữ liệu mà truy vấn trả về.
Di chuyển dữ liệu trước đây sang Cloud Firestore
Sau khi liên kết cấu trúc dữ liệu và bảo mật với các mô hình dữ liệu và bảo mật của Cloud Firestore, bạn có thể bắt đầu thêm dữ liệu của mình. Nếu bạn dự định truy vấn dữ liệu trước đây sau khi di chuyển ứng dụng từ Realtime Database sang Cloud Firestore, hãy thêm một tệp xuất dữ liệu cũ vào cơ sở dữ liệu Cloud Firestore mới. Nếu dự định sử dụng cả Realtime Database và Cloud Firestore trong ứng dụng, bạn có thể bỏ qua bước này.
Để tránh ghi đè dữ liệu mới bằng dữ liệu cũ, bạn nên thêm dữ liệu trong quá khứ trước. Nếu bạn thêm dữ liệu mới vào cả hai cơ sở dữ liệu cùng một lúc, như đã thảo luận ở bước tiếp theo, hãy đảm bảo bạn ưu tiên dữ liệu mới được thêm vào Cloud Firestore bằng Cloud Functions.
Để di chuyển dữ liệu trước đây sang Cloud Firestore, hãy làm theo các bước sau:
- Xuất dữ liệu của bạn từ Realtime Database hoặc
sử dụng bản sao lưu gần đây.
- Trong bảng điều khiển của Firebase, hãy chuyển đến phần Cơ sở dữ liệu và bộ nhớ > Cơ sở dữ liệu theo thời gian thực.
- Trong thẻ Dữ liệu, hãy chọn nút cấp gốc của cơ sở dữ liệu rồi chọn Xuất JSON trong trình đơn.
Tạo cơ sở dữ liệu mới trong Cloud Firestore và thêm dữ liệu.
Hãy cân nhắc các chiến lược sau khi bạn di chuyển một số dữ liệu sang Cloud Firestore:
- Viết một tập lệnh tuỳ chỉnh để chuyển dữ liệu cho bạn. Mặc dù chúng tôi không thể cung cấp mẫu cho tập lệnh này vì mỗi cơ sở dữ liệu sẽ có nhu cầu riêng, nhưng các chuyên gia Cloud Firestore trên kênh Slack hoặc trên Stack Overflow của chúng tôi có thể xem xét tập lệnh của bạn hoặc đưa ra lời khuyên cho trường hợp cụ thể của bạn.
- Sử dụng SDK máy chủ (Node.js, Java, Python hoặc Go) để ghi dữ liệu trực tiếp vào Cloud Firestore. Để biết hướng dẫn về cách thiết lập SDK máy chủ, hãy xem phần Bắt đầu.
- Để đẩy nhanh quá trình di chuyển dữ liệu lớn, hãy sử dụng tính năng ghi theo lô và gửi tối đa 500 thao tác trong một yêu cầu mạng.
- Để duy trì dưới giới hạn tốc độ của Cloud Firestore, hãy giới hạn các thao tác ở mức 500 lượt ghi/giây cho mỗi tập hợp.
Thêm dữ liệu mới vào Cloud Firestore
Để duy trì tính tương đương giữa các cơ sở dữ liệu, hãy thêm dữ liệu mới vào cả hai cơ sở dữ liệu theo thời gian thực. Sử dụng Cloud Functions để kích hoạt thao tác ghi vào Cloud Firestore bất cứ khi nào ứng dụng ghi vào Realtime Database. Đảm bảo rằng Cloud Firestore ưu tiên dữ liệu mới đến từ Cloud Functions hơn bất kỳ hoạt động ghi nào bạn đang thực hiện từ quá trình di chuyển dữ liệu trong quá khứ.
Tạo một hàm để ghi dữ liệu mới hoặc dữ liệu thay đổi vào Cloud Firestore mỗi khi ứng dụng ghi dữ liệu vào Realtime Database. Tìm hiểu thêm về Realtime Database trình kích hoạt cho Cloud Functions.
Đặt Cloud Firestore làm cơ sở dữ liệu chính cho dữ liệu đã di chuyển
Nếu bạn đã quyết định sử dụng Cloud Firestore làm cơ sở dữ liệu chính cho một số dữ liệu, hãy đảm bảo bạn đã tính đến mọi chức năng phản chiếu dữ liệu mà bạn đã thiết lập và xác thực Cloud Firestore Security Rules.
Nếu bạn đã sử dụng Cloud Functions để duy trì tính tương đương giữa các cơ sở dữ liệu, hãy đảm bảo rằng bạn không lặp lại các thao tác ghi trên cả hai cơ sở dữ liệu trong một vòng lặp. Chuyển hàm của bạn sang ghi vào một cơ sở dữ liệu duy nhất hoặc xoá hoàn toàn hàm đó và bắt đầu loại bỏ dần chức năng ghi cho dữ liệu đã di chuyển trong các ứng dụng vẫn liên kết với Realtime Database. Cách bạn xử lý vấn đề này cho ứng dụng phụ thuộc vào nhu cầu cụ thể của bạn và người dùng.
Xác minh rằng dữ liệu của bạn được bảo mật đúng cách. Xác thực chế độ thiết lập Cloud Firestore Security Rules hoặc IAM.