Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

Cloud Firestore-Datenmodell

Cloud Firestore ist eine dokumentorientierte 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 einen Satz von Schlüssel-Wert - Paaren. Cloud Firestore ist für die Speicherung großer Sammlungen kleiner Dokumente optimiert.

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

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

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 einen Benutzer darstellt alovelace könnte wie folgt aussehen:

  • alovelace

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

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

  • alovelace

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

Sie werden vielleicht feststellen, 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 beschränkt), aber im Allgemeinen können Sie Dokumente als einfache JSON-Datensätze behandeln.

Kollektionen

Dokumente leben in Sammlungen, die einfach Container für Dokumente sind. Zum Beispiel könnten Sie eine haben users Sammlung Ihre verschiedenen Benutzer enthalten, die jeweils durch ein Dokument dargestellt wird :

  • Benutzer

    • alovelace

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

    • aturing

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

Cloud Firestore ist schemalos, sodass Sie völlig frei entscheiden können, welche Felder Sie in die einzelnen Dokumente 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 Felder mit Werten enthalten und es kann keine anderen Sammlungen enthalten. (Siehe hierarchische Daten für eine Erläuterung, wie komplexe Daten in Cloud - Firestor zu strukturieren.)

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

Sie müssen keine Sammlungen "erstellen" oder "löschen". Nachdem Sie das erste Dokument in einer Sammlung erstellt haben, ist die Sammlung vorhanden. Wenn Sie alle Dokumente 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 alovelace innerhalb der Sammlung users . Um zu diesem Ort in Ihrem Code zu verweisen, können Sie einen Verweis darauf erstellen.

Webversion 9

import { doc } from "firebase/firestore";

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

Webversion 8

var alovelaceDocumentRef = db.collection('users').doc('alovelace');
Schnell
let alovelaceDocumentRef = db.collection("users").document("alovelace")
Ziel c
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")
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('lovelace');
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 leichtgewichtiges Objekt, das nur auf eine Position in Ihrer Datenbank verweist. Sie können eine Referenz erstellen, unabhängig davon, ob dort Daten vorhanden sind oder nicht, und das Erstellen einer Referenz führt keine Netzwerkoperationen aus.

Sie können auch Verweise auf Sammlungen erstellen:

Webversion 9

import { collection } from "firebase/firestore";

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

Webversion 8

var usersCollectionRef = db.collection('users');
Schnell
let usersCollectionRef = db.collection("users")
Ziel c
FIRCollectionReference *usersCollectionRef = [self.db collectionWithPath:@"users"];

Java

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

Kotlin+KTX

val 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 , die angibt, mit Pfadkomponenten durch einen Schrägstrich getrennt ( / ). Zum Beispiel einen Verweis auf das erstellen alovelace Dokument:

Webversion 9

import { doc } from "firebase/firestore"; 

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

Webversion 8

var alovelaceDocumentRef = db.doc('users/alovelace');
Schnell
let aLovelaceDocumentReference = db.document("users/alovelace")
Ziel c
FIRDocumentReference *aLovelaceDocumentReference =
    [self.db documentWithPath:@"users/alovelace"];

Java

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

Kotlin+KTX

val alovelaceDocumentRef = db.document("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/lovelace');
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 schaffen rooms verschiedene Chat - Räume zu speichern:

  • Zimmer

    • Rooma

      name : "my chat room"

    • roomB

      ...

Da Sie nun über Chatrooms verfügen, können Sie entscheiden, wie Sie Ihre Nachrichten speichern möchten. Möglicherweise möchten Sie sie nicht im Dokument des Chatrooms speichern. Dokumente in Cloud Firestore sollten leichtgewichtig 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 Möglichkeit 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 eine Untersammlung genannt erstellen messages für jeden Raum - Dokument in Ihrem rooms Sammlung:

  • Zimmer

    • Rooma

      name : "my chat room"

      • Nachrichten

        • message1

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

        • message2

          ...

    • roomB

      ...

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

Webversion 9

import { doc } from "firebase/firestore"; 

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

Webversion 8

var messageRef = db.collection('rooms').doc('roomA')
                .collection('messages').doc('message1');
Schnell
let messageRef = db
    .collection("rooms").document("roomA")
    .collection("messages").document("message1")
Ziel c
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")
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 auf ein Dokument in einem Dokument verweisen.

Untersammlungen ermöglichen es Ihnen, Daten hierarchisch zu strukturieren, wodurch der Zugriff auf die Daten erleichtert wird. Um alle Nachrichten in erhalten roomA , können Sie eine Sammlung Verweis auf die Untersammlung erstellen messages und mit ihm interagieren , wie Sie jede andere Sammlung Referenz.

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.