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

W swojej aplikacji możesz używać zarówno Bazy danych czasu rzeczywistego Firebase, jak i Cloud Firestore. Stosując zalety każdego z tych rozwiązań do obsługi swoich potrzeb. Możesz na przykład wykorzystać obsługę obecności w Bazie danych czasu rzeczywistego, 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 chcesz przenieść niektóre dane z Bazy danych czasu rzeczywistego do Cloud Firestore, rozważ opisany poniżej proces. Każda baza danych ma unikalne potrzeby i kwestie strukturalne, dlatego nie istnieje automatyczna ścieżka migracji. Zamiast tego możesz postępować zgodnie z tymi ogólnymi postępami:

  1. Zmapuj strukturę danych i reguły zabezpieczeń z Bazy danych czasu rzeczywistego na Cloud Firestore. Zarówno Baza danych czasu rzeczywistego, jak i Cloud Firestore korzystają z uwierzytelniania Firebase, więc nie musisz zmieniać sposobu uwierzytelniania użytkowników aplikacji. Reguły zabezpieczeń i model danych są jednak różne, dlatego ważne jest, aby uważnie uwzględniać te rozbieżności, zanim zaczniesz przenosić dane do Cloud Firestore.

  2. Przenoszenie danych historycznych. Podczas konfigurowania nowej struktury danych w Cloud Firestore możesz mapować i przenosić istniejące dane z Bazy danych czasu rzeczywistego 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. Powielaj nowe dane do Firestore w czasie rzeczywistym. Za pomocą Cloud Functions zapisuje nowe dane w nowej bazie danych Cloud Firestore, gdy są one dodawane do bazy danych czasu rzeczywistego.

  4. Ustaw Cloud Firestore jako podstawową bazę danych na potrzeby przeniesionych danych. Po przeniesieniu części danych używaj Cloud Firestore jako podstawowej bazy danych i ogranicz wykorzystanie tych danych. Zastanów się nad wersjami swojej aplikacji, które są nadal powiązane z bazą danych czasu rzeczywistego, i o tym, jak zamierzasz dalej je obsługiwać.

Pamiętaj o uwzględnieniu kosztów rozliczeń zarówno za Bazę danych czasu rzeczywistego, jak i Cloud Firestore.

Mapowanie danych

Dane w Bazie danych czasu rzeczywistego są uporządkowane jako jedno drzewo, natomiast Cloud Firestore obsługuje bardziej jawne hierarchie danych za pomocą dokumentów, kolekcji i kolekcji podrzędnych. W przypadku przenoszenia części danych z Bazy danych czasu rzeczywistego do Cloud Firestore warto rozważyć zastosowanie innej architektury.

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 tych głównych różnicach między bazami danych, które mogą wpływać na sposób uporządkowania danych w Cloud Firestore:

  • Płynne zapytania zapewniają większą elastyczność hierarchicznych struktur danych.
  • Złożone zapytania są bardziej szczegółowe i zmniejszają potrzebę duplikowania danych.
  • Kursory zapytania oferują bardziej precyzyjny podział na strony.
  • Transakcje nie wymagają już wspólnego pierwiastka dla wszystkich danych i są skuteczniejsze.
  • Koszty rozliczeń w Bazie danych czasu rzeczywistego i Cloud Firestore są różne. W wielu przypadkach usługa Cloud Firestore może być droższa od bazy danych czasu rzeczywistego, zwłaszcza jeśli korzystasz z wielu małych operacji. Rozważ zmniejszenie liczby operacji w bazie danych i uniknięcie niepotrzebnych zapisów. Dowiedz się więcej o różnicach w rozliczeniach między Bazą danych czasu rzeczywistego a Cloud Firestore.

Sprawdzone metody w praktyce

Poniższy przykład przedstawia niektóre kwestie, które trzeba wziąć pod uwagę podczas przenoszenia danych między bazami danych. W przypadku bardziej naturalnych struktur danych możesz korzystać z płytkich odczytów i ulepszonych funkcji zapytań w przypadku bardziej naturalnych struktur danych niż w przypadku Bazy danych czasu rzeczywistego.

Możesz utworzyć aplikację z przewodnikiem, która pomaga użytkownikom znajdować ważne punkty orientacyjne w miastach na całym świecie. W Bazie danych czasu rzeczywistego nie ma płytkich odczytów, więc konieczne może być ułożenie danych w 2 węzły 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 stosuje płytkie odczyty, więc zapytania o dokumenty w kolekcji nie pobierają danych z podkolekcji. Dlatego możesz zapisywać informacje o punktach orientacyjnych w podkolekcji:

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

Dokumenty mogą mieć maksymalnie 1 MB, co dodatkowo ułatwia przechowywanie punktów orientacyjnych jako podkolekcji, dzięki czemu dokumenty miejskie są małe i nie rozwijają się, gdy dokumenty zawierają zagnieżdżone listy.

Zaawansowane funkcje zapytań Cloud Firestore ograniczają potrzebę duplikowania danych w przypadku typowych wzorców dostępu. Weźmy na przykład ekran aplikacji z przewodnikiem po miastach, na którym widać wszystkie stolice w podziale według liczby ludności. W Bazie danych czasu rzeczywistego najskuteczniejszym sposobem osiągnięcia tego celu jest utworzenie osobnej listy stolic, która duplikuje dane z listy cities w taki sposób:

{
   cities: {
    // ...
   },

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

W Cloud Firestore możesz wyrazić listę stolic w kolejności zaludnienia w postaci pojedynczego zapytania:

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 strukturę bazy danych Cloud Firestore.

Zabezpieczanie danych

Niezależnie od tego, czy na potrzeby serwerów używasz reguł zabezpieczeń Cloud Firestore na Androida, Apple lub aplikacji internetowych, albo w Identity Access Management (IAM), pamiętaj o zabezpieczeniu danych zarówno w Cloud Firestore, jak i w Bazie danych czasu rzeczywistego. Uwierzytelnianie użytkowników jest obsługiwane przez uwierzytelnianie w obu bazach danych, więc nie musisz zmieniać implementacji uwierzytelniania po rozpoczęciu korzystania z Cloud Firestore.

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

  • Mobilne i internetowe pakiety SDK używają reguł zabezpieczeń Cloud Firestore, natomiast pakiety SDK serwera wykorzystują Identity Access Management (IAM) do zabezpieczania danych.
  • Reguły zabezpieczeń Cloud Firestore nie są kaskadowe, chyba że użyjesz symbolu wieloznacznego. Dokumenty i kolekcje w inny sposób nie dziedziczą reguł.
  • Nie musisz już oddzielnie weryfikować danych (tak jak w Bazie danych czasu rzeczywistego).
  • 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

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

Aby uniknąć zastąpienia nowych danych starymi danymi, warto najpierw dodać dane historyczne. Jeśli dodajesz nowe dane do obu baz danych jednocześnie, zgodnie z opisem w następnym kroku, sprawdź, czy nadajesz priorytet nowym danym dodanym do Cloud Firestore przez Cloud Functions.

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

  1. Wyeksportuj dane z Bazy danych czasu rzeczywistego lub użyj najnowszej 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 z menu wybierz Eksportuj JSON.
  2. Utwórz nową bazę danych w Cloud Firestore i dodaj dane.

    Podczas przenoszenia niektórych danych do Cloud Firestore rozważ te strategie:

    • Napisać niestandardowy skrypt, który przeniesie Twoje dane za Ciebie. Nie możemy zaoferować szablonu dla tego skryptu, ponieważ każda baza danych ma unikalne potrzeby, dlatego eksperci Cloud Firestore na kanale Slack lub w Stack Overflow mogą przejrzeć Twój skrypt lub udzielić porad w konkretnej sytuacji.
    • Używaj pakietów SDK serwera (Node.js, Java, Python lub Go) do zapisywania danych bezpośrednio w Cloud Firestore. Instrukcje konfigurowania pakietów SDK serwera znajdziesz w tym artykule.
    • Aby przyspieszyć migracje dużych ilości danych, używaj zapisów zbiorczych i wysyłaj do 500 operacji w jednym żądaniu sieciowym.
    • Aby nie przekraczać limitów szybkości Cloud Firestore, ogranicz liczbę operacji do 500 zapisów na sekundę na każdą kolekcję.

Dodawanie nowych danych do Cloud Firestore

Aby zachować spójność między bazami danych, dodaj nowe dane do obu baz danych w czasie rzeczywistym. Cloud Functions aktywuje zapis w Cloud Firestore za każdym razem, gdy klient zapisuje dane w bazie danych czasu rzeczywistego. Sprawdź, czy Cloud Firestore daje pierwszeństwo nowym danym pochodzącym z Cloud Functions przed wszelkimi zapisami wykonywanymi z migracji danych historycznych.

Utwórz funkcję zapisującą nowe lub zmieniające się dane w Cloud Firestore za każdym razem, gdy klient zapisuje dane w bazie danych czasu rzeczywistego. Dowiedz się więcej o aktywatorach Bazy danych czasu rzeczywistego dla Cloud Functions.

Ustaw Cloud Firestore jako podstawową bazę danych na potrzeby przeniesionych danych

Jeśli chcesz używać Cloud Firestore jako podstawowej bazy danych dla niektórych danych, upewnij się, że masz skonfigurowane funkcje powielania danych i zweryfikuj reguły zabezpieczeń Cloud Firestore.

  1. Jeśli używasz Cloud Functions do zachowania spójności między bazami danych, sprawdź, czy nie duplikujesz w pętli operacji zapisu w obu bazach danych. Przełącz funkcję tak, aby zapisywała się w jednej bazie danych, lub całkowicie ją usuń i zacznij wycofywać funkcję zapisu przeniesionych danych w aplikacjach, które nadal są powiązane z Bazą danych czasu rzeczywistego. Sposób, w jaki to zrobisz w przypadku swojej aplikacji, zależy od Twoich konkretnych potrzeb i użytkowników.

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