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 nutzen, um Ihre Anforderungen zu erfüllen. Möglicherweise möchten Sie beispielsweise die Unterstützung von Realtime Database für die Anwesenheit nutzen, wie in Anwesenheit in Cloud Firestore erstellen beschrieben.

Weitere Informationen zu den Unterschieden zwischen den Datenbanken

Daten werden nach Cloud Firestore verschoben

Wenn Sie sich entschieden haben, einige Ihrer Daten von Realtime Database zu Cloud Firestore zu migrieren, sollten Sie den folgenden Ablauf berücksichtigen. Da jede Datenbank spezielle Anforderungen und strukturelle Aspekte hat, gibt es keinen automatischen Migrationspfad. Stattdessen können Sie so vorgehen:

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

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

  3. Neue Daten in Echtzeit in Firestore spiegeln: Mit Cloud Functions können Sie neue Daten in Ihre neue Cloud Firestore-Datenbank schreiben, wenn sie Realtime Database hinzugefügt werden.

  4. Machen Sie Cloud Firestore zur 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. Berücksichtigen Sie Versionen Ihrer App, die für diese Daten weiterhin mit Realtime Database verknüpft sind, und überlegen Sie, wie Sie sie weiterhin unterstützen möchten.

Berücksichtigen Sie die Abrechnungskosten für Realtime Database und Cloud Firestore.

Daten zuordnen

Daten in Realtime Database sind als einzelner Baum strukturiert, während Cloud Firestore explizitere Datenhierarchien durch Dokumente, Sammlungen und Untersammlungen unterstützt. Wenn Sie einige Ihrer Daten von Realtime Database nach 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 ‑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:

  • Flache Abfragen bieten mehr Flexibilität bei hierarchischen Datenstrukturen.
  • Komplexe Abfragen bieten einen höheren Detaillierungsgrad und machen doppelte Daten überflüssig.
  • Abfragecursor bieten eine robustere Paginierung.
  • Für Transaktionen ist kein gemeinsamer Stamm für alle Ihre Daten mehr erforderlich und sie sind effizienter.
  • Die Abrechnungskosten unterscheiden sich zwischen Realtime Database und Cloud Firestore. In vielen Fällen ist Cloud Firestore möglicherweise teurer als Realtime Database, insbesondere wenn Sie viele kleine Vorgänge ausführen. Erwägen Sie, die Anzahl der Vorgänge in Ihrer Datenbank zu reduzieren und unnötige Schreibvorgänge zu vermeiden. Weitere Informationen zu den Unterschieden bei der Abrechnung zwischen Realtime Database und Cloud Firestore

Best Practices in der Praxis

Im folgenden Beispiel werden einige der Überlegungen berücksichtigt, die Sie beim Übertragen Ihrer Daten zwischen Datenbanken anstellen könnten. Sie können Shallow Reads und verbesserte Abfragefunktionen für natürlichere Datenstrukturen nutzen, als Sie es möglicherweise mit Realtime Database gewohnt sind.

Stellen Sie sich eine App mit Stadtführern vor, mit der Nutzer in Städten auf der ganzen Welt nach Sehenswürdigkeiten suchen können. Da Realtime Database keine oberflächlichen Lesevorgänge unterstützt, mussten Sie die Daten möglicherweise in zwei Knoten der obersten Ebene strukturieren:

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

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

Cloud Firestore führt nur zu oberflächlichen Lesevorgängen. Wenn Sie also Dokumente in einer Sammlung abfragen, werden keine Daten aus Untersammlungen abgerufen. Daher können Sie Informationen zu Sehenswürdigkeiten in einer Unterkollektion 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, Sehenswürdigkeiten als untergeordnete Sammlung zu speichern, damit jedes Stadtdokument klein bleibt und Dokumente nicht durch verschachtelte Listen aufgebläht werden.

Die erweiterten Abfragefunktionen von Cloud Firestore reduzieren den Bedarf, 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 Einwohnerzahl sortiert sind. In Realtime Database ist es am effizientesten, eine separate Liste von Hauptstädten zu führen, die Daten aus der Liste cities dupliziert, wie folgt:

{
   cities: {
    // ...
   },

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

In Cloud Firestore können Sie eine Liste von Hauptstädten nach Bevölkerungszahl in einer einzigen Anfrage erstellen:

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

Weitere Informationen zum Cloud Firestore-Datenmodell und Lösungen mit weiteren Ideen zum Strukturieren Ihrer Cloud Firestore-Datenbank

Daten schützen

Unabhängig davon, ob Sie Cloud Firestore Security Rules für Android-, Apple- oder Webclients oder Identity Access Management (IAM) für Server verwenden, müssen Sie Ihre Daten sowohl in Cloud Firestore als auch in Realtime Database schützen. Die Nutzerauthentifizierung wird für beide Datenbanken von Authentication übernommen. Sie müssen Ihre Authentication-Implementierung also nicht ändern, wenn Sie Cloud Firestore verwenden.

Wichtige Unterschiede

  • Mobile und Web-SDKs verwenden Cloud Firestore Security Rules, während Server-SDKs Identity Access Management (IAM) zum Sichern von Daten verwenden.
  • Cloud Firestore Security Rules werden nicht kaskadiert, es sei denn, Sie verwenden einen Platzhalter. Dokumente und Sammlungen erben Regeln nicht auf andere Weise.
  • Sie müssen Daten nicht mehr separat validieren (wie in Realtime Database).
  • Cloud Firestore prüft Regeln, bevor eine Abfrage ausgeführt wird, um sicherzustellen, dass der Nutzer den entsprechenden Zugriff auf alle von der Abfrage zurückgegebenen Daten hat.

Verlaufsdaten zu Cloud Firestore übertragen

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 historische Daten abfragen möchten, fügen Sie einen Export Ihrer alten Daten in Ihre neue Cloud Firestore-Datenbank ein. 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, achten Sie darauf, dass neue Daten, die Cloud Firestore von Cloud Functions hinzugefügt werden, Vorrang haben.

So migrieren Sie Verlaufsdaten zu Cloud Firestore:

  1. Exportieren Sie Ihre Daten aus Realtime Database oder verwenden Sie eine aktuelle Sicherung.
    1. Rufen Sie in der Firebase Console Datenbanken & Speicher > Realtime Database auf.
    2. Wählen Sie auf dem Tab Daten den Knoten auf Stammebene Ihrer Datenbank und dann im Menü JSON exportieren aus.
  2. Erstellen Sie Ihre 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 migrieren:

    • Ein benutzerdefiniertes Script schreiben, das Ihre Daten für Sie portiert. Wir können keine Vorlage für dieses Script anbieten, da jede Datenbank individuelle Anforderungen hat. Cloud Firestore-Experten in unserem Slack-Kanal oder auf Stack Overflow können Ihr Script überprüfen oder Ratschläge für Ihre spezielle Situation geben.
    • Mit den Server-SDKs (Node.js, Java, Python oder Go) können Sie Daten direkt in Cloud Firestore schreiben. Eine Anleitung zum Einrichten der Server-SDKs finden Sie unter Erste Schritte.
    • Um große Datenmigrationen zu beschleunigen, verwenden Sie Batchschreibvorgänge und senden Sie bis zu 500 Vorgänge in einer einzigen Netzwerkanfrage.
    • Um die Cloud Firestore-Ratenbeschränkungen einzuhalten, sollten Sie die Vorgänge auf 500 Schreibvorgänge pro Sekunde für jede Sammlung begrenzen.

Neue Daten zu Cloud Firestore hinzufügen

Um die Parität zwischen Ihren Datenbanken aufrechtzuerhalten, fügen Sie beiden Datenbanken in Echtzeit neue Daten hinzu. Verwenden Sie Cloud Functions, um einen Schreibvorgang in Cloud Firestore auszulösen, wenn ein Client in Realtime Database schreibt. Achten Sie darauf, dass Cloud Firestore neuen Daten aus Cloud Functions Vorrang vor allen Schreibvorgängen gibt, die Sie bei der Migration Ihrer Verlaufsdaten vornehmen.

Erstellen Sie eine Funktion, um neue oder sich ändernde Daten in Cloud Firestore zu schreiben, 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 sich entschieden haben, Cloud Firestore als primäre Datenbank für einige Ihrer Daten zu verwenden, müssen Sie alle von Ihnen eingerichteten Funktionen zur Datenspiegelung berücksichtigen und Ihre Cloud Firestore Security Rules validieren.

  1. Wenn Sie Cloud Functions verwendet haben, um die Parität zwischen Ihren Datenbanken aufrechtzuerhalten, achten Sie darauf, dass Sie Schreibvorgänge nicht in einer Schleife in beiden Datenbanken duplizieren. Stellen Sie Ihre Funktion so um, dass sie in eine einzelne Datenbank schreibt, oder entfernen Sie die Funktion vollständig und beginnen Sie, die Schreibfunktion für die migrierten Daten in Apps, die noch mit Realtime Database verknüpft sind, schrittweise einzustellen. 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 angemessen geschützt sind. Prüfen Sie Ihre Cloud Firestore Security Rules- oder IAM-Einrichtung.