Cloud Firestore-Datenmodell

Cloud Firestore ist eine dokumentenorientierte NoSQL-Datenbank. Im Gegensatz zu einer SQL-Datenbank gibt es keine Tabellen oder Zeilen. Stattdessen speichern Sie Daten in Dokumenten , die in Sammlungen organisiert sind.

Jedes Dokument enthält eine Reihe von Schlüssel-Wert-Paaren. Cloud Firestore ist für das Speichern großer Sammlungen kleiner Dokumente optimiert.

Alle Dokumente müssen in Sammlungen aufbewahrt werden. Dokumente können untergeordnete Sammlungen und verschachtelte Objekte enthalten, die beide primitive Felder wie Zeichenfolgen oder komplexe Objekte wie Listen enthalten können.

Sammlungen und Dokumente werden implizit in Cloud Firestore erstellt. Ordnen Sie Daten einfach einem Dokument innerhalb einer Sammlung zu. Wenn entweder die Sammlung oder das Dokument nicht vorhanden ist, erstellt Cloud Firestore es.

Unterlagen

In Cloud Firestore ist die Speichereinheit das Dokument. Ein Dokument ist ein einfacher Datensatz, der Felder enthält, die Werten zugeordnet sind. Jedes Dokument wird durch einen Namen identifiziert.

Ein Dokument, das einen Benutzer alovelace , könnte so aussehen:

  • Alovelace

    first : "Ada"
    last : "Lovelace"
    born : 1815

Komplexe, verschachtelte Objekte in einem Dokument werden Karten genannt. Beispielsweise könnten Sie den Namen des Benutzers aus dem obigen Beispiel mit einer Karte wie folgt strukturieren:

  • Alovelace

    name :
    first : "Ada"
    last : "Lovelace"
    born : 1815

Möglicherweise stellen Sie fest, dass Dokumente JSON sehr ähnlich sehen. Tatsächlich sind sie es im Grunde. Es gibt einige Unterschiede (z. B. unterstützen Dokumente zusätzliche Datentypen und sind in der Größe auf 1 MB begrenzt), aber im Allgemeinen können Sie Dokumente als einfache JSON-Datensätze behandeln.

Sammlungen

Dokumente leben in Sammlungen, die einfach Container für Dokumente sind. Beispielsweise könnten Sie eine users haben, die Ihre verschiedenen Benutzer enthält, die jeweils durch ein Dokument repräsentiert werden:

  • -Benutzer

    • Alovelace

      first : "Ada"
      last : "Lovelace"
      born : 1815

    • first : "Alan"
      last : "Turing"
      born : 1912

Cloud Firestore ist schemalos, sodass Sie völlig frei entscheiden können, welche Felder Sie in jedes Dokument einfügen und welche Datentypen Sie in diesen Feldern speichern. Dokumente innerhalb derselben Sammlung können alle unterschiedliche Felder enthalten oder unterschiedliche Datentypen in diesen Feldern speichern. Es empfiehlt sich jedoch, dieselben Felder und Datentypen in mehreren Dokumenten zu verwenden, damit Sie die Dokumente einfacher abfragen können.

Eine Sammlung enthält Dokumente und sonst nichts. Es kann nicht direkt Rohfelder mit Werten enthalten, und es kann keine anderen Sammlungen enthalten. (Unter Hierarchische Daten finden Sie eine Erläuterung zur Strukturierung komplexerer Daten in Cloud Firestore.)

Die Namen von Dokumenten innerhalb einer Sammlung sind eindeutig. Sie können Ihre eigenen Schlüssel bereitstellen, z. B. Benutzer-IDs, oder Cloud Firestore automatisch zufällige IDs für Sie erstellen lassen.

Sie müssen Sammlungen nicht „erstellen“ oder „löschen“. Nachdem Sie das erste Dokument in einer Sammlung erstellt haben, ist die Sammlung vorhanden. Wenn Sie alle Dokumente in einer Sammlung löschen, ist diese nicht mehr vorhanden.

Verweise

Jedes Dokument in Cloud Firestore wird durch seinen Speicherort in der Datenbank eindeutig identifiziert. Das vorherige Beispiel zeigte ein Dokument innerhalb der users alovelace Um in Ihrem Code auf diese Stelle zu verweisen, können Sie einen Verweis darauf erstellen.

Web version 9

import { doc } from "firebase/firestore";

const alovelaceDocumentRef = doc(db, 'users', 'alovelace');

Web version 8

var alovelaceDocumentRef = db.collection('users').doc('alovelace');
Schnell
Hinweis: Dieses Produkt ist auf watchOS- und App Clip-Zielen nicht verfügbar.
let alovelaceDocumentRef = db.collection("users").document("alovelace")
Ziel c
Hinweis: Dieses Produkt ist auf watchOS- und App Clip-Zielen nicht verfügbar.
FIRDocumentReference *alovelaceDocumentRef =
    [[self.db collectionWithPath:@"users"] documentWithPath:@"alovelace"];

Java

DocumentReference alovelaceDocumentRef = db.collection("users").document("alovelace");

Kotlin+KTX

val alovelaceDocumentRef = db.collection("users").document("alovelace")

Dart

final alovelaceDocumentRef = db.collection("users").doc("alovelace");
Java
// Reference to a document with id "alovelace" in the collection "users"
DocumentReference document = db.collection("users").document("alovelace");
Python
a_lovelace_ref = db.collection(u'users').document(u'alovelace')

Python

a_lovelace_ref = db.collection("users").document("alovelace")
C++
DocumentReference alovelace_document_reference =
    db->Collection("users").Document("alovelace");
Node.js
const alovelaceDocumentRef = db.collection('users').doc('alovelace');
gehen
alovelaceRef := client.Collection("users").Doc("alovelace")
PHP
$document = $db->collection('samples/php/users')->document('alovelace');
Einheit
DocumentReference documentRef = db.Collection("users").Document("alovelace");
C#
DocumentReference documentRef = db.Collection("users").Document("alovelace");
Rubin
document_ref = firestore.col("users").doc("alovelace")

Eine Referenz ist ein leichtes Objekt, das lediglich auf einen Ort in Ihrer Datenbank verweist. Sie können eine Referenz erstellen, unabhängig davon, ob dort Daten vorhanden sind oder nicht, und durch das Erstellen einer Referenz werden keine Netzwerkoperationen ausgeführt.

Sie können auch Verweise auf Sammlungen erstellen:

Web version 9

import { collection } from "firebase/firestore";

const usersCollectionRef = collection(db, 'users');

Web version 8

var usersCollectionRef = db.collection('users');
Schnell
Hinweis: Dieses Produkt ist auf watchOS- und App Clip-Zielen nicht verfügbar.
let usersCollectionRef = db.collection("users")
Ziel c
Hinweis: Dieses Produkt ist auf watchOS- und App Clip-Zielen nicht verfügbar.
FIRCollectionReference *usersCollectionRef = [self.db collectionWithPath:@"users"];

Java

CollectionReference usersCollectionRef = db.collection("users");

Kotlin+KTX

val usersCollectionRef = db.collection("users")

Dart

final usersCollectionRef = db.collection("users");
Java
// Reference to the collection "users"
CollectionReference collection = db.collection("users");
Python
users_ref = db.collection(u'users')

Python

users_ref = db.collection("users")
C++
CollectionReference users_collection_reference = db->Collection("users");
Node.js
const usersCollectionRef = db.collection('users');
gehen
usersRef := client.Collection("users")
PHP
$collection = $db->collection('samples/php/users');
Einheit
CollectionReference collectionRef = db.Collection("users");
C#
CollectionReference collectionRef = db.Collection("users");
Rubin
collection_ref = firestore.col "users"

Der Einfachheit halber können Sie auch Verweise erstellen, indem Sie den Pfad zu einem Dokument oder einer Sammlung als Zeichenfolge angeben, wobei die Pfadkomponenten durch einen Schrägstrich ( / ) getrennt sind. Um beispielsweise einen Verweis auf das alovelace Dokument zu erstellen:

Web version 9

import { doc } from "firebase/firestore"; 

const alovelaceDocumentRef = doc(db, 'users/alovelace');

Web version 8

var alovelaceDocumentRef = db.doc('users/alovelace');
Schnell
Hinweis: Dieses Produkt ist auf watchOS- und App Clip-Zielen nicht verfügbar.
let aLovelaceDocumentReference = db.document("users/alovelace")
Ziel c
Hinweis: Dieses Produkt ist auf watchOS- und App Clip-Zielen nicht verfügbar.
FIRDocumentReference *aLovelaceDocumentReference =
    [self.db documentWithPath:@"users/alovelace"];

Java

DocumentReference alovelaceDocumentRef = db.document("users/alovelace");

Kotlin+KTX

val alovelaceDocumentRef = db.document("users/alovelace")

Dart

final aLovelaceDocRef = db.doc("users/alovelace");
Java
// Reference to a document with id "alovelace" in the collection "users"
DocumentReference document = db.document("users/alovelace");
Python
a_lovelace_ref = db.document(u'users/alovelace')

Python

a_lovelace_ref = db.document("users/alovelace")
C++
DocumentReference alovelace_document = db->Document("users/alovelace");
Node.js
const alovelaceDocumentRef = db.doc('users/alovelace');
gehen
alovelaceRef := client.Doc("users/alovelace")
PHP
$document = $db->document('users/alovelace');
Einheit
DocumentReference documentRef = db.Document("users/alovelace");
C#
DocumentReference documentRef = db.Document("users/alovelace");
Rubin
document_path_ref = firestore.doc "users/alovelace"

Hierarchische Daten

Um zu verstehen, wie hierarchische Datenstrukturen in Cloud Firestore funktionieren, betrachten Sie eine Beispiel-Chat-App mit Nachrichten und Chatrooms.

Sie können eine Sammlung namens rooms erstellen, um verschiedene Chatrooms zu speichern:

    • name : "my chat room"

    • ...

Jetzt, wo Sie Chatrooms haben, entscheiden Sie, wie Sie Ihre Nachrichten speichern möchten. Möglicherweise möchten Sie sie nicht im Dokument des Chatrooms speichern. Dokumente in Cloud Firestore sollten leicht sein, und ein Chatroom kann eine große Anzahl von Nachrichten enthalten. Sie können jedoch innerhalb des Dokuments Ihres Chatrooms zusätzliche Sammlungen als Untersammlungen erstellen.

Untersammlungen

Die beste Methode zum Speichern von Nachrichten in diesem Szenario ist die Verwendung von Untersammlungen. Eine Untersammlung ist eine Sammlung, die einem bestimmten Dokument zugeordnet ist.

Sie können für jedes Raumdokument in Ihrer rooms eine Untersammlung namens messages erstellen:

    • name : "my chat room"

      • -Nachrichten

        • Nachricht1

          from : "alex"
          msg : "Hello World!"

        • Nachricht2

          ...

    • ...

In diesem Beispiel würden Sie mit dem folgenden Code einen Verweis auf eine Nachricht in der Untersammlung erstellen:

Web version 9

import { doc } from "firebase/firestore"; 

const messageRef = doc(db, "rooms", "roomA", "messages", "message1");

Web version 8

var messageRef = db.collection('rooms').doc('roomA')
                .collection('messages').doc('message1');
Schnell
Hinweis: Dieses Produkt ist auf watchOS- und App Clip-Zielen nicht verfügbar.
let messageRef = db
    .collection("rooms").document("roomA")
    .collection("messages").document("message1")
Ziel c
Hinweis: Dieses Produkt ist auf watchOS- und App Clip-Zielen nicht verfügbar.
FIRDocumentReference *messageRef =
    [[[[self.db collectionWithPath:@"rooms"] documentWithPath:@"roomA"]
    collectionWithPath:@"messages"] documentWithPath:@"message1"];

Java

DocumentReference messageRef = db
        .collection("rooms").document("roomA")
        .collection("messages").document("message1");

Kotlin+KTX

val messageRef = db
        .collection("rooms").document("roomA")
        .collection("messages").document("message1")

Dart

final messageRef = db
    .collection("rooms")
    .doc("roomA")
    .collection("messages")
    .doc("message1");
Java
// Reference to a document in subcollection "messages"
DocumentReference document =
    db.collection("rooms").document("roomA").collection("messages").document("message1");
Python
room_a_ref = db.collection(u'rooms').document(u'roomA')
message_ref = room_a_ref.collection(u'messages').document(u'message1')

Python

room_a_ref = db.collection("rooms").document("roomA")
message_ref = room_a_ref.collection("messages").document("message1")
C++
DocumentReference message_reference = db->Collection("rooms")
    .Document("roomA")
    .Collection("messages")
    .Document("message1");
Node.js
const messageRef = db.collection('rooms').doc('roomA')
  .collection('messages').doc('message1');
gehen
messageRef := client.Collection("rooms").Doc("roomA").
	Collection("messages").Doc("message1")
PHP
$document = $db
    ->collection('rooms')
    ->document('roomA')
    ->collection('messages')
    ->document('message1');
Einheit
DocumentReference documentRef = db
	.Collection("Rooms").Document("RoomA")
	.Collection("Messages").Document("Message1");
C#
DocumentReference documentRef = db
    .Collection("Rooms").Document("RoomA")
    .Collection("Messages").Document("Message1");
Rubin
message_ref = firestore.col("rooms").doc("roomA").col("messages").doc("message1")

Beachten Sie das abwechselnde Muster von Sammlungen und Dokumenten. Ihre Sammlungen und Dokumente müssen immer diesem Muster folgen. Sie können nicht auf eine Sammlung in einer Sammlung oder ein Dokument in einem Dokument verweisen.

Mit Untersammlungen können Sie Daten hierarchisch strukturieren, wodurch der Datenzugriff erleichtert wird. Um alle messages in roomA , können Sie einen Sammlungsverweis auf die Untersammlungsnachrichten erstellen und damit wie mit jedem anderen Sammlungsverweis interagieren.

Dokumente in Untersammlungen können auch Untersammlungen enthalten, sodass Sie Daten weiter verschachteln können. Sie können Daten bis zu 100 Ebenen tief verschachteln.