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, a także korzystać z zalet obu tych rozwiązań bazy danych, aby dostosować je do swoich potrzeb. Możesz na przykład skorzystać z obsługi funkcji obecności w Realtime Database, o której mowa w artykule Tworzenie obecności w Cloud Firestore.

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

Przenoszę dane na: Cloud Firestore

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

  1. Zmapuj strukturę danych i reguły bezpieczeństwa z poziomu Realtime Database na Cloud Firestore. Zarówno Realtime Database, jak i Cloud Firestore korzystają z usługi uwierzytelniania Firebase, więc nie musisz zmieniać uwierzytelniania użytkowników w aplikacji. Jednak reguły zabezpieczeń i model danych są inne, dlatego przed rozpoczęciem przenoszenia danych do Cloud Firehose należy dokładnie wziąć pod uwagę te różnice.

  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 w aplikacji używasz obu baz danych, nie musisz przenosić danych historycznych z poziomu Realtime Database.

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

  4. Ustaw bazę danych Cloud Firestore jako bazę danych docelową przenoszonych danych. Po przeniesieniu części danych użyj bazy danych Cloud Firestore jako bazy danych podstawowej i zmniejsz użycie bazy danych Realtime Database do przechowywania przeniesionych danych. Zastanów się, jak postąpić z wersjami aplikacji, które są nadal powiązane z usługą Realtime Database, i jak zamierzasz je dalej obsługiwać.

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

Mapowanie danych

Dane w Realtime Database są uporządkowane w jednym drzewie, natomiast Cloud Firestore obsługuje bardziej wyraźne hierarchie danych za pomocą dokumentów, kolekcji i podkolekcji. Jeśli przenosisz część danych z Realtime Database na Cloud Firestore, możesz rozważyć zmianę architektury danych.

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

Jeśli przenosisz dane z dotychczasowego 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 sposób strukturowania danych w Cloud Firestore:

  • Zapytania płytkie zapewniają większą elastyczność w hierarchicznych strukturach danych.
  • Złożone zapytania zapewniają większą szczegółowość i zmniejszają potrzebę powielania danych.
  • Kursory zapytań zapewniają bardziej niezawodną stronę po stronie.
  • Transakcje nie wymagają już wspólnego korzenia dla wszystkich danych i są bardziej wydajne.
  • Koszty rozliczeń różnią się w przypadku Realtime DatabaseCloud 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 na bazie danych i unikanie niepotrzebnych zapisów. Dowiedz się więcej o różnicach w płatnościach między Realtime DatabaseCloud Firestore.

Sprawdzone metody w akcji

Poniższy przykład odzwierciedla niektóre kwestie, które należy wziąć pod uwagę podczas przenoszenia danych między bazami danych. Możesz korzystać z czytania płytkiego i ulepszonych funkcji zapytań, aby uzyskiwać bardziej naturalne struktury danych niż w przypadku Realtime Database.

Weź pod uwagę aplikację z przewodnikami po miastach, która pomaga użytkownikom znajdować znane zabytki w miastach na całym świecie. Ponieważ Realtime Database nie obsługuje lektury płytkiej, 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 ma płytkie odczyty, więc zapytanie o dokumenty w kolekcji nie pobiera danych z podkolekcji. W związku z tym informacje o miejscach docelowych możesz przechowywać w podzbiorze:

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

Maksymalny rozmiar dokumentu to 1 MB, co jest kolejnym powodem, dla którego punkty orientacyjne należy przechowywać jako podkolekcją. Dzięki temu każdy dokument miasta będzie miał niewielki rozmiar, a nie będzie trzeba dzielić dokumentów za pomocą zagnieżdżonych list.

Zaawansowane możliwości wykonywania zapytań w usłudze Cloud Firestore pozwalają uniknąć duplikowania danych w przypadku typowych wzorców dostępu. Wyobraź sobie na przykład ekran w aplikacji zwiedzanie miasta, na którym wyświetlane są wszystkie stolice uporządkowane według liczby ludności. W Realtime Database najskuteczniejszym sposobem jest prowadzenie osobnej listy stolic, która powiela dane z listy cities:

{
   cities: {
    // ...
   },

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

W Cloud Firestore możesz podać listę stolic uporządkowaną według liczby ludności w ramach pojedynczego zapytania:

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

Dowiedz się więcej o modelu danych Cloud Firestore i zapoznaj się z naszą ofertą rozwiązań, aby uzyskać więcej pomysłów na uporządkowanie bazy danych Cloud Firestore.

Zabezpieczanie danych

Niezależnie od tego, czy używasz interfejsu Cloud Firestore Security Rules do obsługi klientów na Androida, Apple lub w sieci, czy też interfejsu zarządzania dostępem na podstawie tożsamości (IAM) do obsługi serwerów, pamiętaj, aby chronić swoje dane w interfejsie Cloud FirestoreRealtime Database. Uwierzytelnianie użytkowników jest obsługiwane przez usługę uwierzytelniania w obu bazach danych, więc nie musisz zmieniać implementacji uwierzytelniania po rozpoczęciu korzystania z Cloud Firestore.

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

  • Pakiety SDK na urządzenia mobilne i do przeglądarek korzystają z funkcji Cloud Firestore Security Rules, a pakiety SDK na serwery używają usługi zarządzania tożsamościami i dostępem (IAM) do ochrony danych.
  • Cloud Firestore Security Rules nie działają kaskadowo, chyba że użyjesz symbolu wieloznacznego. Dokumenty i kolekcje nie dziedziczą reguł w inny sposób.
  • Nie musisz już sprawdzać danych osobno (jak w Realtime Database).
  • Cloud Firestore przed wykonaniem zapytania sprawdza reguły, aby upewnić się, że użytkownik ma odpowiedni dostęp do wszystkich danych zwróconych przez zapytanie.

Przenoszenie danych historycznych na konto Cloud Firestore

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

Aby uniknąć zastąpienia nowych danych starymi, najpierw dodaj dane historyczne. Jeśli nowe dane dodajesz jednocześnie do obu baz danych, jak opisano w następnym kroku, pamiętaj, aby nadać pierwszeństwo nowym danym dodanym do tabeli Cloud Firestore przez funkcję Cloud Functions.

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

  1. Wyeksportuj dane z Realtime Database lub użyj ostatniej kopii zapasowej.
    1. W konsoli Firebase otwórz sekcję Realtime Database.
    2. Na karcie Dane wybierz węzeł na poziomie katalogu bazy danych, a potem w menu kliknij Eksportuj do pliku JSON.
  2. Utwórz nową bazę danych w Cloud Firestoredodaj do niej dane.

    Podczas przenoszenia niektórych danych do Cloud Firestore rozważ zastosowanie tych strategii:

    • Napisz niestandardowy skrypt, który przeniesie Twoje dane. Nie możemy udostępnić szablonu tego skryptu, ponieważ każda baza danych ma inne potrzeby, ale Cloud Firestoreeksperci na naszym kanale Slack lub na Stack Overflow mogą sprawdzić Twój skrypt lub udzielić Ci porad dotyczących 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 sekcji Pierwsze kroki.
    • Aby przyspieszyć migrację dużych zbiorów danych, użyj zbiorczych operacji zapisu i wyślij maksymalnie 500 operacji w jednym żądaniu sieciowym.
    • Aby nie przekraczać Cloud Firestore limitów szybkości, ogranicz operacje do 500 operacji zapisu na sekundę w przypadku każdej kolekcji.

Dodawanie nowych danych do Cloud Firestore

Aby zachować zgodność między bazami danych, dodawaj nowe dane do obu baz w czasie rzeczywistym. Użyj Cloud Functions, aby wywołać zapis do Cloud Firestore coraz, gdy klient zapisuje do Realtime Database. Upewnij się, że Cloud Firestore przypisuje pierwszeństwo nowym danym pochodzącym z Cloud Functions nad zapisami, które wykonujesz podczas migracji danych historycznych.

Utwórz funkcję, która zapisuje nowe dane lub dane zmienione w tablicy Cloud Firestore za każdym razem, gdy klient zapisuje dane w tablicy Realtime Database. Dowiedz się więcej o Realtime DatabaseCloud Functions.

Ustaw bazę danych Cloud Firestore jako bazę danych docelową dla przenoszonych danych.

Jeśli zdecydujesz się używać bazy danych Cloud Firestore jako podstawowej bazy danych dla niektórych danych, uwzględnij wszystkie skonfigurowane funkcje lustrzanego odbicia danych i sprawdź bazę danych Cloud Firestore Security Rules.

  1. Jeśli do utrzymania parzy danych między bazami danych użyjesz funkcji Cloud Functions, sprawdź, czy w pętli nie dublujesz operacji zapisu w obu bazach danych. Zmień funkcję zapisu na funkcję zapisu do jednej bazy danych lub usuń funkcję całkowicie i zacznij stopniowo wycofywać funkcję zapisu w przypadku danych przeniesionych do aplikacji, które są nadal powiązane z Realtime Database. Sposób zarządzania tymi informacjami w aplikacji zależy od Twoich potrzeb i użytkowników.

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