Bạn có thể sử dụng cả Firebase Realtime Database và Cloud Firestore trong ứng dụng của mình, đồng thời tận dụng lợi ích của từng giải pháp cơ sở dữ liệu để phù hợp với nhu cầu của bạn. Ví dụ: bạn có thể muốn tận dụng tính năng hỗ trợ trạng thái hiện diện của Realtime Database', như được nêu trong bài viết 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.
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ó các nhu cầu và cân nhắc 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 tiến trình chung này:
Liên kết 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, vì vậy, bạn không cần thay đổi quy trình xác thực người dùng cho ứng dụng của mình. Tuy nhiên, quy tắc bảo mật và mô hình dữ liệu khác nhau và bạn cần cẩn thận tính đến 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 cũ. Khi thiết lập cấu trúc dữ liệu mới trong Cloud Firestore, bạn có thể liên kết và di chuyển dữ liệu hiện có từ Realtime Database sang thực thể Cloud Firestore mới. Tuy nhiên, nếu đang sử dụng cả hai cơ sở dữ liệu trong ứng dụng của mình, bạn không cần di chuyển dữ liệu cũ ra khỏi Realtime Database.
Đồng bộ hoá hai chiều dữ liệu mới sang Firestore theo thời gian thực. Sử dụng Cloud Functions để ghi dữ liệu mới vào Cloud Firestore cơ sở dữ liệu 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 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 được 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í thanh toá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ợ các hệ phân cấp dữ liệu rõ ràng hơn thông qua tài liệu, bộ sưu tập và bộ sưu tập con. Nếu di chuyển một số dữ liệu từ Realtime Database sang Cloud Firestore, bạn có thể cân nhắc một kiến 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 Cloud Firestore tài liệu và bộ sưu tập, 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.
- Truy vấn phức tạp mang lại độ 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 mang lại khả năng phân trang mạnh mẽ hơn.
- 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í thanh toán khác nhau giữa Realtime Database và Cloud Firestore. Trong nhiều trường hợp, Cloud Firestore có thể đắt hơn Realtime Database, đặc biệt 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 đang được áp dụng
Ví dụ sau đây phản ánh một số điểm cần cân nhắc mà bạn có thể thực hiện khi chuyển dữ liệu giữa các cơ sở dữ liệu. Bạn có thể tận dụng các thao tác đọc nông và khả năng truy vấn được cải thiện cho các cấu trúc dữ liệu tự nhiên hơn so với những cấu trúc mà bạn có thể đã sử dụng với Realtime Database.
Hãy cân nhắc một ứng dụng hướng dẫn du lịch 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 các thao tác đọ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 thao tác đọc nông, vì vậy, việc truy vấn tài liệu trong một bộ sưu tập sẽ không kéo dữ liệu từ các bộ sưu tập con. Do đó, bạn có thể lưu trữ thông tin về địa danh trong một bộ sưu tậ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à 1MB. Đây là một lý do khác để lưu trữ địa danh dưới dạng một bộ sưu tập con, giữ cho mỗi tài liệu về thành phố có kích thước nhỏ, thay vì làm phình to tài liệu bằng các danh sách lồng nhau.
Cloud Firestore Khả năng truy vấn nâng cao giúp giảm nhu cầu về
dữ liệu trùng lặp cho các mẫu truy cập phổ biến. Ví dụ: hãy cân nhắc một màn hình trong ứng dụng hướng dẫn du lịch thành phố hiển thị tất cả cá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 về 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 duy nhất:
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 cấu trúc cơ sở dữ liệu Cloud Firestore.
Bảo mật dữ liệu
Cho dù bạn đang sử dụng Cloud Firestore Security Rules cho ứng dụng Android, Apple hay ứng dụng web, hoặc Quản lý quyền truy cập và danh tính (IAM) cho máy chủ, hãy đảm bảo 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 người dùng được xử lý bằng tính năng Xác thực 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 dành cho máy chủ sử dụng Quản lý quyền truy cập và danh tính (IAM) để bảo mật dữ liệu.
- Cloud Firestore Security Rules không được áp dụng theo tầng trừ phi bạn sử dụng ký tự đại diện. Nếu không, tài liệu và bộ sưu tập sẽ không kế thừa quy tắc.
- Bạn không còn cần xác thực dữ liệu riêng biệt (như trong Realtime Database).
- Cloud Firestore kiểm tra các quy tắc trước khi thực thi truy vấn để đảm bảo rằng người dùng có quyền truy cập thích hợp cho tất cả dữ liệu do truy vấn trả về.
Di chuyển dữ liệu cũ sang Cloud Firestore
Sau khi liên kết cấu trúc dữ liệu và bảo mật với Cloud Firestore's mô hình dữ liệu và bảo mật, bạn có thể bắt đầu thêm dữ liệu. Nếu bạn dự định truy vấn dữ liệu cũ sau khi di chuyển ứng dụng từ Realtime Database sang Cloud Firestore, hãy thêm bản xuất dữ liệu cũ vào cơ sở dữ liệu Cloud Firestore mới. Nếu bạn dự định sử dụng cả Realtime Database và Cloud Firestore trong ứng dụng của mình, 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 cũ trước. Nếu bạn thêm dữ liệu mới vào cả hai cơ sở dữ liệu cùng lúc, như thảo luận trong 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 cũ sang Cloud Firestore, hãy làm theo các bước sau:
- Xuất dữ liệu 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 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 đây 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ó các nhu cầu riêng, Cloud Firestore các chuyên gia trên kênh Slack hoặc trên Stack Overflow 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 dành cho 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 dành cho máy chủ, hãy xem bài viết Bắt đầu.
- Để đẩy nhanh quá trình di chuyển dữ liệu lớn, hãy sử dụng các thao tác ghi theo lô và gửi tối đa 500 thao tác trong một yêu cầu mạng.
- Để không vượt quá giới hạn tốc độ của Cloud Firestore, hãy giới hạn các thao tác ở mức 500 thao tác ghi/giây cho mỗi bộ sưu tập.
Thêm dữ liệu mới vào Cloud Firestore
Để duy trì sự 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 một ứ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 mọi thao tác ghi mà bạn đang thực hiện từ quá trình di chuyển dữ liệu cũ.
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 một ứ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 hàm sao chép 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ì sự tương đồng giữa các cơ sở dữ liệu, hãy đảm bảo bạn không sao chép 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 để 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 được liên kết với Realtime Database. Cách bạn xử lý việc này cho ứng dụng của mình 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 Cloud Firestore Security Rules hoặc thiết lập IAM.