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 dane są przechowywane w dokumentach, które są uporządkowane w kolekcje.

Każdy dokument zawiera zestaw par klucz-wartość. Cloud Firestore jest zoptymalizowana pod kątem przechowywania dużych zbiorów małych dokumentów.

Wszystkie dokumenty muszą być przechowywane w kolekcjach. Dokumenty mogą zawierać podkolekcje i zagnieżdżone obiekty, które mogą zawierać pola podstawowe, takie jak ciągi znaków, lub złożone obiekty, takie jak listy.

Kolekcje i dokumenty są tworzone niejawnie w Cloud Firestore. Wystarczy przypisać dane do dokumentu w kolekcji. Jeśli kolekcja lub dokument nie istnieje, Cloud Firestore utworzy je.

Dokumenty

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

Dokument reprezentujący użytkownika alovelace może wyglądać tak:

  • alovelace

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

Złożone, zagnieżdżone obiekty w dokumencie są nazywane mapami. Możesz na przykład utworzyć mapę z nazwą użytkownika z przykładu powyżej w ten sposób:

  • alovelace

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

Możesz zauważyć, że dokumenty bardzo przypominają format JSON. W zasadzie tak jest. Istnieją pewne różnice (np. dokumenty obsługują dodatkowe typy danych i mają ograniczenie rozmiaru do 1 MB), ale ogólnie można traktować dokumenty jako lekkie rekordy JSON.

Kolekcje

Dokumenty znajdują się w kolekcjach, które są po prostu kontenerami na dokumenty. Możesz na przykład utworzyć users kolekcję, która będzie zawierać różnych użytkowników, z których każdy będzie reprezentowany przez dokument:

  •  użytkowników

    • alovelace

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

    • aturing

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

Cloud Firestore nie ma schematu, więc masz pełną swobodę w określaniu, jakie pola mają się znajdować w poszczególnych dokumentach i jakie typy danych mają być w nich przechowywane. Dokumenty w tej samej kolekcji mogą zawierać różne pola lub przechowywać w nich różne typy danych. Warto jednak używać tych samych pól i typów danych w wielu dokumentach, aby łatwiej było wysyłać do nich zapytania.

Kolekcja zawiera dokumenty i nic więcej. Nie może bezpośrednio zawierać surowych pól z wartościami ani innych kolekcji. (Więcej informacji o tym, jak strukturyzować bardziej złożone dane w Cloud Firestore, znajdziesz w sekcji Dane hierarchiczne).

Nazwy dokumentów w kolekcji są unikalne. Możesz podać własne klucze, np. identyfikatory użytkowników, lub pozwolić Cloud Firestore automatycznie tworzyć losowe identyfikatory.

Nie musisz „tworzyć” ani „usuwać” kolekcji. Gdy utworzysz pierwszy dokument w kolekcji, kolekcja będzie istnieć. Jeśli usuniesz wszystkie dokumenty z kolekcji, przestanie ona istnieć.

Odniesienia

Każdy dokument w Cloud Firestore jest jednoznacznie identyfikowany przez jego lokalizację w bazie danych. W poprzednim przykładzie pokazano dokument alovelace w kolekcji users. Aby odwołać się do tej lokalizacji w kodzie, możesz utworzyć do niej odwołanie.

Web

import { doc } from "firebase/firestore";

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

Web

var alovelaceDocumentRef = db.collection('users').doc('alovelace');
Swift
Uwaga: ten produkt nie jest dostępny na platformach watchOS i w przypadku klipów aplikacji.
let alovelaceDocumentRef = db.collection("users").document("alovelace")
Objective-C
Uwaga: ten produkt nie jest dostępny na platformach watchOS i w przypadku klipów aplikacji.
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

Więcej informacji o instalowaniu i tworzeniu klienta Cloud Firestore znajdziesz w sekcji Cloud FirestoreBiblioteki klienta.

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

C#

Więcej informacji o instalowaniu i tworzeniu klienta Cloud Firestore znajdziesz w sekcji Cloud FirestoreBiblioteki klienta.

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

Odwołanie to prosty obiekt, który wskazuje tylko lokalizację w bazie danych. Możesz utworzyć odwołanie niezależnie od tego, czy dane istnieją, a utworzenie odwołania nie powoduje żadnych operacji sieciowych.

Możesz też tworzyć odwołania do kolekcji:

Web

import { collection } from "firebase/firestore";

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

Web

var usersCollectionRef = db.collection('users');
Swift
Uwaga: ten produkt nie jest dostępny na platformach watchOS i w przypadku klipów aplikacji.
let usersCollectionRef = db.collection("users")
Objective-C
Uwaga: ten produkt nie jest dostępny na platformach watchOS i w przypadku klipów aplikacji.
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

Więcej informacji o instalowaniu i tworzeniu klienta Cloud Firestore znajdziesz w sekcji Cloud FirestoreBiblioteki klienta.

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

C#

Więcej informacji o instalowaniu i tworzeniu klienta Cloud Firestore znajdziesz w sekcji Cloud FirestoreBiblioteki klienta.

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

Dla wygody możesz też tworzyć odwołania, podając ścieżkę do dokumentu lub kolekcji jako ciąg znaków, w którym poszczególne elementy ścieżki są oddzielone ukośnikiem (/). Aby na przykład utworzyć odwołanie do dokumentu alovelace:

Web

import { doc } from "firebase/firestore"; 

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

Web

var alovelaceDocumentRef = db.doc('users/alovelace');
Swift
Uwaga: ten produkt nie jest dostępny na platformach watchOS i w przypadku klipów aplikacji.
let aLovelaceDocumentReference = db.document("users/alovelace")
Objective-C
Uwaga: ten produkt nie jest dostępny na platformach watchOS i w przypadku klipów aplikacji.
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

Więcej informacji o instalowaniu i tworzeniu klienta Cloud Firestore znajdziesz w sekcji Cloud FirestoreBiblioteki klienta.

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

C#

Więcej informacji o instalowaniu i tworzeniu klienta Cloud Firestore znajdziesz w sekcji Cloud FirestoreBiblioteki klienta.

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

Dane hierarchiczne

Aby zrozumieć, jak działają hierarchiczne struktury danych w Cloud Firestore, rozważmy przykład aplikacji do czatowania z wiadomościami i pokojami.

Możesz utworzyć kolekcję o nazwie rooms, aby przechowywać różne pokoje czatu:

  •  sal

    •  pokójA

      name : "my chat room"

    •  roomB

      ...

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

Podkolekcje

W takim przypadku najlepiej przechowywać wiadomości w podzbiorach. Podkolekcja to kolekcja powiązana z konkretnym dokumentem.

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

  •  sal

    •  pokójA

      name : "my chat room"

      • wiadomości

        • message1

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

        • message2

          ...

    •  roomB

      ...

W tym przykładzie utworzysz odwołanie do wiadomości w podkolekcji za pomocą tego kodu:

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
Uwaga: ten produkt nie jest dostępny na platformach watchOS i w przypadku klipów aplikacji.
let messageRef = db
  .collection("rooms").document("roomA")
  .collection("messages").document("message1")
Objective-C
Uwaga: ten produkt nie jest dostępny na platformach watchOS i w przypadku klipów aplikacji.
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

Więcej informacji o instalowaniu i tworzeniu klienta Cloud Firestore znajdziesz w sekcji Cloud FirestoreBiblioteki klienta.

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

C#

Więcej informacji o instalowaniu i tworzeniu klienta Cloud Firestore znajdziesz w sekcji Cloud FirestoreBiblioteki klienta.

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

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

Podzbiory umożliwiają hierarchiczne strukturyzowanie danych, co ułatwia dostęp do nich. Aby uzyskać wszystkie wiadomości w roomA, możesz utworzyć odwołanie do kolekcji podrzędnej messages i pracować z nim tak samo jak z każdym innym odwołaniem do kolekcji.

Dokumenty w podkolekcjach mogą również zawierać podkolekcje, co pozwala na dalsze zagnieżdżanie danych. Dane możesz zagnieżdżać na maksymalnie 100 poziomach.