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, và tận dụng các 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 sự hỗ trợ của Cơ sở dữ liệu theo thời gian thực cho việc hiện diện, như được nêu trong Xây dựng sự hiện diện trong Cloud Firestore.

Tìm hiểu thêm về điểm 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 quy trình sau. Vì mỗi cơ sở dữ liệu đều có các nhu cầu riêng biệt và các cân nhắc về cấu trúc, không có khả năng đườ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, do đó, bạn không cần thay đổi phương thức xác thực người dùng cho ứng dụng. Tuy nhiên, có sự khác biệt giữa các quy tắc bảo mật và mô hình dữ liệu và điều quan trọng là phải cẩn thận tính đến những khác biệt đó trước khi bắt đầu di chuyển dữ liệu sang Đám mây 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ể 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 Cloud Firestore mới thực thể. 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 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 Cloud Functions để ghi dữ liệu mới vào Cloud Firestore mới khi đượ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 . Xem xét các phiên bản ứng dụng vẫn gắn liền 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ợ dữ liệu.

Đảm bảo bạn 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ợ các 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à tập hợp con. Nếu bạn 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, bạn nên cân nhắc một cấu trúc khác cho dữ liệu của bạn.

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 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 những cơ sở dữ liệu có thể ảnh hưởng đến cách bạn sắp xếp cấu trúc 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.
  • Truy vấn phức tạp cung cấp chi tiết hơn và giảm nhu cầ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.
  • Giao dịch không còn đòi hỏi một gốc chung cho tất cả dữ liệu của bạn nữa và thường một cách hiệu quả.
  • 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 trong nhiều trường hợp, Cloud Firestore có thể tốn kém hơn cơ sở dữ liệu theo thời gian thực, đặc biệt nếu bạn phụ thuộc 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 trong 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ố yếu tố mà bạn có thể cân nhắc khi sử dụng chuyển dữ liệu giữa các cơ sở dữ liệu. Bạn có thể tận dụng các chỉ số đọc nông và khả năng truy vấn nhiều cấu trúc dữ liệu tự nhiên hơn so với khả năng bạn có thể đã sử dụng với Cơ sở dữ liệu theo thời gian thực.

Cân nhắc việc cung cấp một ứng dụng hướng dẫn trong thành phố giúp người dùng tìm thấy các địa danh nổi bật trong thành phố trên khắp thế giới. Vì Cơ sở dữ liệu theo thời gian thực thiếu số lượt đọc không đáng kể, 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ó dữ liệu đọc không nông, nên việc truy vấn các 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ữ trong 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 từng tài liệu về thành phố ở dạng nhỏ, thay vì tăng kích thước tài liệu với 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 bớt nhu cầu dữ liệu trùng lặp 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 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 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ể trình bày danh sách các thành phố thủ đô theo thứ tự dưới dạng một truy vấn đơn:

db.collection('cities')
    .where('capital', '==', true)
    .orderBy('population')

Đọc thêm về mô hình dữ liệu Cloud Firestore và thực hiện hãy 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 của bạn

Bạn có đang sử dụng Quy tắc bảo mật của Cloud Firestore cho Ứng dụng web, Apple hoặc Android hoặc 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 cả dữ liệu của mình trong Cloud Firestore làm Cơ sở dữ liệu theo thời gian thực. Việc xác thực người dùng được xử lý bằng Xác thực cho cả hai cơ sở dữ liệu, nên bạn không cần thay đổi cách triển khai Xác thực khi bắt đầu thông qua 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 máy chủ SDK 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à tập hợ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ư cách bạn đã làm 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 người dùng có quyền truy cập phù hợp vào 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 bạn liên kết dữ liệu và cấu trúc bảo mật của mình với dữ liệu và mô hình bảo mật, bạn có thể bắt đầu thêm dữ liệu của mình. 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 vào Cloud Firestore, hãy thêm tệp xuất dữ liệu cũ vào Cơ sở dữ liệu Cloud Firestore. Nếu bạn 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, 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 có thể muốn thêm dữ liệu trong quá khứ trước tiên. 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 theo 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 từ Cơ sở dữ liệu theo thời gian thực hoặc sử dụng bản sao lưu gần đây.
    1. Chuyển đến Mục Cơ sở dữ liệu theo thời gian thực trong bảng điều khiển của Firebase.
    2. Trong 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 Xuất JSON từ 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ể một 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, Các chuyên gia về Cloud Firestore trên kênh Slack của chúng tôi hoặc trên Stack Overflow có thể xem lại kịch 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 lên Cloud Firestore. Để biết hướng dẫn về cách thiết lập SDK máy chủ, hãy xem Bắt đầu.
    • Để đẩy nhanh quá trình di chuyển dữ liệu lớn, hãy sử dụ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 số lượng yêu cầu của Cloud Firestore, giới hạn thao tá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

Để đảm bảo 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 trong 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 khách hàng ghi vào Cơ sở dữ liệu theo thời gian thực. Đảm bảo rằng Cloud Firestore sẽ ưu tiên dữ liệu mới 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 trong quá khứ.

Tạo một hàm để ghi dữ liệu mới hoặc thay đổi dữ liệu vào Cloud Firestore mỗi khi khách hà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 bạn, 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 các Quy tắc bảo mật của bạn trong 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 của mình, đảm bảo bạn không lặp lại 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 và bắt đầu ngừng sử dụng chức năng ghi cho dữ liệu được di chuyển trong các ứng dụng vẫn được 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 đối với ứng dụng của bạn tuỳ 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 quy tắc bảo mật của Cloud Firestore hoặc thiết lập IAM.