Cloud Firestore mit der Firebase Realtime Database verwenden

Sie können sowohl Firebase Realtime Database als auch Cloud Firestore in Ihrer App verwenden und die Vorteile der jeweiligen Datenbanklösung entsprechend Ihren Anforderungen nutzen. Sie können beispielsweise die Anwesenheitsfunktion von Realtime Database nutzen, wie im Hilfeartikel Build Presence in Cloud Firestore (Anwesenheit in Cloud Firestore erstellen) beschrieben.

Weitere Informationen zu den Unterschieden zwischen den Datenbanken

Daten zu Cloud Firestore verschieben

Wenn Sie einige Ihrer Daten von Realtime Database zu Cloud Firestore migrieren möchten, gehen Sie so vor: Da jede Datenbank spezifische Anforderungen und strukturelle Aspekte hat, gibt es keinen automatisierten Migrationspfad. Stattdessen können Sie diesen allgemeinen Ablauf verfolgen:

  1. Ordnen Sie die Datenstruktur und die Sicherheitsregeln von Realtime Database zu Cloud Firestore zu. Sowohl Realtime Database als auch Cloud Firestore basieren auf der Firebase Authentication. Sie müssen also die Nutzerauthentifizierung für Ihre App nicht ändern. Die Sicherheitsregeln und das Datenmodell unterscheiden sich jedoch. Es ist wichtig, diese Unterschiede sorgfältig zu berücksichtigen, bevor Sie mit der Migration von Daten zu Cloud Firestore beginnen.

  2. Verlaufsdaten verschieben Wenn Sie Ihre neue Datenstruktur in Cloud Firestore einrichten, können Sie vorhandene Daten von Realtime Database in Ihre neue Cloud Firestore-Instanz zuordnen und verschieben. Wenn Sie jedoch beide Datenbanken in Ihrer App verwenden, müssen Sie Verlaufsdaten nicht aus Realtime Database verschieben.

  3. Neue Daten in Echtzeit in Firestore spiegeln Verwenden Sie Cloud Functions, um neue Daten in die neue Cloud Firestore-Datenbank zu schreiben, sobald sie Realtime Database hinzugefügt werden.

  4. Machen Sie Cloud Firestore zu Ihrer primären Datenbank für die migrierten Daten. Nachdem Sie einige Ihrer Daten migriert haben, verwenden Sie Cloud Firestore als primäre Datenbank und reduzieren Sie die Verwendung von Realtime Database für die migrierten Daten. Überlegen Sie, wie Sie Versionen Ihrer App, die für diese Daten noch mit Realtime Database verknüpft sind, weiter unterstützen möchten.

Berücksichtigen Sie die Abrechnungskosten sowohl für Realtime Database als auch für Cloud Firestore.

Daten zuordnen

Daten in Realtime Database sind als einzelnes Baumstruktur organisiert, während Cloud Firestore explizitere Datenhierarchien über Dokumente, Sammlungen und Untersammlungen unterstützt. Wenn Sie einige Ihrer Daten von Realtime Database zu Cloud Firestore verschieben, sollten Sie eine andere Architektur für Ihre Daten in Betracht ziehen.

Wichtige Unterschiede

Wenn Sie Daten aus Ihrem vorhandenen Realtime Database-Baum in Cloud Firestore-Dokumente und Cloud Firestore-Sammlungen verschieben, sollten Sie die folgenden wichtigen Unterschiede zwischen den Datenbanken beachten, die sich auf die Strukturierung von Daten in Cloud Firestore auswirken können:

  • Shallow-Abfragen bieten mehr Flexibilität bei hierarchischen Datenstrukturen.
  • Komplexe Abfragen bieten mehr Detaillierung und reduzieren die Notwendigkeit von Datenduplikaten.
  • Abfragecursor bieten eine robustere Paginierung.
  • Transaktionen erfordern keine gemeinsame Wurzel mehr für alle Daten und sind effizienter.
  • Die Abrechnungskosten unterscheiden sich zwischen Realtime Database und Cloud Firestore. In vielen Fällen kann Cloud Firestore teurer sein als Realtime Database, insbesondere wenn Sie viele kleine Vorgänge ausführen. Sie sollten die Anzahl der Vorgänge in Ihrer Datenbank reduzieren und unnötige Schreibvorgänge vermeiden. Weitere Informationen zu den Unterschieden bei der Abrechnung zwischen Realtime Database und Cloud Firestore

Best Practices in der Praxis

Das folgende Beispiel zeigt einige der Überlegungen, die Sie beim Verschieben von Daten zwischen Datenbanken berücksichtigen sollten. Mithilfe von oberflächlichen Lesevorgängen und verbesserten Abfragefunktionen können Sie natürlichere Datenstrukturen nutzen als mit Realtime Database.

Stellen Sie sich eine Stadtführer-App vor, mit der Nutzer Sehenswürdigkeiten in Städten auf der ganzen Welt finden können. Da Realtime Database keine flachen Lesevorgänge unterstützt, mussten Sie die Daten möglicherweise in zwei Knoten der obersten Ebene strukturieren, wie hier dargestellt:

// /cities/$CITY_KEY
{
  name: "New York",
  population: 8000000,
  capital: False
}

// /city-landmark/$CITY_KEY/$LANDMARK_KEY
{
  name: "Empire State Building",
  category: "Architecture"
}

Cloud Firestore unterstützt nur flache Lesevorgänge. Bei Abfragen nach Dokumenten in einer Sammlung werden also keine Daten aus Untersammlungen abgerufen. Daher können Sie Informationen zu Sehenswürdigkeiten in einer untergeordneten Sammlung speichern:

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

Dokumente dürfen maximal 1 MB groß sein. Das ist ein weiterer Grund, Markierungen als untergeordnete Sammlung zu speichern, damit jedes Stadtdokument klein bleibt und nicht durch verschachtelte Listen aufgebläht wird.

Die erweiterten Abfragefunktionen von Cloud Firestore verringern die Notwendigkeit, Daten für gängige Zugriffsmuster zu duplizieren. Stellen Sie sich beispielsweise einen Bildschirm in der Stadtführer-App vor, auf dem alle Hauptstädte nach Bevölkerungszahl sortiert angezeigt werden. In Realtime Database ist es am effizientesten, eine separate Liste der Hauptstädte zu führen, in der die Daten aus der Liste cities dupliziert werden. Gehen Sie dazu so vor:

{
   cities: {
    // ...
   },

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

In Cloud Firestore können Sie eine Liste der Hauptstädte in absteigender Reihenfolge der Einwohnerzahl in einer einzigen Abfrage ausdrücken:

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

Weitere Informationen zum Cloud Firestore-Datenmodell und Ideen zur Strukturierung Ihrer Cloud Firestore-Datenbank finden Sie in unseren Lösungen.

Daten schützen

Ganz gleich, ob Sie Cloud Firestore Security Rules für Android-, Apple- oder Web-Clients oder Identity Access Management (IAM) für Server verwenden, sollten Sie Ihre Daten sowohl in Cloud Firestore als auch in Realtime Database schützen. Die Nutzerauthentifizierung wird für beide Datenbanken von der Authentifizierung verarbeitet. Sie müssen die Implementierung der Authentifizierung also nicht ändern, wenn Sie Cloud Firestore verwenden.

Wichtige Unterschiede

  • Für mobile und Web-SDKs wird Cloud Firestore Security Rules verwendet, während Server-SDKs Identity Access Management (IAM) zur Sicherung von Daten nutzen.
  • Cloud Firestore Security Rules werden nur kaskadiert, wenn Sie einen Platzhalter verwenden. Für Dokumente und Sammlungen werden sonst keine Regeln übernommen.
  • Sie müssen Daten nicht mehr separat validieren (wie in Realtime Database).
  • Cloud Firestore prüft vor der Ausführung einer Abfrage Regeln, um sicherzustellen, dass der Nutzer den entsprechenden Zugriff auf alle von der Abfrage zurückgegebenen Daten hat.

Verlaufsdaten zu Cloud Firestore verschieben

Nachdem Sie Ihre Daten- und Sicherheitsstrukturen den Daten- und Sicherheitsmodellen von Cloud Firestore zugeordnet haben, können Sie Ihre Daten hinzufügen. Wenn Sie nach der Migration Ihrer App von Realtime Database zu Cloud Firestore Verlaufsdaten abfragen möchten, fügen Sie Ihrer neuen Cloud Firestore-Datenbank einen Export Ihrer alten Daten hinzu. Wenn Sie sowohl Realtime Database als auch Cloud Firestore in Ihrer App verwenden möchten, können Sie diesen Schritt überspringen.

Damit neue Daten nicht mit alten Daten überschrieben werden, sollten Sie zuerst Ihre Verlaufsdaten hinzufügen. Wenn Sie beiden Datenbanken gleichzeitig neue Daten hinzufügen, wie im nächsten Schritt beschrieben, müssen Sie neuen Daten, die Cloud Functions an Cloud Firestore hinzugefügt wurden, Vorrang einräumen.

So migrieren Sie Verlaufsdaten zu Cloud Firestore:

  1. Exportieren Sie Ihre Daten aus Realtime Database oder verwenden Sie ein aktuelles Back-up.
    1. Rufen Sie in der Firebase-Konsole den Bereich Realtime Database auf.
    2. Wählen Sie auf dem Tab Daten den Knoten der Stammebene Ihrer Datenbank aus und wählen Sie dann im Menü JSON exportieren aus.
  2. Erstellen Sie die neue Datenbank in Cloud Firestore und fügen Sie Ihre Daten hinzu.

    Berücksichtigen Sie die folgenden Strategien, wenn Sie einige Ihrer Daten zu Cloud Firestore verschieben:

    • Schreiben Sie ein benutzerdefiniertes Script, das Ihre Daten für Sie portiert. Wir können zwar keine Vorlage für dieses Script anbieten, da jede Datenbank spezifische Anforderungen hat, aber Cloud Firestore Experten in unserem Slack-Kanal oder auf Stack Overflow können Ihr Script prüfen oder Ihnen Ratschläge für Ihre spezifische Situation geben.
    • Verwenden Sie die Server-SDKs (Node.js, Java, Python oder Go), um Daten direkt in Cloud Firestore zu schreiben. Eine Anleitung zum Einrichten der Server-SDKs findest du unter Erste Schritte.
    • Um große Datenmigrationen zu beschleunigen, verwenden Sie Batch-Schreibvorgänge und senden Sie bis zu 500 Vorgänge in einer einzigen Netzwerkanfrage.
    • Begrenzen Sie die Vorgänge auf 500 Schreibvorgänge pro Sekunde für jede Sammlung, um die Cloud Firestore-Geschwindigkeitslimits einzuhalten.

Cloud Firestore neue Daten hinzufügen

Um die Parität zwischen Ihren Datenbanken aufrechtzuerhalten, fügen Sie beiden Datenbanken in Echtzeit neue Daten hinzu. Mit Cloud Functions wird ein Schreibvorgang auf Cloud Firestore ausgelöst, wenn ein Client auf Realtime Database schreibt. Achten Sie darauf, dass in Cloud Firestore neue Daten von Cloud Functions Vorrang vor Schreibvorgängen haben, die Sie bei der Migration Ihrer Verlaufsdaten ausführen.

Erstellen Sie eine Funktion, die neue oder geänderte Daten in Cloud Firestore schreibt, jedes Mal, wenn ein Client Daten in Realtime Database schreibt. Weitere Informationen zu Realtime Database-Triggern für Cloud Functions

Cloud Firestore als primäre Datenbank für die migrierten Daten festlegen

Wenn Sie Cloud Firestore als primäre Datenbank für einige Ihrer Daten verwenden möchten, müssen Sie alle eingerichteten Datenspiegelungsfunktionen berücksichtigen und Cloud Firestore Security Rules validieren.

  1. Wenn du Cloud Functions verwendet hast, um die Parität zwischen deinen Datenbanken aufrechtzuerhalten, achte darauf, dass du Schreibvorgänge in einer Schleife nicht in beiden Datenbanken duplizierst. Ändern Sie die Funktion so, dass sie in eine einzelne Datenbank schreibt, oder entfernen Sie die Funktion vollständig und führen Sie die Schreibfunktion für die migrierten Daten in Apps, die noch mit Realtime Database verknüpft sind, schrittweise ein. Wie Sie dies für Ihre App handhaben, hängt von Ihren spezifischen Anforderungen und Ihren Nutzern ab.

  2. Prüfen Sie, ob Ihre Daten ordnungsgemäß geschützt sind. Prüfen Sie Ihre Cloud Firestore Security Rules- oder IAM-Einrichtung.