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, i wykorzystywać zalety każdego z tych rozwiązań bazodanowych zgodnie ze swoimi potrzebami. Możesz na przykład wykorzystać obsługę 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.

Przenoszę dane do: Cloud Firestore

Jeśli zdecydujesz się przenieść część danych z Realtime Database do Cloud Firestore, weź pod uwagę ten proces. Każda baza danych ma unikalne potrzeby i wymagania strukturalne, dlatego nie ma automatycznej ścieżki migracji. Zamiast tego możesz wykonać te czynności:

  1. Zmapuj strukturę danych i reguły zabezpieczeń z Realtime Database na 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 zabezpieczeń i model danych są jednak inne i ważne jest, aby dokładnie uwzględnić te różnice przed rozpoczęciem przenoszenia danych do Cloud Firestore.

  2. Przenieś dane historyczne. Podczas konfigurowania nowej struktury danych w Cloud Firestore możesz mapować i przenosić 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 bazy Realtime Database.

  3. Odzwierciedlaj nowe dane w Firestore w czasie rzeczywistym. Użyj Cloud Functions, aby zapisywać nowe dane w nowej bazie danych Cloud Firestore, gdy są 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ę nad wersjami aplikacji, które nadal są powiązane z Realtime Database w przypadku tych danych, i nad tym, jak planujesz nadal je obsługiwać.

Pamiętaj o uwzględnieniu kosztów rozliczeniowych zarówno w przypadku Realtime Database, jak i Cloud Firestore.

Mapowanie danych

Dane w Realtime Database są uporządkowane w postaci pojedynczego drzewa, natomiast Cloud Firestore obsługuje bardziej przejrzyste hierarchie danych za pomocą dokumentów, kolekcji i podkolekcji. Jeśli przenosisz część danych z Realtime Database do Cloud Firestore, warto 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 głównych różnicach między bazami danych, które mogą mieć wpływ na strukturę danych w Cloud Firestore:

  • Płytkie zapytania zapewniają większą elastyczność w hierarchicznych strukturach danych.
  • Złożone zapytania zapewniają większą szczegółowość i zmniejszają potrzebę duplikowania danych.
  • Kursory zapytania 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ę między Realtime Database a Cloud Firestore. W wielu przypadkach Cloud Firestore może być droższy niż Realtime Database, zwłaszcza jeśli wykonujesz wiele małych operacji. Rozważ zmniejszenie liczby operacji na bazie danych i unikaj niepotrzebnych zapisów. Dowiedz się więcej o różnicach w płatnościach między Realtime Database a Cloud Firestore.

Sprawdzone metody w praktyce

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

Wyobraź sobie aplikację z przewodnikiem po mieście, która pomaga użytkownikom znajdować znane miejsca w miastach na całym świecie. Ponieważ w Realtime Database nie ma płytkich odczytów, konieczne może być uporządkowanie danych 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 odczyty płytkie, więc zapytanie o dokumenty w kolekcji nie pobiera danych z podkolekcji. W związku z tym informacje o atrakcjach możesz przechowywać w podkolekcji:

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

Dokumenty mogą mieć maksymalnie 1 MB, co jest kolejnym powodem, dla którego warto przechowywać punkty orientacyjne jako podkolekcję, aby każdy dokument miasta był mały, a nie powiększał się przez zagnieżdżone listy.

Zaawansowane funkcje wysyłania zapytań w Cloud Firestore zmniejszają potrzebę duplikowania danych w przypadku typowych wzorców dostępu. Załóżmy, że w aplikacji z przewodnikiem po mieście jest ekran, na którym wyświetlane są wszystkie stolice uporządkowane według liczby ludności. W Realtime Database najskuteczniejszym sposobem jest utrzymywanie osobnej listy stolic, która powiela dane z listy cities, w ten sposób:

{
   cities: {
    // ...
   },

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

W Cloud Firestore możesz wyrazić listę stolic w kolejności według liczby ludności jako jedno zapytanie:

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

Więcej informacji o modelu danych Cloud Firestore znajdziesz w sekcji Rozwiązania. Znajdziesz tam też więcej pomysłów na strukturę bazy danych Cloud Firestore.

Zabezpieczanie danych

Niezależnie od tego, czy używasz Cloud Firestore Security Rules na Androidzie, urządzeniach Apple czy w klientach internetowych, czy też Identity Access Management (IAM) na serwerach, pamiętaj o zabezpieczeniu danych w Cloud Firestore i Realtime Database. Uwierzytelnianie użytkowników jest obsługiwane przez Authentication w przypadku obu baz danych, więc nie musisz zmieniać implementacji Authentication, 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 stron internetowych używają Cloud Firestore Security Rules, a pakiety SDK na serwery używają Identity Access Management (IAM) do zabezpieczania danych.
  • Cloud Firestore Security Rules nie są kaskadowe, chyba że użyjesz symbolu wieloznacznego. Dokumenty i kolekcje nie dziedziczą reguł w żaden inny sposób.
  • 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 usługi Cloud Firestore

Po zmapowaniu struktur danych i zabezpieczeń na modele danych i zabezpieczeń Cloud Firestore możesz zacząć dodawać dane. Jeśli po przeniesieniu aplikacji z Realtime Database do Cloud Firestore planujesz wysyłać zapytania do danych historycznych, dodaj eksport starych danych do nowej bazy danych Cloud Firestore. Jeśli planujesz używać w aplikacji zarówno Realtime Database, jak i Cloud Firestore, możesz pominąć ten krok.

Aby uniknąć zastąpienia nowych danych starymi, warto najpierw dodać dane historyczne. Jeśli dodajesz nowe dane do obu baz danych jednocześnie, jak opisano w następnym kroku, upewnij się, że dajesz pierwszeństwo nowym danym dodanym do Cloud Firestore przez Cloud Functions.

Aby przenieść dane historyczne do Cloud Firestore, wykonaj te czynności:

  1. Wyeksportuj dane z usługi 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ł bazy danych na poziomie głównym i w menu kliknij Eksportuj JSON.
  2. Utwórz nową bazę danych w Cloud Firestore i dodaj do niej dane.

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

    • Napisz niestandardowy skrypt, który przeniesie dane za Ciebie. Nie możemy udostępnić szablonu takiego skryptu, ponieważ każda baza danych ma unikalne potrzeby, ale eksperci Cloud Firestore na naszym kanale Slack lub na Stack Overflow mogą sprawdzić Twój skrypt lub udzielić porady dotyczącej Twojej 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 artykule Pierwsze kroki.
    • Aby przyspieszyć migrację dużych zbiorów danych, użyj zapisu zbiorczego i wyślij do 500 operacji w jednym żądaniu sieciowym.
    • Aby nie przekroczyć limitów liczby żądań Cloud Firestore, ogranicz liczbę operacji do 500 zapisów na sekundę w przypadku każdej kolekcji.

Dodaj nowe dane do: Cloud Firestore

Aby zachować spójność baz danych, dodawaj nowe dane do obu baz danych w czasie rzeczywistym. Użyj Cloud Functions, aby wywołać zapis do Cloud Firestore, gdy klient zapisuje do Realtime Database. Upewnij się, że Cloud Firestore daje pierwszeństwo nowym danym pochodzącym z Cloud Functions przed zapisami, które wykonujesz w ramach 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 zapisze dane w Realtime Database. Dowiedz się więcej o regułach Realtime Database w przypadku 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 niektórych danych, uwzględnij wszystkie skonfigurowane funkcje tworzenia kopii lustrzanych danych i sprawdź poprawność Cloud Firestore Security Rules.

  1. Jeśli używasz Cloud Functions do zachowania zgodności między bazami danych, upewnij się, że nie duplikujesz operacji zapisu w obu bazach danych w pętli. Przełącz funkcję, 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 nadal są powiązane z Realtime Database. Sposób, w jaki rozwiążesz ten problem w swojej aplikacji, zależy od Twoich konkretnych potrzeb i użytkowników.

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