Model danych Cloud Firestore

Cloud Firestore to baza danych NoSQL zorientowana na dokumenty. W przeciwieństwie do bazy danych SQL nie ma w niej tabel ani wierszy. Zamiast tego przechowujesz dane w dokumentach , które są zorganizowane w kolekcje .

Każdy dokument zawiera zestaw par klucz-wartość. Cloud Firestore jest zoptymalizowany do przechowywania dużych kolekcji małych dokumentów.

Wszystkie dokumenty muszą być przechowywane w zbiorach. Dokumenty mogą zawierać podkolekcje i obiekty zagnieżdżone, przy czym oba mogą zawierać pola pierwotne, takie jak ciągi znaków, lub obiekty złożone, takie jak listy.

Kolekcje i dokumenty są tworzone niejawnie w Cloud Firestore. Po prostu przypisz dane do dokumentu w kolekcji. Jeśli kolekcja lub dokument nie istnieje, Cloud Firestore ją utworzy.

Dokumenty

W Cloud Firestore jednostką przechowywania jest dokument. Dokument to lekki rekord zawierający pola, które są mapowane na wartości. Każdy dokument jest identyfikowany poprzez nazwę.

Dokument reprezentujący alovelace użytkownika może wyglądać następująco:

  • miłość

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

Złożone, zagnieżdżone obiekty w dokumencie nazywane są mapami. Na przykład możesz uporządkować nazwę użytkownika z powyższego przykładu za pomocą mapy w następujący sposób:

  • miłość

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

Możesz zauważyć, że dokumenty wyglądają bardzo podobnie do JSON. W zasadzie takie są. Istnieją pewne różnice (na przykład dokumenty obsługują dodatkowe typy danych i mają ograniczony rozmiar do 1 MB), ale ogólnie rzecz biorąc, dokumenty można traktować jako lekkie rekordy JSON.

Kolekcje

Dokumenty żyją w kolekcjach, które są po prostu pojemnikami na dokumenty. Na przykład możesz mieć kolekcję users zawierającą różnych użytkowników, z których każdy jest reprezentowany przez dokument:

  • użytkownicy

    • miłość

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

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

Cloud Firestore nie jest schematyczny, więc masz pełną swobodę w zakresie pól, które umieścisz w każdym dokumencie i typów danych przechowywanych w tych polach. Dokumenty w tej samej kolekcji mogą zawierać różne pola lub przechowywać w tych polach różne typy danych. Jednak dobrym pomysłem jest używanie tych samych pól i typów danych w wielu dokumentach, aby móc łatwiej przeglądać dokumenty.

Kolekcja zawiera dokumenty i nic więcej. Nie może bezpośrednio zawierać surowych pól z wartościami i nie może zawierać innych kolekcji. (Zobacz Dane hierarchiczne , aby uzyskać wyjaśnienie, jak strukturyzować bardziej złożone dane w Cloud Firestore.)

Nazwy dokumentów w kolekcji są unikalne. Możesz podać własne klucze, takie jak identyfikatory użytkowników, lub możesz pozwolić Cloud Firestore na automatyczne utworzenie losowych identyfikatorów.

Nie musisz „tworzyć” ani „usuwać” kolekcji. Po utworzeniu pierwszego dokumentu w kolekcji kolekcja istnieje. Jeśli usuniesz wszystkie dokumenty w kolekcji, ta już nie istnieje.

Bibliografia

Każdy dokument w Cloud Firestore jest jednoznacznie identyfikowany na podstawie jego lokalizacji w bazie danych. Poprzedni przykład pokazał alovelace dokumentu w obrębie kolekcji users . Aby odwołać się do tej lokalizacji w kodzie, możesz utworzyć do niej odniesienie .

Web modular API

import { doc } from "firebase/firestore";

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

Web namespaced API

var alovelaceDocumentRef = db.collection('users').doc('alovelace');
Szybki
Uwaga: ten produkt nie jest dostępny w systemach docelowych watchOS i App Clip.
let alovelaceDocumentRef = db.collection("users").document("alovelace")
Cel C
Uwaga: ten produkt nie jest dostępny w systemach docelowych watchOS i App Clip.
FIRDocumentReference *alovelaceDocumentRef =
    [[self.db collectionWithPath:@"users"] documentWithPath:@"alovelace"];

Kotlin+KTX

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

Java

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

Dart

final alovelaceDocumentRef = db.collection("users").doc("alovelace");
Jawa
// Reference to a document with id "alovelace" in the collection "users"
DocumentReference document = db.collection("users").document("alovelace");
Pyton
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');
Iść

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

func createDocReference(client *firestore.Client) {

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

	_ = alovelaceRef
}
PHP

PHP

Więcej informacji na temat instalowania i tworzenia klienta Cloud Firestore można znaleźć w Bibliotekach klienta Cloud Firestore .

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

C#

Więcej informacji na temat instalowania i tworzenia klienta Cloud Firestore można znaleźć w Bibliotekach klienta Cloud Firestore .

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

Referencja to lekki obiekt, który po prostu wskazuje lokalizację w bazie danych. Możesz utworzyć odniesienie niezależnie od tego, czy istnieją tam dane, czy nie, a utworzenie odniesienia nie powoduje wykonania żadnych operacji sieciowych.

Możesz także tworzyć odniesienia do kolekcji :

Web modular API

import { collection } from "firebase/firestore";

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

Web namespaced API

var usersCollectionRef = db.collection('users');
Szybki
Uwaga: ten produkt nie jest dostępny w systemach docelowych watchOS i App Clip.
let usersCollectionRef = db.collection("users")
Cel C
Uwaga: ten produkt nie jest dostępny w systemach docelowych watchOS i App Clip.
FIRCollectionReference *usersCollectionRef = [self.db collectionWithPath:@"users"];

Kotlin+KTX

val usersCollectionRef = db.collection("users")

Java

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

Dart

final usersCollectionRef = db.collection("users");
Jawa
// Reference to the collection "users"
CollectionReference collection = db.collection("users");
Pyton
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');
Iść

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

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

	_ = usersRef
}
PHP

PHP

Więcej informacji na temat instalowania i tworzenia klienta Cloud Firestore można znaleźć w Bibliotekach klienta Cloud Firestore .

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

C#

Więcej informacji na temat instalowania i tworzenia klienta Cloud Firestore można znaleźć w Bibliotekach klienta Cloud Firestore .

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

Dla wygody można także tworzyć odniesienia, określając ścieżkę do dokumentu lub kolekcji w postaci ciągu znaków, przy czym składniki ścieżki oddzielone są ukośnikiem ( / ). Na przykład, aby utworzyć odniesienie do dokumentu alovelace :

Web modular API

import { doc } from "firebase/firestore"; 

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

Web namespaced API

var alovelaceDocumentRef = db.doc('users/alovelace');
Szybki
Uwaga: ten produkt nie jest dostępny w systemach docelowych watchOS i App Clip.
let aLovelaceDocumentReference = db.document("users/alovelace")
Cel C
Uwaga: ten produkt nie jest dostępny w systemach docelowych watchOS i App Clip.
FIRDocumentReference *aLovelaceDocumentReference =
    [self.db documentWithPath:@"users/alovelace"];

Kotlin+KTX

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

Java

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

Dart

final aLovelaceDocRef = db.doc("users/alovelace");
Jawa
// Reference to a document with id "alovelace" in the collection "users"
DocumentReference document = db.document("users/alovelace");
Pyton
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');
Iść

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

Więcej informacji na temat instalowania i tworzenia klienta Cloud Firestore można znaleźć w Bibliotekach klienta Cloud Firestore .

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

C#

Więcej informacji na temat instalowania i tworzenia klienta Cloud Firestore można znaleźć w Bibliotekach klienta Cloud Firestore .

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

Dane hierarchiczne

Aby zrozumieć, jak działają hierarchiczne struktury danych w Cloud Firestore, rozważ przykładową aplikację do czatowania z wiadomościami i pokojami rozmów.

Możesz utworzyć kolekcję zwaną rooms , w której będą przechowywane różne pokoje rozmów:

  • pokoje

    • sala A

      name : "my chat room"

    • sala B

      ...

Teraz, gdy masz już pokoje rozmów, zdecyduj, jak przechowywać wiadomości. Możesz nie chcieć przechowywać ich w dokumencie pokoju rozmów. Dokumenty w Cloud Firestore powinny być lekkie, a pokój rozmów może zawierać dużą liczbę wiadomości. Możesz jednak tworzyć dodatkowe kolekcje w dokumencie swojego pokoju rozmów jako podkolekcje.

Podkolekcje

Najlepszym sposobem przechowywania wiadomości w tym scenariuszu jest użycie kolekcji podrzędnych. Podkolekcja to zbiór powiązany z konkretnym dokumentem.

Możesz utworzyć podkolekcję o nazwie messages dla każdego dokumentu pokoju w kolekcji rooms :

  • pokoje

    • sala A

      name : "my chat room"

      • wiadomości

        • wiadomość 1

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

        • wiadomość 2

          ...

    • sala B

      ...

W tym przykładzie utworzysz odwołanie do wiadomości w podkolekcji za pomocą następującego kodu:

Web modular API

import { doc } from "firebase/firestore"; 

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

Web namespaced API

var messageRef = db.collection('rooms').doc('roomA')
                .collection('messages').doc('message1');
Szybki
Uwaga: ten produkt nie jest dostępny w systemach docelowych watchOS i App Clip.
let messageRef = db
  .collection("rooms").document("roomA")
  .collection("messages").document("message1")
Cel C
Uwaga: ten produkt nie jest dostępny w systemach docelowych watchOS i App Clip.
FIRDocumentReference *messageRef =
    [[[[self.db collectionWithPath:@"rooms"] documentWithPath:@"roomA"]
    collectionWithPath:@"messages"] documentWithPath:@"message1"];

Kotlin+KTX

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");
Jawa
// Reference to a document in subcollection "messages"
DocumentReference document =
    db.collection("rooms").document("roomA").collection("messages").document("message1");
Pyton
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');
Iść

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

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

	_ = messageRef
}
PHP

PHP

Więcej informacji na temat instalowania i tworzenia klienta Cloud Firestore można znaleźć w Bibliotekach klienta Cloud Firestore .

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

C#

Więcej informacji na temat instalowania i tworzenia klienta Cloud Firestore można znaleźć w Bibliotekach klienta Cloud Firestore .

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

Zwróć uwagę na naprzemienny układ zbiorów i dokumentów. Twoje zbiory i dokumenty muszą zawsze być zgodne z tym wzorem. Nie można odwoływać się do kolekcji w kolekcji ani do dokumentu w dokumencie.

Podkolekcje umożliwiają hierarchiczną strukturę danych, dzięki czemu dostęp do nich jest łatwiejszy. Aby uzyskać wszystkie wiadomości w roomA , możesz utworzyć odniesienie do kolekcji dla messages podkolekcji i wchodzić w interakcję z nią tak, jak w przypadku każdego innego odniesienia do kolekcji.

Dokumenty w podkolekcjach mogą również zawierać podkolekcje, co pozwala na dalsze zagnieżdżanie danych. Dane można zagnieżdżać na głębokość do 100 poziomów.