W aplikacji możesz używać zarówno Firebase Realtime Database, jak i Cloud Firestore. Dzięki temu możesz wykorzystać zalety każdego z tych rozwiązań, aby dopasować je do swoich potrzeb. Możesz na przykład skorzystać z obsługi obecności w bazie danych czasu rzeczywistego, jak opisano w artykule Tworzenie funkcji obecności w Cloud Firestore.Realtime DatabaseCloud Firestore
Dowiedz się więcej o różnicach między bazami danych.
Przenoszenie danych do 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 tym ogólnym schematem:
Zmapuj strukturę danych i reguły bezpieczeństwa z Realtime Database do 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 bezpieczeństwa i model danych są jednak inne, dlatego przed rozpoczęciem przenoszenia danych do Cloud Firestore należy dokładnie uwzględnić te różnice.
Przenieś dane historyczne. Podczas konfigurowania nowej struktury danych w Cloud Firestore możesz zmapować i przenieść istniejące dane z Realtime Database do nowej instancji Cloud Firestore. Jeśli jednak używasz obu baz danych w aplikacji, nie musisz przenosić danych historycznych z Realtime Database.
Kopiuj nowe dane do Firestore w czasie rzeczywistym. Użyj Cloud Functions, aby zapisywać nowe dane w nowej bazie danych Cloud Firestore , gdy są one dodawane do Realtime Database.
Ustaw Cloud Firestore jako główną bazę danych dla przeniesionych danych. Po przeniesieniu części danych używaj Cloud Firestore jako głównej 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 w przypadku tych danych i jak zamierzasz je nadal obsługiwać.
Pamiętaj, aby uwzględnić koszty rozliczeniowe zarówno 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 przenosisz część danych z Realtime Database do Cloud Firestore, możesz rozważyć inną architekturę danych.
Najważniejsze różnice, które należy wziąć pod uwagę
Jeśli przenosisz dane z istniejącego drzewa Realtime Database do dokumentów i kolekcji Cloud Firestore , pamiętaj o tych najważniejszych różnicach między bazami danych, które mogą mieć wpływ na sposób strukturyzowania 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 zmniejszają potrzebę duplikowania danych.
- Kursory zapytań zapewniają bardziej niezawodną paginację.
- Transakcje nie wymagają już wspólnego korzenia dla wszystkich danych i są bardziej wydajne.
- Koszty rozliczeniowe różnią się w zależności od tego, czy używasz Realtime Database, czy Cloud 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 w bazie danych i unikanie niepotrzebnych zapisów. Dowiedz się więcej o różnicach w rozliczeniach między Realtime Database a Cloud Firestore.
Sprawdzone metody w praktyce
Poniższy przykład odzwierciedla niektóre kwestie, które możesz wziąć pod uwagę podczas przenoszenia danych między bazami danych. Możesz korzystać z płytkich odczytów i ulepszonych możliwości wykonywania zapytań, aby tworzyć bardziej naturalne struktury danych niż w przypadku bazy danych czasu rzeczywistego z Realtime Database.
Rozważ aplikację przewodnika po mieście, która pomaga użytkownikom znajdować ciekawe miejsca w miastach na całym świecie. Ponieważ Realtime Database nie obsługuje płytkich odczytów, 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 obsługuje płytkie odczyty, więc wysyłanie zapytań o dokumenty w kolekcji nie powoduje pobierania danych z podkolekcji. Dzięki temu możesz przechowywać informacje o zabytkach w podkolekcji:
// /cities/$CITY_ID
{
name: "New York",
population: 8000000,
capital: False,
landmarks: [... subcollection ...]
}
Maksymalny rozmiar dokumentu to 1 MB. Jest to kolejny powód, aby przechowywać zabytki jako podkolekcję, dzięki czemu każdy dokument miasta będzie mały, a nie będzie zawierał zagnieżdżonych list.
Zaawansowane możliwości wykonywania zapytań w Cloud Firestore zmniejszają potrzebę
duplikowania danych w przypadku typowych wzorców dostępu. Rozważ na przykład ekran w aplikacji przewodnika po mieście, który wyświetla wszystkie stolice uporządkowane 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 uporządkowanych według liczby mieszkańców jako pojedyncze zapytanie:
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.
Zabezpiecz swoje dane
Niezależnie od tego, czy używasz Cloud Firestore Security Rules dla klientów Androida, Apple czy internetowych, czy też zarządzania dostępem i tożsamością (IAM) na serwerach, pamiętaj, aby zabezpieczyć dane zarówno w Cloud Firestore jak i w Realtime Database. Uwierzytelnianie użytkowników jest obsługiwane przez uwierzytelnianie w obu bazach danych, więc nie musisz zmieniać implementacji uwierzytelniania, gdy zaczniesz korzystać z Cloud Firestore.
Najważniejsze różnice, które należy wziąć pod uwagę
- Pakiety SDK na urządzenia mobilne i do internetu używają Cloud Firestore Security Rules, a pakiety SDK serwera używają zarządzania dostępem i tożsamością (IAM) do zabezpieczania danych.
- Cloud Firestore Security Rules nie są kaskadowe, chyba że używasz symbolu wieloznacznego. Dokumenty i kolekcje nie dziedziczą reguł.
- Nie musisz już osobno weryfikować danych (jak 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.
Przenoszenie danych historycznych do Cloud Firestore
Gdy zmapujesz dane i struktury zabezpieczeń do Cloud Firestore's modeli danych i zabezpieczeń, możesz zacząć dodawać dane. Jeśli po przeniesieniu aplikacji z Realtime Database do Cloud Firestore planujesz wysyłać zapytania o dane historyczne, dodaj eksport starych danych do nowej Cloud Firestore bazy danych. Jeśli planujesz używać w aplikacji zarówno Realtime Database i Cloud Firestore, możesz pominąć ten krok.
Aby uniknąć zastąpienia nowych danych starymi, możesz najpierw dodać dane historyczne. Jeśli dodajesz 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ą pierwszeństwo przed zapisami dokonywanymi podczas migracji danych historycznych.
Aby przenieść dane historyczne do Cloud Firestore:
- Wyeksportuj dane z Realtime Database lub
użyj ostatniej kopii zapasowej.
- Otwórz sekcję Realtime Database w konsoli Firebase.
- Na karcie Dane wybierz węzeł główny bazy danych i w menu kliknij Eksportuj JSON.
Utwórz nową bazę danych w Cloud Firestore i dodaj dane.
Podczas przenoszenia części danych do Cloud Firestore rozważ te strategie:
- Napisz niestandardowy skrypt, który przeniesie dane. Nie możemy udostępnić szablonu tego skryptu, ponieważ każda baza danych ma unikalne potrzeby. Cloud Firestore Eksperci na naszym kanale Slack lub w Stack Overflow mogą jednak 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 przewodniku Pierwsze kroki.
- Aby przyspieszyć migrację dużych ilości danych, użyj zapisów zbiorczych i wysyłaj do 500 operacji w jednym żądaniu sieciowym.
- Aby nie przekraczać limitów Cloud Firestore szybkości, ogranicz liczbę operacji do 500 zapisów na sekundę w przypadku każdej kolekcji.
Dodawanie nowych danych do Cloud Firestore
Aby zachować równość między bazami danych, dodawaj nowe dane do obu baz danych w czasie rzeczywistym. Użyj Cloud Functions, aby wywoływać zapis w Cloud Firestore , gdy klient zapisuje dane w Realtime Database. Upewnij się, że Cloud Firestore przyznaje pierwszeństwo nowym danym pochodzącym z Cloud Functions przed zapisami dokonywanymi podczas migracji danych historycznych.
Utwórz funkcję, która będzie zapisywać nowe lub zmieniające się dane w Cloud Firestore za każdym razem, gdy klient zapisuje dane w Realtime Database. Dowiedz się więcej o Realtime Database wyzwalaczach dla 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 części danych, pamiętaj o uwzględnieniu wszystkich skonfigurowanych funkcji kopiowania danych i sprawdź Cloud Firestore Security Rules.
Jeśli używasz Cloud Functions do utrzymywania równości między bazami danych, upewnij się, że nie duplikujesz operacji zapisu w obu bazach danych w pętli. Zmień funkcję, aby zapisywała dane w jednej bazie danych, lub całkowicie usuń funkcję i zacznij wycofywać funkcję zapisu w przypadku przeniesionych danych w aplikacjach nadal powiązanych z Realtime Database. Sposób postępowania w przypadku aplikacji zależy od Twoich konkretnych potrzeb i potrzeb użytkowników.
Sprawdź, czy dane są odpowiednio zabezpieczone. Sprawdź Cloud Firestore Security Rules lub konfigurację IAM.