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 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 khả năng hỗ trợ sự hiện diện của Realtime Database, như được nêu trong phần Xây dựng sự 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ác yếu tố 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:

  1. Lập bản đồ cấu trúc dữ liệu và các quy tắc bảo mật từ Realtime Database sang Cloud Firestore. Cả Realtime DatabaseCloud Firestore đều dựa vào Firebase Authentication, 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 sẽ khác nhau và bạn cần cân nhắc kỹ lưỡng 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ể lập bản đồ 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 di chuyển dữ liệu cũ ra khỏi Realtime Database.

  3. Sao chép 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 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 những phiên bản ứng dụng vẫn được liên kết với Realtime Database để lấy dữ liệu đó và cách bạn dự định tiếp tục hỗ trợ các phiên bản này.

Đảm bảo bạn tính đến chi phí thanh toán cho cả Realtime DatabaseCloud Firestore.

Lập bản đồ 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ệ thống 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 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 các 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 cung cấp nhiều sự linh hoạt hơn trong các cấu trúc dữ liệu phân cấp.
  • Các truy vấn phức tạp cung cấp độ 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í thanh toán giữa Realtime DatabaseCloud Firestore có sự khác biệt. Trong nhiều trường hợp, Cloud Firestore có thể tốn kém 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 thông tin 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ểm cần cân nhắc mà bạn có thể đưa ra khi di chuyển dữ liệu giữa các cơ sở dữ liệu. Bạn có thể tận dụng các khả năng đọc nông và 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 xem xét một ứng dụng hướng dẫn du lịch 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 lượt đọc nông, nên có thể bạn phải cấu trúc dữ liệu trong 2 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 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 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 là một lý do khác để lưu trữ các địa danh dưới dạng một bộ sưu tập con, giữ cho mỗi tài liệu 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.

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 du lịch thành phố cho thấy 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 gồm 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ủ đô 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 Các 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 của bạn

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 nhớ bảo mật dữ liệu của bạn trong Cloud Firestore cũng như Realtime Database. Quy trình xác thực người dùng do Authentication xử lý cho cả hai cơ sở dữ liệu, vì vậy, bạn không cần thay đổi cách triển khai Authentication 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 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 dùng ký tự đại diện. Các tài liệu và bộ sưu tập không kế thừa quy tắc theo cách khác.
  • Bạn không cần 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 hiện một truy vấn để đảm bảo rằng người dùng có quyền truy cập phù 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 của bạn 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. 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 một bản 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 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ũ, 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 một lúc, như đã thảo luận ở 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 cũ 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 mục Realtime Database trong bảng điều khiển Firebase.
    2. Trong 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ẫu cho tập lệnh này vì mỗi cơ sở dữ liệu sẽ có những nhu cầu riêng, nhưng các chuyên gia Cloud Firestore trên kênh Slack của chúng tôi 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 về cách thiết lập SDK 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 duy nhất.
    • Để duy trì dưới Cloud Firestoregiới hạn về tốc độ, hãy giới hạn số lượng 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ì 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 so với mọi hoạt động 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ề điều kiện 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 đả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.

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