W aplikacji możesz używać zarówno Firebase Realtime Database, jak i Cloud Firestore, a także 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ść część danych z Realtime Database do Cloud Firestore, rozważ poniższy proces. Każda baza danych ma unikalne potrzeby i wymagania strukturalne, dlatego nie ma automatycznej ścieżki migracji. Zamiast tego możesz postępować zgodnie z tą ogólną procedurą:
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 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ć 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 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 podstawową bazę danych dla przeniesionych danych. Po przeniesieniu części danych używaj Cloud Firestore jako podstawowej bazy danych i ogranicz użycie Realtime Database w przypadku przeniesionych danych. Zastanów się, jak będziesz nadal obsługiwać wersje aplikacji, które są nadal powiązane z Realtime Database w przypadku tych danych.
Pamiętaj, aby uwzględnić koszty rozliczeniowe zarówno w przypadku Realtime Database, jak i Cloud Firestore.
Mapowanie danych
Dane w Realtime Database są ustrukturyzowane jako pojedyncze drzewo, a Cloud Firestore obsługuje bardziej wyraźne hierarchie danych za pomocą dokumentów, kolekcji i podkolekcji. Jeśli przeniesiesz część danych z Realtime Database do Cloud Firestore, możesz rozważyć inną architekturę danych.
Najważniejsze różnice do rozważenia
Jeśli przenosisz dane z dotychczasowego drzewa Realtime Database do Cloud Firestoredokumentów i kolekcji, 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 korzystasz z wielu 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 wyszukiwania, aby tworzyć bardziej naturalne struktury danych niż te, których używasz w Realtime Database.
Weźmy pod uwagę 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. W związku z tym informacje o punktach orientacyjnych możesz przechowywać w podkolekcji:
// /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 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 zapytań zmniejszają potrzebę duplikowania danych w przypadku typowych wzorców dostępu. Rozważmy na przykład ekran w aplikacji przewodnika po mieście, który wyświetla wszystkie stolice posortowane według liczby mieszkańców. W Realtime Database najskuteczniejszym sposobem na to 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 mieszkańców 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 danych Cloud Firestore.
Zabezpieczanie danych
Niezależnie od tego, czy używasz Cloud Firestore Security Rules na klientach Androida, Apple lub w internecie, czy Identity Access Management (IAM) na serwerach, zadbaj o bezpieczeństwo danych zarówno w Cloud Firestore, jak i w 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 używać Cloud Firestore.
Najważniejsze różnice do rozważenia
- 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 mają one pierwszeństwo przed nowymi danymi dodanymi do Cloud Firestore przez Cloud Functions.
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 kliknij Bazy danych i miejsce na dane > Baza danych czasu rzeczywistego.
- Na karcie Dane wybierz węzeł główny bazy danych, a następnie w menu kliknij Eksportuj JSON.
Utwórz nową bazę danych w Cloud Firestore i dodaj do niej dane.
Podczas przenoszenia części danych do Cloud Firestore rozważ te strategie:
- Napisz niestandardowy 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 nowe dane do obu baz w czasie rzeczywistym. Użyj Cloud Functions, aby wywołać zapis do Cloud Firestore, gdy klient zapisuje dane w Realtime Database. Upewnij się, że Cloud Firestore nadaje priorytet nowym danym pochodzącym z Cloud Functions w stosunku do wszystkich zapisów dokonywanych podczas migracji danych historycznych.
Utwórz funkcję, która zapisuje nowe lub zmienione dane w Cloud Firestore za każdym razem, gdy klient zapisuje dane w Realtime Database. Więcej informacji o wyzwalaczach Realtime Database w Cloud Functions
Ustaw Cloud Firestore jako podstawową 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 do zachowania równości między bazami danych, upewnij się, że nie duplikujesz operacji zapisu w obu bazach danych w pętli. Przełącz funkcję na zapisywanie 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 tej kwestii w aplikacji zależy od Twoich potrzeb i użytkowników.
Sprawdź, czy Twoje dane są odpowiednio zabezpieczone. Sprawdź konfigurację Cloud Firestore Security Rules lub IAM.