Sử dụng Cloud Firestore với Cơ sở dữ liệu theo thời gian thực của Firebase

Bạn có thể sử dụng cả Firebase Realtime DatabaseCloud Firestore trong ứng dụng của mình, đồng thời tận dụng các lợi ích của từng giải pháp cơ sở dữ liệu cho phù hợp với nhu cầu của bạn. Ví dụ: bạn có thể 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 Tạo 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ó 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 sau:

  1. Liên kết cấu trúc dữ liệu và quy tắc bảo mật từ Realtime Database đến Cloud Firestore. Cả Realtime DatabaseCloud Firestore đều dựa vào tính năng Xác thực Firebase, vì vậy, bạn không cần thay đổi tính năng 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 là khác nhau, vì vậy, bạn cần phải 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.

  2. Di chuyển dữ liệu trong quá khứ. 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 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, bạn không cần di chuyển dữ liệu trong quá khứ ra khỏi Realtime Database.

  3. 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.

  4. Đặ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 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 nhớ tính đến chi phí thanh toán cho cả Realtime DatabaseCloud 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 đơn, 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.
  • Truy vấn phức tạp cung cấp thông tin chi tiết 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 thư mục 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 DatabaseCloud 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ỏ. Cân nhắc giảm số lượng thao tác trên cơ sở dữ liệu và tránh ghi không cần thiết. Tìm hiểu thêm về sự khác biệt về hệ thống thanh toán giữa Realtime DatabaseCloud 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ều 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 tính năng đọc nông và khả năng truy vấn được cải thiện để có cấu trúc dữ liệu tự nhiên hơn so với khi sử dụng Realtime Database.

Hãy xem xét một ứng dụng hướng dẫn thành phố giúp người dùng tìm thấy các địa danh nổi bật ở các thành phố trên thế giới. Vì Realtime Database thiếu các lượt đọ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 bộ sưu tập sẽ không lấy 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 phụ:

// /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 là một lý do khác để lưu trữ các điểm tham quan dưới dạng một bộ sưu tập con, giúp mỗi tài liệu về thành phố có kích thước nhỏ, thay vì làm tài liệu trở nên cồng kềnh bằng các danh sách lồng nhau.

Các tính 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ố hiển thị tất cả các thành phố 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ành phố 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ành phố 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 tạo 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ý quyền truy cập danh tính (IAM) cho máy chủ, hãy đảm bảo bạn bảo mật dữ liệu trong Cloud Firestore cũng như Realtime Database. Phương thức Xác thực sẽ 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 Phương thức 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, còn SDK máy chủ sử dụng tính năng Quản lý quyền truy cập danh tính (IAM) để bảo mật dữ liệu.
  • Cloud Firestore Security Rules không tạo hiệu ứng thác nước trừ phi bạn sử dụng ký tự đại diện. Tài liệu và bộ sưu tập không kế thừa quy tắc.
  • Bạn không cần xác thực dữ liệu riêng biệt nữa (như đã làm 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 đối với tất cả dữ liệu do truy vấn trả về.

Di chuyển dữ liệu trong quá khứ sang Cloud Firestore

Sau khi liên kết dữ liệu và cấu trúc bảo mật với 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. Nếu bạn dự định truy vấn dữ liệu trong quá khứ sau khi chuyển ứng dụng từ Realtime Database sang Cloud Firestore, hãy thêm dữ liệu cũ đã xuất vào cơ sở dữ liệu Cloud Firestore mới. Nếu dự định sử dụng cả Realtime DatabaseCloud 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ũ, trước tiên, bạn nên thêm dữ liệu trong quá khứ. 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 trong bước tiếp theo, hãy nhớ ư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 trong quá khứ sang Cloud Firestore, hãy làm theo các bước sau:

  1. 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.
    1. Chuyển đến phần Realtime Database trong bảng điều khiển Firebase.
    2. Trên thẻ Data (Dữ liệu), hãy chọn nút cấp gốc của cơ sở dữ liệu rồi chọn Export JSON (Xuất JSON) trong trình đơn.
  2. Tạo cơ sở dữ liệu mới trong Cloud Firestorethê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ột mẫu cho tập lệnh này, vì mỗi cơ sở dữ liệu sẽ có nhu cầu riêng, các chuyên gia Cloud Firestore 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 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 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 hàng loạt 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 độ 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 đồng nhất 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 một lượt ghi vào Cloud Firestore bất cứ khi nào ứng dụng khách ghi vào Realtime Database. Đảm bảo rằng Cloud Firestore ưu tiên dữ liệu mới đến từ Cloud Functions so với mọi hoạt động ghi mà bạn 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 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ề trình kích hoạt Realtime Database 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 nhớ tính đến mọi hàm phản chiếu dữ liệu mà bạn đã thiết lập và xác thực Cloud Firestore Security Rules.

  1. Nếu bạn đã sử dụng Cloud Functions để duy trì tính đồng nhất giữa các cơ sở dữ liệu, hãy đảm bảo rằng 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 đổi hàm để 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ỏ 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 sẽ phụ thuộc vào nhu cầu cụ thể của bạn và người dùng.

  2. 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.