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ả Cơ sở dữ liệu theo thời gian thực của Firebase và Cloud 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 sao cho phù hợp với nhu cầu của bạn. Ví dụ: có thể bạn muốn tận dụng khả năng hỗ trợ của Cơ sở dữ liệu theo thời gian thực cho việc hiện diện, như đã nêu trong bài viết 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 của mình từ Cơ sở dữ liệu theo thời gian thực sang Cloud Firestore, hãy cân nhắc thực hiện các bước sau. Vì mỗi cơ sở dữ liệu đều có những nhu cầu riêng và cần cân nhắc về cấu trúc, nên không có đường dẫn di chuyển tự động. Thay vào đó, bạn có thể tuân theo tiến trình chung sau:

  1. Liên kết cấu trúc dữ liệu và các quy tắc bảo mật từ Cơ sở dữ liệu theo thời gian thực đến Cloud Firestore. Cả Cơ sở dữ liệu theo thời gian thực và Cloud Firestore đều dựa vào phương thức Xác thực Firebase, vì vậy, 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 là khác nhau. Bạn cần phải tính đến kỹ những sự phân biệt đó trước khi bắt đầu di chuyển dữ liệu sang CloudFirestore.

  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ể liên kết và di chuyển dữ liệu hiện có từ Cơ sở dữ liệu theo thời gian thực sang thực thể mới trên Cloud Firestore. Tuy nhiên, nếu đang sử dụng cả hai cơ sở dữ liệu trong ứng dụng của mình, thì bạn không cần di chuyển dữ liệu trong quá khứ ra khỏi Cơ sở dữ liệu theo thời gian thực.

  3. Phản chiếu dữ liệu mới lên Firestore theo thời gian thực. Sử dụng Hàm đám mây để 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 Cơ sở dữ liệu theo thời gian thực.

  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 Cơ sở dữ liệu theo thời gian thực cho dữ liệu đã di chuyển. Hãy xem xét các phiên bản ứng dụng vẫn được liên kết với Cơ sở dữ liệu theo thời gian thực cho dữ liệu đó và cách bạn dự định tiếp tục hỗ trợ cơ sở dữ liệu đó.

Nhớ tính đến chi phí thanh toán cho cả Cơ sở dữ liệu theo thời gian thựcCloud Firestore.

Lập bản đồ dữ liệu của bạn

Dữ liệu trong Cơ sở dữ liệu theo thời gian thực đượ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 các tài liệu, bộ sưu tập và các bộ sưu tập con. Nếu di chuyển một số dữ liệu từ Cơ sở dữ liệu theo thời gian thực 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 lưu ý

Nếu bạn di chuyển dữ liệu từ cây Cơ sở dữ liệu theo thời gian thực hiện có sang các tài liệu và bộ sưu tập của Cloud Firestore, hãy lưu ý những điểm khác biệt lớn sau đây giữa các cơ sở dữ liệu có thể ảnh hưởng đến cách bạn sắp xếp dữ liệu trong Cloud Firestore:

  • Truy vấn nông giúp bạn 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 có độ chi tiết cao hơn và giảm nhu cầu có 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 nữa và sẽ mang lại hiệu quả cao hơn.
  • Chi phí thanh toán khác nhau giữa Cơ sở dữ liệu theo thời gian thực và Cloud Firestore. Trong nhiều trường hợp, Cloud Firestore có thể tốn kém hơn so với Cơ sở dữ liệu theo thời gian thực, đặc biệt là khi bạn phụ thuộc vào nhiều thao tác nhỏ. Hãy cân nhắc giảm số lượng thao tác trên cơ sở dữ liệu và tránh các lượt ghi không cần thiết. Tìm hiểu thêm về sự khác biệt về thanh toán giữa Cơ sở dữ liệu theo thời gian thực và Cloud Firestore.

Những phương pháp hay nhất trong thực tế

Ví dụ sau đây phản ánh một số điều bạn có thể cân nhắc 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 lượt đọc nông và cải thiện khả năng truy vấn cho nhiều cấu trúc dữ liệu tự nhiên hơn so với Cơ sở dữ liệu theo thời gian thực.

Hãy cân nhắc dùng 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 khắp thế giới. Vì Cơ sở dữ liệu theo thời gian thực thiếu các lượt đọc không sâu, nên có thể bạn đã phải xây dựng cấu trúc dữ liệu thành 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 lượt đọc nông, vì vậy, việc truy vấn các tài liệu trong một bộ sưu tập 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ề mốc trong bộ sưu tập con:

// /cities/$CITY_ID
{
  name: "New York",
  population: 8000000,
  capital: False,
  landmarks: [... subcollection ...]
}

Các 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ữ các mốc địa điểm dưới dạng một bộ sưu tập con, giúp nhỏ gọn từng tài liệu thành phố, thay vì làm đầy tài liệu bằng các danh sách lồng nhau.

Các chức năng truy vấn nâng cao của Cloud Firestore giúp giảm bớt 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ủ đô theo thứ tự dân số. Trong Cơ sở dữ liệu theo thời gian thực, cách hiệu quả nhất để làm việc này là duy trì một danh sách riêng 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 Các giải pháp của chúng tôi để có thêm ý tưởng về cách xây dựng 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 Quy tắc bảo mật của Cloud Firestore cho ứng dụng Android, Apple hay 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 đang bảo mật dữ liệu của mình trong Cloud Firestore cũng như Cơ sở dữ liệu theo thời gian thực. Quy trình xác thực người dùng do tính năng Xác thực cho cả hai cơ sở dữ liệu xử lý. Vì vậy, bạn không cần thay đổi phương thức triển khai 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 lưu ý

  • SDK dành cho thiết bị di động và web sử dụng Quy tắc bảo mật của Cloud Firestore, trong khi SDK máy chủ sử dụng giải pháp Quản lý quyền truy cập danh tính (IAM) để bảo mật dữ liệu.
  • Các quy tắc bảo mật của Cloud Firestore sẽ không phân tầng trừ phi bạn dùng ký tự đại diện. Tài liệu và bộ sưu tập không kế thừa các quy tắc.
  • Bạn không cần xác thực riêng dữ liệu nữa (như đã thực hiện trong Cơ sở dữ liệu theo thời gian thực).
  • 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 phù hợp đối với tất cả dữ liệu mà 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 các mô hình bảo mật và dữ liệu của Cloud Firestore, bạn có thể bắt đầu thêm dữ liệu. Nếu bạn định truy vấn dữ liệu trong quá khứ sau khi di chuyển ứng dụng từ Cơ sở dữ liệu theo thời gian thực sang Cloud Firestore, hãy thêm bản xuất dữ liệu cũ vào cơ sở dữ liệu mới của bạn trên Cloud Firestore. Nếu dự định sử dụng cả Cơ sở dữ liệu theo thời gian thực và Cloud Firestore trong ứng dụng của mình, thì 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 có thể thêm dữ liệu trong quá khứ. Nếu bạn thêm đồng thời dữ liệu mới vào cả hai cơ sở dữ liệu, 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 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ừ Cơ sở dữ liệu theo thời gian thực hoặc dùng một bản sao lưu gần đây.
    1. Chuyển đến phần Cơ sở dữ liệu theo thời gian thực trong bảng điều khiển của Firebase.
    2. Từ thẻ Data (Dữ liệu), hãy chọn nút cấp cơ sở của cơ sở dữ liệu rồi chọn Export JSON (Xuất JSON) trên trình đơn.
  2. Tạo cơ sở dữ liệu mới trong Cloud Firestore và thêm dữ liệu của bạn.

    Hãy xem xét 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ó thể xem xét tập lệnh của bạn hoặc đưa ra lời khuyên cho tình huống 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 dùng các hoạt động 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 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 quá trình ghi vào Cloud Firestore bất cứ khi nào ứng dụng ghi vào Cơ sở dữ liệu theo thời gian thực. Đảm bảo rằng Cloud Firestore ưu tiên dữ liệu mới từ Cloud Functions so với mọi lượt ghi mà bạn thực hiện trong quá trình di chuyển dữ liệu trong quá khứ.

Tạo 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 Cơ sở dữ liệu theo thời gian thực. Tìm hiểu thêm về điều kiện kích hoạt Cơ sở dữ liệu theo thời gian thực 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 của mình, hãy nhớ 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 Quy tắc bảo mật của Cloud Firestore.

  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 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 đổi hàm của bạn để ghi vào một cơ sở dữ liệu hoặc xoá hoàn toàn hàm đó và bắt đầu ngừng sử dụng 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 Cơ sở dữ liệu theo thời gian thực. Cách bạn xử lý vấn đề này cho ứng dụng phụ thuộc vào nhu cầu cụ thể và người dùng của bạn.

  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 IAM hoặc Quy tắc bảo mật của Cloud Firestore.