Cloud Firestore-Datenmodell

Cloud Firestore ist eine NoSQL-Dokumentendatenbank. Im Gegensatz zu einer SQL-Datenbank gibt es hier 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 gespeichert werden. Dokumente können sogenannte untergeordnete Sammlungen, auch Untersammlungen genannt, und verschachtelte Objekte enthalten, die wiederum aus einfachen Feldern wie Strings oder aus komplexen Objekten wie Listen bestehen können.

Sammlungen und Dokumente werden implizit in Cloud Firestore erstellt. Sie müssen einem Dokument innerhalb einer Sammlung einfach Daten zuordnen. Wenn die Sammlung oder das Dokument nicht vorhanden ist, wird sie/es von Cloud Firestore erstellt.

Dokumente

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

Ein Dokument, das den Nutzer alovelace repräsentiert, könnte etwa so aussehen:

  • alovelace

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

Komplexe, verschachtelte Objekte in einem Dokument werden als Maps bezeichnet. Sie können z. B. den Nutzernamen aus dem obigen Beispiel mit einer Map wie dieser strukturieren:

  • alovelace

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

Ihnen ist vielleicht schon aufgefallen, dass die Dokumente JSON sehr ähneln. Im Prinzip sind es JSON-Dokumente. Es gibt allerdings doch einige Unterschiede – Dokumente unterstützen beispielsweise zusätzliche Datentypen und sind auf 1 MB beschränkt –, aber im Allgemeinen können Sie Dokumente wie einfache JSON-Datensätze behandeln.

Sammlungen

Dokumente befinden sich in Sammlungen. Dies sind lediglich Container für Dokumente. Sie könnten beispielsweise die Sammlung users für Ihre verschiedenen Nutzer haben, die jeweils durch ein Dokument repräsentiert werden:

  • users

    • alovelace

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

    • aturing

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

Cloud Firestore ist schemalos. Sie können also frei entscheiden, welche Felder Sie in die einzelnen Dokumente einfügen und welche Datentypen Sie in diesen Feldern speichern. Dokumente in einer Sammlung können alle unterschiedliche Felder enthalten und in diesen Feldern können unterschiedliche Datentypen gespeichert werden. Es empfiehlt sich jedoch, dieselben Felder und Datentypen für mehrere Dokumente zu verwenden, denn so können Sie die Dokumente leichter abfragen.

Eine Sammlung enthält nur Dokumente. Sie darf weder direkt Standardfelder mit Werten noch andere Sammlungen enthalten. Unter Hierarchische Daten wird erläutert, wie komplexere Daten in Cloud Firestore strukturiert werden.

Die Namen der Dokumente in einer Sammlung müssen eindeutig sein. Sie können eigene Schlüssel wie Nutzer-IDs angeben oder Cloud Firestore automatisch zufällige IDs für Sie erstellen lassen.

Sie müssen Sammlungen weder selbst erstellen noch 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 sie nicht mehr vorhanden.

Verweise

Jedes Dokument in Cloud Firestore wird eindeutig durch seinen Speicherort in der Datenbank identifiziert. Im vorherigen Beispiel war ein Dokument alovelace in der Sammlung users enthalten. Wenn Sie in Ihrem Code auf diesen Standort verweisen möchten, können Sie eine entsprechende Referenz erstellen.

Web

import { doc } from "firebase/firestore";

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

Web

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

Kotlin

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

Java

DocumentReference 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("users").document("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');
Go

import (
	"cloud.google.com/go/firestore"
)

func createDocReference(client *firestore.Client) {

	alovelaceRef := client.Collection("users").Doc("alovelace")

	_ = alovelaceRef
}
PHP

PHP

Weitere Informationen zum Installieren und Erstellen eines Cloud Firestore-Clients finden Sie unter Cloud Firestore-Clientbibliotheken.

$document = $db->collection('samples/php/users')->document('alovelace');
Einheit
DocumentReference documentRef = db.Collection("users").Document("alovelace");
C#

C#

Weitere Informationen zum Installieren und Erstellen eines Cloud Firestore-Clients finden Sie unter Cloud Firestore-Clientbibliotheken.

DocumentReference documentRef = db.Collection("users").Document("alovelace");
Ruby
document_ref = firestore.col("users").doc("alovelace")

Eine Referenz ist ein einfaches Objekt, das nur auf einen Speicherort in einer Datenbank verweist. Sie können eine Referenz unabhängig davon erstellen, ob dort Daten vorhanden sind oder nicht. Beim Erstellen einer Referenz werden zudem keine Netzwerkvorgänge durchgeführt.

Auch auf Sammlungen können Sie Referenzen erstellen:

Web

import { collection } from "firebase/firestore";

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

Web

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

Kotlin

val usersCollectionRef = db.collection("users")

Java

CollectionReference 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("users")

Python

users_ref = db.collection("users")
C++
CollectionReference users_collection_reference = db->Collection("users");
Node.js
const usersCollectionRef = db.collection('users');
Go

import (
	"cloud.google.com/go/firestore"
)

func createCollectionReference(client *firestore.Client) {
	usersRef := client.Collection("users")

	_ = usersRef
}
PHP

PHP

Weitere Informationen zum Installieren und Erstellen eines Cloud Firestore-Clients finden Sie unter Cloud Firestore-Clientbibliotheken.

$collection = $db->collection('samples/php/users');
Einheit
CollectionReference collectionRef = db.Collection("users");
C#

C#

Weitere Informationen zum Installieren und Erstellen eines Cloud Firestore-Clients finden Sie unter Cloud Firestore-Clientbibliotheken.

CollectionReference collectionRef = db.Collection("users");
Ruby
collection_ref = firestore.col "users"

Einfacherweise können Sie auch Referenzen erstellen, wenn Sie den Pfad zu einem Dokument oder einer Sammlung als String angeben. Dabei müssen die Pfadkomponenten durch einen Schrägstrich (/) getrennt sein. So erstellen Sie beispielsweise eine Referenz auf das alovelace-Dokument:

Web

import { doc } from "firebase/firestore"; 

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

Web

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

Kotlin

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

Java

DocumentReference 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("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');
Go

import (
	"cloud.google.com/go/firestore"
)

func createDocReferenceFromString(client *firestore.Client) {
	// Reference to a document with id "alovelace" in the collection "users"
	alovelaceRef := client.Doc("users/alovelace")

	_ = alovelaceRef
}
PHP

PHP

Weitere Informationen zum Installieren und Erstellen eines Cloud Firestore-Clients finden Sie unter Cloud Firestore-Clientbibliotheken.

$document = $db->document('users/alovelace');
Einheit
DocumentReference documentRef = db.Document("users/alovelace");
C#

C#

Weitere Informationen zum Installieren und Erstellen eines Cloud Firestore-Clients finden Sie unter Cloud Firestore-Clientbibliotheken.

DocumentReference documentRef = db.Document("users/alovelace");
Ruby
document_path_ref = firestore.doc "users/alovelace"

Hierarchische Daten

Wie hierarchische Datenstrukturen in Cloud Firestore funktionieren, lässt sich gut an einer Beispiel-Chat-Anwendung mit Nachrichten und Chatrooms veranschaulichen.

Sie können eine Sammlung mit dem Namen rooms erstellen und darin verschiedene Chatrooms speichern:

  •  Räume

    • roomA

      name : "my chat room"

    • roomB

      ...

Nachdem Sie diese Chatrooms erstellt haben, können Sie entscheiden, wie Sie die Nachrichten speichern wollen. Sie sollten sie aber nicht im Dokument des Chatrooms speichern. Dokumente in Cloud Firestore sollten einfach sein und ein Chatroom kann eine große Anzahl von Nachrichten enthalten. Sie haben aber die Möglichkeit, im Dokument des Chatrooms zusätzliche Sammlungen als Untersammlungen zu 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.

Für jedes Chatroom-Dokument in der Sammlung rooms können Sie eine Untersammlung mit dem Namen messages erstellen:

  •  Räume

    • roomA

      name : "my chat room"

      • messages

        • message1

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

        • message2

          ...

    • roomB

      ...

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

Web

import { doc } from "firebase/firestore"; 

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

Web

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

Kotlin

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

Java

DocumentReference 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("rooms").document("roomA")
message_ref = room_a_ref.collection("messages").document("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');
Go

import (
	"cloud.google.com/go/firestore"
)

func createSubcollectionReference(client *firestore.Client) {
	messageRef := client.Collection("rooms").Doc("roomA").
		Collection("messages").Doc("message1")

	_ = messageRef
}
PHP

PHP

Weitere Informationen zum Installieren und Erstellen eines Cloud Firestore-Clients finden Sie unter Cloud Firestore-Clientbibliotheken.

$document = $db
    ->collection('rooms')
    ->document('roomA')
    ->collection('messages')
    ->document('message1');
Einheit
DocumentReference documentRef = db
	.Collection("Rooms").Document("RoomA")
	.Collection("Messages").Document("Message1");
C#

C#

Weitere Informationen zum Installieren und Erstellen eines Cloud Firestore-Clients finden Sie unter Cloud Firestore-Clientbibliotheken.

DocumentReference documentRef = db
    .Collection("Rooms").Document("RoomA")
    .Collection("Messages").Document("Message1");
Ruby
message_ref = firestore.col("rooms").doc("roomA").col("messages").doc("message1")

Beachten Sie das abwechselnde Muster von Sammlungen und Dokumenten. Die 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.

Mithilfe von Untersammlungen können Sie Daten hierarchisch strukturieren, um einfacher auf Daten zugreifen zu können. Wenn Sie alle Nachrichten roomA abrufen möchten, können Sie eine Sammlungsreferenz auf die Untersammlung messages erstellen und dann damit wie mit jeder anderen Sammlungsreferenz interagieren.

Dokumente in Untersammlungen können auch Untersammlungen enthalten, sodass Sie die Daten weiter verschachteln können. Daten können auf bis zu 100 Ebenen verschachtelt werden.