W aplikacji możesz używać zarówno Firebase Realtime Database, jak i Cloud Firestore oraz korzystać z zalet każdego rozwiązania bazodanowego, 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.
Przenoszę dane na: Cloud Firestore
Jeśli zdecydujesz się przenieść niektóre dane z Realtime Database do Cloud Firestore, rozważ następujący proces. Każda baza danych ma unikalne potrzeby i wymagania strukturalne, dlatego nie ma automatycznej ścieżki migracji. Zamiast tego możesz postępować w ten sposób:
Mapuj strukturę danych i reguły zabezpieczeń z Realtime Database na Cloud Firestore. Zarówno Realtime Database, jak i Cloud Firestore korzystają z Firebase Authentication, więc nie musisz zmieniać uwierzytelniania użytkowników w aplikacji. Reguły bezpieczeństwa i model danych są jednak różne, dlatego przed przeniesieniem danych do Cloud Firestore musisz dokładnie uwzględnić te różnice.
Przenieś dane historyczne Podczas konfigurowania nowej struktury danych w Cloud Firestore możesz mapować i przenosić dotychczasowe 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.
Kopiowanie nowych danych do Firestore w czasie rzeczywistym. Użyj Cloud Functions, aby zapisywać nowe dane w nowej bazie danych Cloud Firestore w miarę ich dodawania do Realtime Database.
Ustaw Cloud Firestore jako główną bazę danych dla przeniesionych danych. Po przeniesieniu części danych używaj Cloud Firestore jako podstawowej bazy danych i ogranicz korzystanie z Realtime Database w przypadku przeniesionych danych. Zastanów się, które wersje aplikacji są nadal powiązane z Realtime Database, i jak zamierzasz je nadal 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 postaci jednego drzewa, 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 warto 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 strukturyzacji 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 ograniczają 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 rozliczeń różnią się w zależności od tego, czy są to Realtime Database czy Cloud Firestore. W wielu przypadkach Cloud Firestore może być droższe niż Realtime Database, zwłaszcza jeśli wykonujesz wiele małych operacji. Rozważ zmniejszenie liczby operacji w bazie danych i unikanie 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łytkiego odczytu i ulepszonych możliwości wykonywania zapytań w przypadku bardziej naturalnych struktur danych niż te, których mogłeś używać w Realtime Database.
Załóżmy, że masz aplikację, która pomaga użytkownikom znajdować znane zabytki w miastach na całym świecie. Ponieważ Realtime Database nie obsługuje płytkiego odczytu, być może trzeba było podzielić dane na 2 węzły 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 wykonuje płytkie odczyty, więc wysyłanie zapytań o dokumenty w kolekcji nie powoduje pobierania danych z podkolekcji. Dlatego możesz przechowywać informacje o obiekcie w podkolekcji:
// /cities/$CITY_ID
{
name: "New York",
population: 8000000,
capital: False,
landmarks: [... subcollection ...]
}
Dokumenty mogą mieć maksymalny rozmiar 1 MB, co jest kolejnym powodem, dla którego warto przechowywać punkty orientacyjne jako podzbiór, aby każdy dokument miasta był mały, zamiast powiększać dokumenty za pomocą zagnieżdżonych list.
Cloud Firestorezaawansowane możliwości wykonywania zapytań ograniczają potrzebę duplikowania danych w przypadku typowych wzorców dostępu. Wyobraź sobie na przykład ekran w aplikacji przewodnika po miastach, na którym wyświetlają się wszystkie stolice posortowane według liczby mieszkańców.
W Realtime Database najskuteczniejszym sposobem 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 w kolejności według liczby ludności jako pojedyncze zapytanie:
db.collection('cities')
.where('capital', '==', true)
.orderBy('population')
Dowiedz się więcej o Cloud Firestoremodelu danych i zapoznaj się z naszymi rozwiązaniami, aby uzyskać więcej pomysłów na strukturę bazy danychCloud Firestore.
Zabezpieczanie danych
Niezależnie od tego, czy używasz Cloud Firestore Security Rules w przypadku klientów na Androida, Apple lub w internecie, czy Identity Access Management (IAM) w przypadku serwerów, zadbaj o bezpieczeństwo 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 warto wziąć pod uwagę
- Pakiety SDK na urządzenia mobilne i do internetu używają Cloud Firestore Security Rules, a pakiety SDK serwera używają usługi zarządzania tożsamościami i dostępem (IAM) do zabezpieczania danych.
- Cloud Firestore Security Rules nie są kaskadowe, chyba że używasz symbolu wieloznacznego. Dokumenty i kolekcje nie dziedziczą reguł w inny sposób.
- Nie musisz już osobno weryfikować danych (jak w przypadku 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
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 na Cloud Firestore planujesz wysyłać zapytania dotyczące danych historycznych, dodaj eksport starych danych do nowej bazy danych Cloud Firestore. Jeśli planujesz używać w aplikacji zarówno elementu Realtime Database, jak i Cloud Firestore, możesz pominąć ten krok.
Aby uniknąć zastąpienia nowych danych starymi, najpierw dodaj dane historyczne. Jeśli dodasz nowe dane do obu baz danych jednocześnie, jak opisano w następnym kroku, upewnij się, że nowe dane dodane do Cloud Firestore przez Cloud Functions mają wyższy priorytet.
Aby przenieść dane historyczne do Cloud Firestore, wykonaj te czynności:
- Wyeksportuj dane z Realtime Database lub użyj ostatniej kopii zapasowej.
- W konsoli Firebase otwórz sekcję Realtime Database.
- Na karcie Dane wybierz węzeł najwyższego poziomu bazy danych i w menu kliknij Eksportuj JSON.
Utwórz nową bazę danych w Cloud Firestore i dodaj do niej dane.
Podczas przenoszenia niektórych danych do Cloud Firestore rozważ te strategie:
- Napisz własny skrypt, który przeniesie Twoje dane. Nie możemy udostępnić szablonu tego skryptu, ponieważ każda baza danych ma unikalne potrzeby.Cloud FirestoreEksperci na naszym kanale Slack lub na Stack Overflow mogą 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 artykule Pierwsze kroki.
- Aby przyspieszyć migrację dużych ilości danych, użyj zapisów wsadowych i wysyłaj do 500 operacji w jednym żądaniu sieciowym.
- Aby nie przekraczać Cloud Firestorelimitów, ogranicz liczbę operacji do 500 zapisów na sekundę w przypadku każdej kolekcji.
Dodawanie nowych danych do Cloud Firestore
Aby zachować równowagę między bazami danych, dodawaj do nich nowe dane w czasie rzeczywistym. Użyj Cloud Functions, aby wywołać zapis do Cloud Firestore za każdym razem, gdy klient zapisuje dane w Realtime Database. Upewnij się, że Cloud Firestorema pierwszeństwo przed nowymi danymi pochodzącymi z Cloud Functions w stosunku do wszelkich zapisów dokonywanych podczas migracji danych historycznych.
Utwórz funkcję, która będzie zapisywać nowe lub zmienione dane w Cloud Firestore za każdym razem, gdy klient zapisze dane w Realtime Database. Dowiedz się więcej o regułach Realtime Database dotyczących 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 dublowania danych i sprawdź Cloud Firestore Security Rules.
Jeśli używasz Cloud Functions, aby zachować równość między bazami danych, upewnij się, że nie duplikujesz operacji zapisu w obu bazach danych w pętli. Przełącz funkcję na zapisywanie danych w jednej bazie danych lub całkowicie ją usuń i zacznij wycofywać funkcję zapisu w przypadku przeniesionych danych w aplikacjach nadal powiązanych z Realtime Database. Sposób obsługi tego w aplikacji zależy od Twoich potrzeb i potrzeb użytkowników.
Sprawdź, czy Twoje dane są odpowiednio zabezpieczone. Sprawdź konfigurację Cloud Firestore Security Rules lub IAM.