Model danych Cloud Firestore

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

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

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

Kolekcje i dokumenty są tworzone w Cloud Firestore w sposób bezpośredni. Po prostu przypisz dane do dokumentu w kolekcji. Jeśli kolekcja lub dokument nie istnieje, Cloud Firestore je utworzy.

Dokumenty

W Cloud Firestore jednostką pamięci masowej jest dokument. Dokument to prosty rekord zawierający pola, które są mapowane na wartości. Każdy dokument ma nazwę.

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ć strukturę nazwy użytkownika z powyższego przykładu za pomocą mapy:

  • alovelace

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

Możesz zauważyć, że dokumenty wyglądają podobnie do JSON. W zasadzie tak właśnie są. Istnieją pewne różnice (np. dokumenty obsługują dodatkowe typy danych, a ich rozmiar jest ograniczony do 1 MB), ale ogólnie można traktować dokumenty jak lekkie rekordy JSON.

Kolekcje

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

  • Użytkownicy: 

    • alovelace

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

    • Zjazd

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

Cloud Firestore działa bez schematów, więc masz pełną swobodę wyboru pól, które umieścisz w poszczególnych dokumentach, a także typów danych, które w nich przechowujesz. Dokumenty w tej samej kolekcji mogą zawierać różne pola lub przechowywać w tych polach różne typy danych. Warto jednak używać tych samych pól i typów danych w kilku dokumentach, ponieważ ułatwia to tworzenie zapytań dotyczących tych dokumentów.

Kolekcja zawiera dokumenty i nic więcej. Nie może zawierać bezpośrednio pól nieprzetworzonych z wartościami ani innych kolekcji. Wyjaśnienie sposobu tworzenia struktury bardziej złożonych danych w Cloud Firestore znajdziesz w artykule Dane hierarchiczne.

Nazwy dokumentów w kolekcji są unikalne. Możesz podać własne klucze, na przykład identyfikatory użytkowników, lub pozwolić, by usługa Cloud Firestore automatycznie tworzyła dla Ciebie losowe identyfikatory.

Nie musisz „tworzyć” ani „usuwać” kolekcji. Kolekcja istnieje po utworzeniu pierwszego dokumentu w kolekcji. Jeśli usuniesz wszystkie dokumenty z kolekcji, dokument już nie istnieje.

Źródła

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

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 urządzeniach docelowych watchOS i wycinków aplikacji.
let alovelaceDocumentRef = db.collection("users").document("alovelace")
Objective-C
Uwaga: ten produkt nie jest dostępny na urządzeniach docelowych watchOS i wycinków aplikacji.
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");
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 bibliotekach klienta Cloud Firestore.

$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 bibliotekach klienta Cloud Firestore.

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 istnieją w nim dane. Utworzenie odwołania nie spowoduje wykonania ż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 urządzeniach docelowych watchOS i wycinków aplikacji.
let usersCollectionRef = db.collection("users")
Objective-C
Uwaga: ten produkt nie jest dostępny na urządzeniach docelowych watchOS i wycinków aplikacji.
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");
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 bibliotekach klienta Cloud Firestore.

$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 bibliotekach klienta Cloud Firestore.

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

Dla wygody możesz też tworzyć odwołania, określając ścieżkę do dokumentu lub kolekcji w postaci ciągu znaków, oddzielając poszczególne elementy ukośnikiem (/). Aby np. 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 urządzeniach docelowych watchOS i wycinków aplikacji.
let aLovelaceDocumentReference = db.document("users/alovelace")
Objective-C
Uwaga: ten produkt nie jest dostępny na urządzeniach docelowych watchOS i wycinków aplikacji.
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");
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 bibliotekach klienta Cloud Firestore.

$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 bibliotekach klienta Cloud Firestore.

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ż przykładową aplikację czatu z wiadomościami i pokojami czatu.

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

  • pokoju

    • sala A

      name : "my chat room"

    • sala B

      ...

Skoro masz już pokoje czatu, zdecyduj, jak chcesz przechowywać wiadomości. Być może nie chcesz zapisywać ich w dokumencie pokoju czatu. Dokumenty w Cloud Firestore powinny być lekkie, a pokój czatu może zawierać dużą liczbę wiadomości. W dokumencie w pokoju czatu możesz jednak tworzyć dodatkowe kolekcje jako kolekcje podrzędne.

Podkolekcje

W takim przypadku najlepszym sposobem przechowywania wiadomości jest użycie kolekcji podrzędnych. Kolekcja podrzędna to kolekcja powiązana z określonym dokumentem.

Możesz utworzyć kolekcję podrzędną o nazwie messages dla każdego dokumentu związanego z pokojem w swojej kolekcji rooms:

  • pokoju

    • sala A

      name : "my chat room"

      • wiadomości

        • wiadomość1

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

        • wiadomość2

          ...

    • sala B

      ...

W tym przykładzie możesz utworzyć odwołanie do wiadomości w kolekcji podrzędnej przy użyciu 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 urządzeniach docelowych watchOS i wycinków aplikacji.
let messageRef = db
  .collection("rooms").document("roomA")
  .collection("messages").document("message1")
Objective-C
Uwaga: ten produkt nie jest dostępny na urządzeniach docelowych watchOS i wycinków aplikacji.
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");
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 bibliotekach klienta Cloud Firestore.

$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 bibliotekach klienta Cloud Firestore.

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 naprzemienne wzorce kolekcji i dokumentów. Kolekcje i dokumenty muszą zawsze być zgodne z tym wzorcem. Nie możesz odwoływać się do kolekcji w kolekcji lub do dokumentu w dokumencie.

Kolekcje podrzędne pozwalają hierarchicznie porządkować dane, co ułatwia dostęp do nich. Aby pobrać wszystkie wiadomości w kolekcji roomA, możesz utworzyć odniesienie do kolekcji do kolekcji podrzędnej messages i korzystać z niej tak jak ze wszystkimi innymi odwołaniami do kolekcji.

Dokumenty w kolekcjach podrzędnych mogą też zawierać podkolekcje, co pozwala na dalsze zagnieżdżanie danych. Dane można zagnieżdżać do 100 poziomów.