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ą porządkowane w kolekcje.

Każdy dokument zawiera zestaw par klucz-wartość. Cloud Firestore jest zoptymalizowany pod kątem przechowywania dużych kolekcji 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 prymitywne, takie jak ciągi znaków, lub złożone obiekty, takie jak listy.

Kolekcje i dokumenty są tworzone domyślnie w Cloud Firestore. Wystarczy przypisać dane do dokumentu w kolekcji. Jeśli kolekcja lub dokument nie istnieją, Cloud Firestore je tworzy.

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 nazywane są mapami. Możesz na przykład ustrukturyzować nazwę użytkownika z powyższego przykładu za pomocą mapy takiej jak ta:

  • alovelace

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

Możesz zauważyć, że dokumenty są bardzo podobne do formatu JSON. W zasadzie tak. Występują pewne różnice (np. dokumenty obsługują dodatkowe typy danych i są ograniczone do rozmiaru 1 MB), ale ogólnie dokumenty można traktować jako 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ż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 wybieraniu pól do umieszczania w każdym dokumencie i typów danych, które 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 różnych dokumentach, aby łatwiej było wysyłać zapytania dotyczące tych dokumentów.

Kolekcja zawiera dokumenty i nic więcej. Nie może ona bezpośrednio zawierać pól z wartościami ani innych kolekcji. (Aby dowiedzieć się, jak ustrukturyzować bardziej złożone dane w sekcji Cloud Firestore, przeczytaj artykuł Dane hierarchiczne).

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

Nie musisz tworzyć ani usuwać kolekcji. Po utworzeniu pierwszego dokumentu w kolekcji kolekcja istnieje. Jeśli usuniesz wszystkie dokumenty z kolekcji, kolekcja przestanie istnieć.

Odniesienia

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

Web

import { doc } from "firebase/firestore";

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

Web

var alovelaceDocumentRef = db.collection('users').doc('alovelace');
Swift
Uwaga: ta usługa nie jest dostępna na urządzeniach z systemem watchOS i nie można jej używać w przypadku App Clip.
let alovelaceDocumentRef = db.collection("users").document("alovelace")
Objective-C
Uwaga: ta usługa nie jest dostępna na urządzeniach z systemem watchOS i w przypadku aplikacji typu 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");
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 artykule Cloud Firestore Biblioteki 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 artykule Cloud Firestore Biblioteki klienta.

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

Odwołania to lekkie obiekty, które wskazują po prostu lokalizację w bazie danych. Możesz utworzyć odwołanie niezależnie od tego, czy istnieją w nim dane. 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: ta usługa nie jest dostępna na urządzeniach z systemem watchOS i nie można jej używać w przypadku App Clip.
let usersCollectionRef = db.collection("users")
Objective-C
Uwaga: ta usługa nie jest dostępna na urządzeniach z systemem watchOS i w przypadku aplikacji typu 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");
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 artykule Cloud Firestore Biblioteki 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 artykule Cloud Firestore Biblioteki 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, przy czym elementy ścieżki są rozdzielone pochylą kreską (/). Na przykład, aby 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: ta usługa nie jest dostępna na urządzeniach z systemem watchOS i nie można jej używać w przypadku App Clip.
let aLovelaceDocumentReference = db.document("users/alovelace")
Objective-C
Uwaga: ta usługa nie jest dostępna na urządzeniach z systemem watchOS i w przypadku aplikacji typu 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");
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 artykule Cloud Firestore Biblioteki 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 artykule Cloud Firestore Biblioteki 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, zastanów się nad przykładową aplikacją do czatu z wiadomościami i pokojami czatu.

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

  •  sal

    • roomA

      name : "my chat room"

    •  pokój B

      ...

Teraz, gdy masz pokoje czatu, zdecyduj, jak przechowywać wiadomości. Możesz nie chcieć przechowywać ich w dokumencie 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.

Podkolekcji

W tym przypadku najlepszym sposobem przechowywania wiadomości jest użycie podkolekcji. Podkolekcją jest kolekcja powiązana z konkretnym dokumentem.

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

  •  sal

    • roomA

      name : "my chat room"

      • wiadomości

        • message1

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

        • message2

          ...

    •  pokój B

      ...

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: ta usługa nie jest dostępna na urządzeniach z systemem watchOS i nie można jej używać w przypadku App Clip.
let messageRef = db
  .collection("rooms").document("roomA")
  .collection("messages").document("message1")
Objective-C
Uwaga: ta usługa nie jest dostępna na urządzeniach z systemem watchOS i w przypadku aplikacji typu 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");
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 artykule Cloud Firestore Biblioteki 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 artykule Cloud Firestore Biblioteki 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 wzór 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ą uporządkowanie danych w hierarchii, co ułatwia do nich dostęp. Aby uzyskać wszystkie wiadomości w kolekcji roomA, możesz utworzyć odwołanie do podkolekcji messages i działać z nim tak samo jak z dowolnym innym odwołaniem do kolekcji.

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