Używanie Cloud Firestore z Bazą danych czasu rzeczywistego Firebase

W aplikacji możesz używać zarówno Firebase Realtime Database, jak i Cloud Firestore. Wykorzystaj zalety każdego z tych rozwiązań, aby dopasować je do swoich potrzeb. Możesz na przykład skorzystać z obsługi obecności w Realtime Database, jak opisano w artykule Tworzenie obecności w Cloud Firestore.

Dowiedz się więcej o różnicach między bazami danych.

Przenoszenie danych do Cloud Firestore

Jeśli zdecydujesz się przenieść część danych z Realtime Database do Cloud Firestore, rozważ wykonanie tych czynności. Każda baza danych ma unikalne potrzeby i wymagania strukturalne, dlatego nie ma automatycznej ścieżki migracji. Zamiast tego możesz wykonać te ogólne kroki:

  1. Zmapuj strukturę danych i reguły bezpieczeństwa z Realtime Database do Cloud Firestore. Zarówno Realtime Database jak i Cloud Firestore korzystają z uwierzytelniania Firebase, więc nie musisz zmieniać uwierzytelniania użytkowników w aplikacji. Reguły bezpieczeństwa i model danych są jednak inne, dlatego przed rozpoczęciem przenoszenia danych do Cloud Firestore należy dokładnie uwzględnić te różnice.

  2. Przenieś dane historyczne. Podczas konfigurowania nowej struktury danych w Cloud Firestore możesz zmapować i przenieść istniejące dane z Realtime Database do nowej instancji Cloud Firestore. Jeśli jednak używasz w aplikacji obu baz danych, nie musisz przenosić danych historycznych z Realtime Database.

  3. Kopiuj nowe dane do Firestore w czasie rzeczywistym. Użyj Cloud Functions, aby zapisywać nowe dane w nowej bazie danych Cloud Firestore , gdy są one dodawane do Realtime Database.

  4. Ustaw Cloud Firestore jako główną bazę danych dla przeniesionych danych. Po przeniesieniu części danych używaj Cloud Firestore jako głównej bazy danych i ogranicz korzystanie z Realtime Database w przypadku przeniesionych danych. Zastanów się, jak będziesz nadal obsługiwać wersje aplikacji, które są nadal powiązane z Realtime Database bazą danych czasu rzeczywistego.

Pamiętaj, aby uwzględnić koszty rozliczeniowe zarówno Realtime Database jak i Cloud Firestore.

Mapowanie danych

Dane w Realtime Database są ustrukturyzowane jako pojedyncze drzewo, a Cloud Firestore obsługuje bardziej wyraźne hierarchie danych za pomocą dokumentów, kolekcji i podkolekcji. Jeśli przenosisz część danych z Realtime Database do Cloud Firestore, możesz rozważyć inną architekturę danych.

Najważniejsze różnice, które należy wziąć pod uwagę

Jeśli przenosisz dane z istniejącego drzewa Realtime Database do dokumentów i kolekcji Cloud Firestore , pamiętaj o tych najważniejszych różnicach między bazami danych, które mogą mieć wpływ na sposób strukturyzowania danych w Cloud Firestore:

  • Płytkie zapytania zapewniają większą elastyczność w przypadku hierarchicznych struktur danych.
  • Złożone zapytania zapewniają większą szczegółowość i zmniejszają potrzebę duplikowania danych.
  • Kursory zapytań zapewniają bardziej niezawodne stronicowanie.
  • Transakcje nie wymagają już wspólnego katalogu głównego dla wszystkich danych i są bardziej wydajne.
  • Koszty rozliczeniowe różnią się w zależności od tego, czy używasz Realtime Database, czy Cloud Firestore. W wielu przypadkach Cloud Firestore może być droższa niż Realtime Database, zwłaszcza jeśli korzystasz z wielu małych operacji. Rozważ zmniejszenie liczby operacji w bazie danych i unikanie niepotrzebnych zapisów. Dowiedz się więcej o różnicach w rozliczeniach między Realtime Database a Cloud Firestore.

Sprawdzone metody w praktyce

Poniższy przykład odzwierciedla niektóre kwestie, które możesz wziąć pod uwagę podczas przenoszenia danych między bazami danych. Możesz korzystać z płytkich odczytów i ulepszonych możliwości wykonywania zapytań, aby tworzyć bardziej naturalne struktury danych niż te, których używasz w Realtime Database.

Rozważ aplikację przewodnika po mieście, która pomaga użytkownikom znajdować ciekawe miejsca w miastach na całym świecie. Ponieważ Realtime Database nie obsługuje płytkich odczytów, być może trzeba było ustrukturyzować dane w 2 węzłach najwyższego poziomu w ten sposób:

// /cities/$CITY_KEY
{
  name: "New York",
  population: 8000000,
  capital: False
}

// /city-landmark/$CITY_KEY/$LANDMARK_KEY
{
  name: "Empire State Building",
  category: "Architecture"
}

Cloud Firestore obsługuje płytkie odczyty, więc wysyłanie zapytań o dokumenty w kolekcji nie powoduje pobierania danych z podkolekcji. Dzięki temu możesz przechowywać informacje o ciekawych miejscach w podkolekcji:

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

Maksymalny rozmiar dokumentu to 1 MB. Jest to kolejny powód, aby przechowywać ciekawe miejsca jako podkolekcję, dzięki czemu każdy dokument miasta będzie mały, a nie będzie zawierał zagnieżdżonych list.

Zaawansowane możliwości wykonywania zapytań w Cloud Firestore zmniejszają potrzebę duplikowania danych w przypadku typowych wzorców dostępu. Rozważ na przykład ekran w aplikacji przewodnika po mieście, który pokazuje wszystkie stolice uporządkowane według liczby mieszkańców. W Realtime Database najskuteczniejszym sposobem na to jest utrzymywanie oddzielnej listy stolic, która duplikuje dane z listy cities w ten sposób:

{
   cities: {
    // ...
   },

   capital-cities: {
     // ...
   }
}

W Cloud Firestore możesz wyrazić listę stolic uporządkowanych według liczby mieszkańców jako pojedyncze zapytanie:

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

Dowiedz się więcej o modelu danych Cloud Firestore i zapoznaj się z naszymi rozwiązaniami, aby uzyskać więcej pomysłów na to, jak ustrukturyzować bazę danych Cloud Firestore.

Zabezpiecz swoje dane

Niezależnie od tego, czy używasz Cloud Firestore Security Rules dla klientów Androida, Apple czy internetowych, czy też zarządzania dostępem i tożsamością (IAM) dla serwerów, zadbaj o zabezpieczenie danych zarówno w Cloud Firestore, jak i w Realtime Database. Uwierzytelnianie użytkowników jest obsługiwane przez uwierzytelnianie w obu bazach danych, więc nie musisz zmieniać implementacji uwierzytelniania, gdy zaczniesz korzystać z Cloud Firestore.

Najważniejsze różnice, które należy wziąć pod uwagę

  • Pakiety SDK na urządzenia mobilne i do internetu używają Cloud Firestore Security Rules, a pakiety SDK serwera używają zarządzania dostępem i tożsamością (IAM) do zabezpieczania danych.
  • Cloud Firestore Security Rules nie są kaskadowe, chyba że używasz symbolu wieloznacznego. Dokumenty i kolekcje nie dziedziczą reguł.
  • Nie musisz już osobno weryfikować danych (jak w Realtime Database).
  • Cloud Firestore sprawdza reguły przed wykonaniem zapytania, aby upewnić się że użytkownik ma odpowiedni dostęp do wszystkich danych zwracanych przez zapytanie.

Przenoszenie danych historycznych do Cloud Firestore

Gdy zmapujesz struktury danych i zabezpieczeń do Cloud Firestore's modeli danych i zabezpieczeń, możesz zacząć dodawać dane. Jeśli po przeniesieniu aplikacji z Realtime Database do Cloud Firestore planujesz wysyłać zapytania o dane historyczne, dodaj eksport starych danych do nowej Cloud Firestore bazy danych. Jeśli planujesz używać w aplikacji zarówno Realtime Database i Cloud Firestore, możesz pominąć ten krok.

Aby uniknąć zastąpienia nowych danych starymi, możesz najpierw dodać dane historyczne. Jeśli dodajesz nowe dane do obu baz danych jednocześnie, jak opisano w następnym kroku, upewnij się, że dane dodane do Cloud Firestore przez Cloud Functions mają pierwszeństwo przed zapisami dokonywanymi podczas migracji danych historycznych.

Aby przenieść dane historyczne do Cloud Firestore:

  1. Wyeksportuj dane z Realtime Database lub użyj ostatniej kopii zapasowej.
    1. W konsoli Firebase kliknij Bazy danych i miejsce na dane > Baza danych czasu rzeczywistego.
    2. Na karcie Dane wybierz węzeł główny bazy danych i w menu kliknij Eksportuj JSON.
  2. Utwórz nową bazę danych w Cloud Firestore i dodaj dane.

    Podczas przenoszenia części danych do Cloud Firestore rozważ te strategie:

    • Napisz niestandardowy skrypt, który przeniesie dane. Nie możemy udostępnić szablonu tego skryptu, ponieważ każda baza danych ma unikalne potrzeby. Cloud Firestore Eksperci na naszym kanale Slack lub w Stack Overflow mogą jednak sprawdzić Twój skrypt lub udzielić Ci porady w konkretnej sytuacji.
    • Użyj pakietów SDK serwera (Node.js, Java, Python lub Go), aby zapisywać dane bezpośrednio w Cloud Firestore. Instrukcje konfigurowania pakietów SDK serwera znajdziesz w przewodniku Pierwsze kroki.
    • Aby przyspieszyć migrację dużych ilości danych, użyj zapisów zbiorczych i wysyłaj do 500 operacji w jednym żądaniu sieciowym.
    • Aby nie przekraczać limitów Cloud Firestore szybkości, ogranicz liczbę operacji do 500 zapisów na sekundę w przypadku każdej kolekcji.

Dodawanie nowych danych do Cloud Firestore

Aby zachować spójność między bazami danych, dodawaj nowe dane do obu baz danych w czasie rzeczywistym. Użyj Cloud Functions, aby wywoływać zapis w Cloud Firestore , gdy klient zapisuje dane w Realtime Database. Upewnij się, że Cloud Firestore przyznaje pierwszeństwo nowym danym pochodzącym z Cloud Functions przed zapisami dokonywanymi podczas migracji danych historycznych.

Utwórz funkcję, która będzie zapisywać nowe lub zmieniające się dane w Cloud Firestore za każdym razem, gdy klient zapisuje dane w Realtime Database. Dowiedz się więcej o Realtime Database wyzwalaczach dla Cloud Functions.

Ustaw Cloud Firestore jako główną bazę danych dla przeniesionych danych

Jeśli zdecydujesz się używać Cloud Firestore jako głównej bazy danych dla części danych, pamiętaj o uwzględnieniu wszystkich skonfigurowanych funkcji kopiowania danych i sprawdź Cloud Firestore Security Rules.

  1. Jeśli do zachowania spójności między bazami danych używasz Cloud Functions, upewnij się, że nie duplikujesz operacji zapisu w obu bazach danych w pętli. Zmień funkcję tak, aby zapisywała dane w jednej bazie danych, lub całkowicie usuń funkcję i zacznij wycofywać funkcję zapisu dla przeniesionych danych w aplikacjach, które są nadal powiązane z Realtime Database. Sposób, w jaki to zrobisz, zależy od Twoich konkretnych potrzeb i potrzeb użytkowników.

  2. Sprawdź, czy dane są odpowiednio zabezpieczone. Sprawdź Cloud Firestore Security Rules lub konfigurację IAM.