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ą zorganizowane 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 zbiorach. Dokumenty mogą zawierać podkolekcje i obiekty zagnieżdżone, z których oba mogą zawierać pola pierwotne, takie jak ciągi, 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 go utworzy.

Dokumenty

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

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

  • ukochana

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

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

  • ukochana

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

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

Kolekcje

Dokumenty żyją w zbiorach, 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

    • ukochana

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

    • klasowe

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

Cloud Firestore jest pozbawiony schematów, więc masz pełną swobodę w zakresie tego, jakie pola umieszczasz w każdym dokumencie i jakie typy danych przechowujesz w tych polach. Wszystkie dokumenty w tej samej kolekcji mogą zawierać różne pola lub przechowywać w nich różne typy danych. Jednak dobrym pomysłem jest używanie tych samych pól i typów danych w wielu dokumentach, aby łatwiej można było wyszukiwać dokumenty.

Zbiór zawiera dokumenty i nic więcej. Nie może bezpośrednio zawierać nieprzetworzonych pól z wartościami i nie może zawierać innych kolekcji. (Zobacz Dane hierarchiczne , aby dowiedzieć się, jak uporządkować 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 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 w kolekcji, kolekcja już nie istnieje.

Bibliografia

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 swoim kodzie, możesz utworzyć do niej odwołanie .

Web version 9

import { doc } from "firebase/firestore";

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

Web version 8

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"];

Java

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

Kotlin+KTX

val 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(u'users').document(u'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ść
alovelaceRef := client.Collection("users").Doc("alovelace")
PHP
$document = $db->collection('samples/php/users')->document('lovelace');
Jedność
DocumentReference documentRef = db.Collection("users").Document("alovelace");
C#
DocumentReference documentRef = db.Collection("users").Document("alovelace");
Rubin
document_ref = firestore.col("users").doc("alovelace")

Odwołanie to lekki obiekt, który po prostu wskazuje lokalizację w Twojej bazie danych. Możesz utworzyć odniesienie, niezależnie od tego, czy istnieją tam dane, a tworzenie odniesienia nie wykonuje żadnych operacji sieciowych.

Możesz również tworzyć odniesienia do kolekcji :

Web version 9

import { collection } from "firebase/firestore";

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

Web version 8

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"];

Java

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

Kotlin+KTX

val 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(u'users')

Python

users_ref = db.collection("users")
C++
CollectionReference users_collection_reference = db->Collection("users");
Node.js
const usersCollectionRef = db.collection('users');
Iść
usersRef := client.Collection("users")
PHP
$collection = $db->collection('samples/php/users');
Jedność
CollectionReference collectionRef = db.Collection("users");
C#
CollectionReference collectionRef = db.Collection("users");
Rubin
collection_ref = firestore.col "users"

Dla wygody można również tworzyć odwołania, określając ścieżkę do dokumentu lub kolekcji jako ciąg, z komponentami ścieżki oddzielonymi ukośnikiem ( / ). Na przykład, aby utworzyć odniesienie do dokumentu alovelace :

Web version 9

import { doc } from "firebase/firestore"; 

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

Web version 8

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"];

Java

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

Kotlin+KTX

val 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(u'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ść
alovelaceRef := client.Doc("users/alovelace")
PHP
$document = $db->document('users/lovelace');
Jedność
DocumentReference documentRef = db.Document("users/alovelace");
C#
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 czatu z wiadomościami i pokojami rozmów.

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

  • pokoje

    • A

      name : "my chat room"

    • 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 kolekcje podrzędne.

Podkolekcje

Najlepszym sposobem przechowywania wiadomości w tym scenariuszu jest użycie kolekcji podrzędnych. Podkolekcja to kolekcja powiązana z określonym dokumentem.

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

  • pokoje

    • A

      name : "my chat room"

      • wiadomości

        • wiadomość

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

        • wiadomość

          ...

    • B

      ...

W tym przykładzie utworzysz odwołanie do wiadomości w podkolekcji z następującym kodem:

Web version 9

import { doc } from "firebase/firestore"; 

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

Web version 8

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"];

Java

DocumentReference messageRef = db
        .collection("rooms").document("roomA")
        .collection("messages").document("message1");

Kotlin+KTX

val 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(u'rooms').document(u'roomA')
message_ref = room_a_ref.collection(u'messages').document(u'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ść
messageRef := client.Collection("rooms").Doc("roomA").
	Collection("messages").Doc("message1")
PHP
$document = $db
    ->collection('rooms')
    ->document('roomA')
    ->collection('messages')
    ->document('message1');
Jedność
DocumentReference documentRef = db
	.Collection("Rooms").Document("RoomA")
	.Collection("Messages").Document("Message1");
C#
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 wzór kolekcji i dokumentów. Twoje kolekcje i dokumenty muszą być zawsze zgodne z tym wzorcem. Nie można odwoływać się do kolekcji w kolekcji ani do dokumentu w dokumencie.

Kolekcje podrzędne umożliwiają hierarchiczną strukturę danych, ułatwiając dostęp do danych. Aby uzyskać wszystkie wiadomości w pokoju A , możesz utworzyć odwołanie do kolekcji do messages z roomA i wchodzić z nimi w interakcję tak, jak z każdym innym odniesieniem do kolekcji.

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