Model danych Cloud Firestore

Cloud Firestore to baza danych NoSQL zorientowana na dokumenty. W odróżnieniu od bazy danych SQL nie ma tu tabel ani wierszy. Zamiast tego dane są przechowywane w dokumentach, które są pogrupowane w kolekcje.

Każdy dokument zawiera zestaw par klucz-wartość. Cloud Firestore jest zoptymalizowana 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ą obejmować pola podstawowe, takie jak ciągi znaków, lub obiekty złożone, 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ą miejsca na dane jest dokument. Dokument to lekki rekord zawierający pola, które są mapowane na wartości. Każdy dokument jest identyfikowany przez 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 w ten sposób:

  • alovelace

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

Możesz zauważyć, że dokumenty wyglądają bardzo podobnie do formatu JSON. W zasadzie tak jest. Istnieją pewne różnice (na przykład dokumenty obsługują dodatkowe typy danych i są ograniczone do limitu rozmiaru dokumentu), 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 mieć kolekcję users, która zawiera różnych użytkowników, z których każdy jest reprezentowany przez dokument:

  •  użytkowników

    • alovelace

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

    •  – polecane

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

Cloud Firestore nie ma schematu, więc masz pełną swobodę w zakresie tego, jakie pola umieszczasz w każdym dokumencie i jakie typy danych w nich przechowujesz. Dokumenty w tej samej kolekcji mogą zawierać różne pola lub przechowywać różne typy danych w tych polach. Warto jednak używać tych samych pól i typów danych w wielu dokumentach, aby ułatwić wysyłanie zapytań do dokumentów.

Kolekcja zawiera tylko dokumenty. Nie może bezpośrednio zawierać nieprzetworzonych pól z wartościami ani innych kolekcji. (Więcej informacji o strukturyzowaniu 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, np. identyfikatory użytkowników, lub pozwolić, aby Cloud Firestore automatycznie tworzyła losowe identyfikatory.

Nie musisz „tworzyć” ani „usuwać” kolekcji. Kolekcja powstaje po utworzeniu w niej pierwszego dokumentu. Jeśli usuniesz wszystkie dokumenty w kolekcji, przestanie ona istnieć.

Odniesienia

Każdy dokument w Cloud Firestore jest jednoznacznie identyfikowany przez swoją lokalizację w bazie danych. Poprzedni przykład pokazywał 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: ta usługa nie jest dostępna w przypadku watchOS i App Clip.
let alovelaceDocumentRef = db.collection("users").document("alovelace")
Objective-C
Uwaga: ta usługa nie jest dostępna w przypadku watchOS i App Clip.
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 artykule o 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 artykule o bibliotekach klienta Cloud Firestore.

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

Referencja to lekki obiekt, który wskazuje 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: ta usługa nie jest dostępna w przypadku watchOS i App Clip.
let usersCollectionRef = db.collection("users")
Objective-C
Uwaga: ta usługa nie jest dostępna w przypadku watchOS i App Clip.
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 artykule o 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 artykule o bibliotekach klienta Cloud Firestore.

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 komponenty ścieżki są rozdzielone 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: ta usługa nie jest dostępna w przypadku watchOS i App Clip.
let aLovelaceDocumentReference = db.document("users/alovelace")
Objective-C
Uwaga: ta usługa nie jest dostępna w przypadku watchOS i App Clip.
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 artykule o 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 artykule o 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żmy przykładową aplikację do obsługi czatu z wiadomościami i pokojami czatu.

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

  •  sal

    •  sala

      name : "my chat room"

    •  roomB

      ...

Teraz, gdy masz 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

Najlepszym sposobem przechowywania wiadomości w tym scenariuszu jest użycie podkolekcji. Podkolekcja to kolekcja powiązana z konkretnym dokumentem.

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

  •  sal

    • roomA

      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: ta usługa nie jest dostępna w przypadku watchOS i App Clip.
let messageRef = db
  .collection("rooms").document("roomA")
  .collection("messages").document("message1")
Objective-C
Uwaga: ta usługa nie jest dostępna w przypadku watchOS i App Clip.
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 artykule o 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 artykule o 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 naprzemienny wzorzec kolekcji i dokumentów. 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.

Podkolekcje umożliwiają hierarchiczne porządkowanie danych, co ułatwia dostęp do nich. Aby pobrać wszystkie wiadomości w roomA, możesz utworzyć odwołanie do kolekcji podrzędnej messages i korzystać z niego tak samo jak z każdego innego odwołania do kolekcji.

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