Użyj Cloud Firestore z bazą danych Firebase Realtime

W swojej aplikacji możesz używać zarówno bazy danych Firebase Realtime Database, jak i Cloud Firestore i wykorzystywać zalety każdego rozwiązania bazodanowego do swoich potrzeb. Na przykład możesz chcieć wykorzystać obsługę obecności w bazie danych Realtime Database, jak opisano w artykule Tworzenie obecności w Cloud Firestore .

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

Przenoszenie danych do Cloud Firestore

Jeśli zdecydowałeś, że chcesz przenieść część swoich danych z bazy danych Realtime Database do Cloud Firestore, rozważ następujący sposób działania. Ponieważ każda baza danych ma unikalne potrzeby i uwarunkowania strukturalne, nie istnieje zautomatyzowana ścieżka migracji. Zamiast tego możesz śledzić ten ogólny postęp:

  1. Mapuj strukturę danych i reguły bezpieczeństwa z bazy danych Realtime Database do Cloud Firestore. Zarówno baza danych Realtime, jak i Cloud Firestore korzystają z uwierzytelniania Firebase, więc nie musisz zmieniać uwierzytelniania użytkowników w swojej aplikacji. Jednak zasady bezpieczeństwa i model danych są różne i ważne jest, aby dokładnie uwzględnić te rozbieżności 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 bazy danych Realtime Database do nowej instancji Cloud Firestore. Jeśli jednak w aplikacji używasz obu baz danych, nie musisz przenosić danych historycznych z Bazy danych czasu rzeczywistego.

  3. Kopiuj nowe dane do Firestore w czasie rzeczywistym. Użyj funkcji Cloud Functions, aby zapisać nowe dane w nowej bazie danych Cloud Firestore po jej dodaniu do bazy danych czasu rzeczywistego.

  4. Ustaw Cloud Firestore jako główną bazę danych dla migrowanych danych. Po migracji części danych użyj Cloud Firestore jako podstawowej bazy danych i zmniejsz wykorzystanie bazy danych czasu rzeczywistego w przypadku migrowanych danych. Zastanów się nad wersjami aplikacji, które są nadal powiązane z bazą danych czasu rzeczywistego pod kątem tych danych, i nad planem ich dalszego wspierania.

Upewnij się, że uwzględniłeś koszty rozliczeniowe zarówno dla Realtime Database , jak i Cloud Firestore .

Mapuj swoje dane

Dane w bazie danych Realtime Database mają strukturę pojedynczego drzewa, natomiast Cloud Firestore obsługuje bardziej przejrzyste hierarchie danych w postaci dokumentów, kolekcji i podkolekcji. Jeśli przeniesiesz część danych z bazy danych Realtime Database do Cloud Firestore, możesz rozważyć inną architekturę swoich danych.

Główne różnice do rozważenia

Jeśli przenosisz dane z istniejącego drzewa bazy danych czasu rzeczywistego do dokumentów i kolekcji Cloud Firestore, pamiętaj o następujących głównych różnicach między bazami danych, które mogą mieć wpływ na strukturę danych w Cloud Firestore:

  • Płytkie zapytania oferują większą elastyczność w hierarchicznych strukturach danych.
  • Złożone zapytania zapewniają większą szczegółowość i zmniejszają potrzebę duplikowania danych.
  • Kursory zapytań oferują bardziej niezawodną paginację.
  • Transakcje nie wymagają już wspólnego katalogu głównego dla wszystkich danych i są bardziej wydajne.
  • Koszty rozliczeniowe różnią się w przypadku bazy danych Realtime Database i Cloud Firestore. W wielu przypadkach Cloud Firestore może być droższy niż baza danych Realtime, szczególnie jeśli polegasz na wielu małych operacjach. Rozważ zmniejszenie liczby operacji na bazie danych i uniknięcie niepotrzebnych zapisów. Dowiedz się więcej o różnicach w rozliczeniach między bazą danych Realtime Database a Cloud Firestore.

Najlepsze praktyki w działaniu

Poniższy przykład odzwierciedla niektóre kwestie, które można rozważyć podczas przenoszenia danych między bazami danych. Możesz wykorzystać płytkie odczyty i ulepszone możliwości wykonywania zapytań, aby uzyskać bardziej naturalne struktury danych niż te, które były używane z bazą danych Realtime.

Rozważ aplikację przewodnika po mieście, która pomaga użytkownikom znajdować godne uwagi punkty orientacyjne w miastach na całym świecie. Ponieważ w bazie danych czasu rzeczywistego brakuje płytkich odczytów, konieczne mogło być uporządkowanie danych w dwóch węzłach najwyższego poziomu w następujący 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 ma płytkie odczyty, więc zapytania o dokumenty w kolekcji nie pobierają danych z podkolekcji. W związku z tym możesz przechowywać informacje o punktach orientacyjnych w podkolekcji:

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

Dokumenty mają maksymalny rozmiar 1 MB, co jest kolejnym powodem przechowywania punktów orientacyjnych jako podkolekcji, dzięki czemu każdy dokument miejski powinien być niewielki, a nie rozdęte dokumenty z zagnieżdżonymi listami.

Zaawansowane możliwości zapytań Cloud Firestore zmniejszają potrzebę duplikowania danych w celu uzyskania typowych wzorców dostępu. Rozważmy na przykład ekran aplikacji przewodnika po mieście, który pokazuje wszystkie stolice uporządkowane według liczby ludności. W bazie danych czasu rzeczywistego najskuteczniejszym sposobem na osiągnięcie tego jest utworzenie osobnej listy stolic, która powiela dane z listy cities w następujący sposób:

{
   cities: {
    // ...
   },

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

W Cloud Firestore możesz wyrazić listę stolic według liczby ludności w jednym zapytaniu:

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

Przeczytaj więcej o modelu danych Cloud Firestore i zapoznaj się z naszymi Rozwiązaniami , aby uzyskać więcej pomysłów na strukturę bazy danych Cloud Firestore.

Zabezpiecz swoje dane

Niezależnie od tego, czy korzystasz z reguł bezpieczeństwa Cloud Firestore dla klientów z systemem Android, Apple lub sieci Web, czy też z zarządzania dostępem do tożsamości (IAM) dla serwerów, upewnij się, że zabezpieczasz swoje dane w Cloud Firestore oraz w bazie danych czasu rzeczywistego. Uwierzytelnianie użytkowników jest obsługiwane przez uwierzytelnianie dla obu baz danych, więc nie musisz zmieniać implementacji uwierzytelniania, gdy zaczniesz korzystać z Cloud Firestore.

Główne różnice do rozważenia

  • Mobilne i internetowe zestawy SDK korzystają z reguł bezpieczeństwa Cloud Firestore, podczas gdy serwerowe zestawy SDK korzystają z zarządzania dostępem do tożsamości (IAM) w celu zabezpieczenia danych.
  • Reguły bezpieczeństwa Cloud Firestore nie działają kaskadowo, chyba że użyjesz symbolu wieloznacznego. Dokumenty i kolekcje w inny sposób nie dziedziczą reguł.
  • Nie musisz już osobno sprawdzać poprawności danych (jak to miało miejsce 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.

Przenieś dane historyczne do Cloud Firestore

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

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

Aby przeprowadzić migrację danych historycznych do Cloud Firestore, wykonaj następujące kroki:

  1. Eksportuj swoje dane z bazy danych czasu rzeczywistego lub skorzystaj z ostatniej kopii zapasowej .
    1. Przejdź do sekcji Baza danych czasu rzeczywistego w konsoli Firebase.
    2. Na karcie Dane wybierz węzeł główny bazy danych i wybierz z menu opcję Eksportuj JSON .
  2. Utwórz nową bazę danych w Cloud Firestore i dodaj swoje dane .

    Podczas przenoszenia niektórych danych do Cloud Firestore rozważ następujące strategie:

    • Napisz niestandardowy skrypt, który przeniesie Twoje dane za Ciebie. Chociaż nie możemy zaoferować szablonu dla tego skryptu, ponieważ każda baza danych będzie miała unikalne potrzeby, eksperci Cloud Firestore na naszym kanale Slack lub Stack Overflow mogą przejrzeć Twój skrypt lub zaoferować porady dotyczące Twojej konkretnej sytuacji.
    • Użyj pakietów SDK serwera (Node.js, Java, Python lub Go), aby zapisywać dane bezpośrednio w Cloud Firestore. Aby uzyskać instrukcje dotyczące konfigurowania zestawów SDK serwera, zobacz wprowadzenie .
    • Aby przyspieszyć migrację dużych danych, użyj zapisów wsadowych i wyślij do 500 operacji w jednym żądaniu sieciowym.
    • Aby nie przekraczać limitów szybkości Cloud Firestore , ogranicz operacje do 500 zapisów na sekundę dla każdej kolekcji.

Dodaj nowe dane do Cloud Firestore

Aby zachować równość pomiędzy bazami danych, dodawaj nowe dane do obu baz danych w czasie rzeczywistym. Użyj Cloud Functions, aby uruchomić zapis w Cloud Firestore za każdym razem, gdy klient zapisuje dane w bazie danych Realtime. Upewnij się, że Cloud Firestore daje pierwszeństwo nowym danym pochodzącym z Cloud Functions przed wszelkimi zapisami dokonywanymi podczas migracji danych historycznych.

Utwórz funkcję zapisywania nowych lub zmienianych danych w Cloud Firestore za każdym razem, gdy klient zapisuje dane w bazie danych Realtime. Dowiedz się więcej o wyzwalaczach bazy danych czasu rzeczywistego dla Cloud Functions.

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

Jeśli zdecydowałeś się używać Cloud Firestore jako podstawowej bazy danych dla niektórych swoich danych, upewnij się, że uwzględniłeś wszystkie skonfigurowane funkcje dublowania danych i zatwierdź reguły bezpieczeństwa Cloud Firestore.

  1. Jeśli korzystasz z Cloud Functions do utrzymywania parzystości między bazami danych, upewnij się, że nie duplikujesz w pętli operacji zapisu w obu bazach danych. Zmień funkcję tak, aby zapisywała w pojedynczej bazie danych lub całkowicie ją usuń i rozpocznij wycofywanie funkcji zapisu migrowanych danych w aplikacjach nadal powiązanych z bazą danych czasu rzeczywistego. Sposób, w jaki sobie z tym poradzisz, zależy od Twoich konkretnych potrzeb i użytkowników.

  2. Sprawdź, czy Twoje dane są odpowiednio zabezpieczone. Sprawdź reguły bezpieczeństwa Cloud Firestore lub konfigurację uprawnień.