Modello dati
Firestore è un database NoSQL orientato ai documenti. A differenza dei database SQL, non esistono tabelle o righe. Archivia invece i dati in documenti, che sono organizzati in raccolte.
Ogni documento contiene un insieme di coppie chiave-valore. Firestore è ottimizzato per l'archiviazione di raccolte di grandi dimensioni di documenti piccoli.
Tutti i documenti devono essere archiviati in raccolte. I documenti possono contenere raccolte secondarie e oggetti nidificati, entrambi possono includere campi primitivi come stringhe o oggetti complessi come elenchi.
Le raccolte e i documenti vengono creati implicitamente in Firestore. Puoi semplicemente assegnare i dati a un documento all'interno di una raccolta. Se la raccolta o il documento non esiste, Firestore lo crea.
Documenti
In Firestore, l'unità di archiviazione è il documento. Un documento è un record leggero contenente campi che vengono mappati a valori. Ogni documento è identificato da un nome.
Un documento che rappresenta un utente alovelace
potrebbe avere il seguente aspetto:
Alovelace:
first : "Ada"
last : "Lovelace"
born : 1815
Gli oggetti complessi e nidificati in un documento sono chiamati mappe. Ad esempio, puoi strutturare il nome dell'utente partendo dall'esempio precedente con una mappa, come riportato di seguito:
Alovelace:
name :
first : "Ada"
last : "Lovelace"
born : 1815
Potresti notare che i documenti hanno un aspetto molto simile a JSON. In realtà sì. Esistono alcune differenze (ad esempio, i documenti supportano tipi di dati aggiuntivi e hanno dimensioni limitate a 1 MB), ma in generale puoi trattare i documenti come record JSON leggeri.
Raccolte
I documenti risiedono in raccolte, che sono semplici contenitori di documenti. Ad esempio, potresti avere una raccolta users
contenente i vari utenti, ognuno rappresentato da un documento:
utenti
Alovelace:
first : "Ada"
last : "Lovelace"
born : 1815
in tour
first : "Alan"
last : "Turing"
born : 1912
Firestore è senza schema, quindi hai la libertà completa su quali campi inserisci in ogni documento e quali tipi di dati archivi in questi campi. I documenti all'interno della stessa raccolta possono contenere campi diversi o archiviare tipi diversi di dati in quei campi. Tuttavia, è consigliabile utilizzare gli stessi campi e tipi di dati in più documenti, in modo da eseguire facilmente query sui documenti.
Una raccolta contiene documenti e nient'altro. Non può contenere direttamente campi non elaborati con valori, né altre raccolte. Consulta la sezione Dati gerarchici per una spiegazione di come strutturare dati più complessi in Firestore.
I nomi dei documenti all'interno di una raccolta sono univoci. Puoi fornire le tue chiavi, come gli ID utente, oppure puoi lasciare che Firestore crei automaticamente ID casuali.
Non è necessario "creare" o "eliminare" le raccolte. Dopo aver creato il primo documento di una raccolta, la raccolta esiste già. Se elimini tutti i documenti in una raccolta, non esiste più.
Riferimenti
Ogni documento in Firestore è identificato in modo univoco dalla sua posizione all'interno del database. L'esempio precedente mostrava un documento alovelace
nella raccolta users
. Per fare riferimento a questa posizione nel codice, puoi creare un riferimento.
Versione 9 web
import { doc } from "firebase/firestore"; const alovelaceDocumentRef = doc(db, 'users', 'alovelace');
Versione 8 web
var alovelaceDocumentRef = db.collection('users').doc('alovelace');
Swift
let alovelaceDocumentRef = db.collection("users").document("alovelace")
Objective-C
FIRDocumentReference *alovelaceDocumentRef = [[self.db collectionWithPath:@"users"] documentWithPath:@"alovelace"];
Kotlin+KTX
Android
val alovelaceDocumentRef = db.collection("users").document("alovelace")
Java
Android
DocumentReference alovelaceDocumentRef = db.collection("users").document("alovelace");
Freccetto
final alovelaceDocumentRef = db.collection("users").doc("alovelace");
Java
Python
Python
(asincrono)
C++
DocumentReference alovelace_document_reference = db->Collection("users").Document("alovelace");
Node.js
Go
PHP
PHP
Unità
DocumentReference documentRef = db.Collection("users").Document("alovelace");
C#
C#
Ruby
Un riferimento è un oggetto leggero che punta solo a una posizione nel tuo database. Puoi creare un riferimento indipendentemente dalla presenza o meno di dati; inoltre, la creazione di un riferimento non esegue alcuna operazione di rete.
Puoi anche creare riferimenti a raccolte:
Versione 9 web
import { collection } from "firebase/firestore"; const usersCollectionRef = collection(db, 'users');
Versione 8 web
var usersCollectionRef = db.collection('users');
Swift
let usersCollectionRef = db.collection("users")
Objective-C
FIRCollectionReference *usersCollectionRef = [self.db collectionWithPath:@"users"];
Kotlin+KTX
Android
val usersCollectionRef = db.collection("users")
Java
Android
CollectionReference usersCollectionRef = db.collection("users");
Freccetto
final usersCollectionRef = db.collection("users");
Java
Python
Python
(asincrono)
C++
CollectionReference users_collection_reference = db->Collection("users");
Node.js
Go
PHP
PHP
Unità
CollectionReference collectionRef = db.Collection("users");
C#
C#
Ruby
Per comodità, puoi anche creare riferimenti specificando il percorso di un documento o di una raccolta come stringa, con i componenti del percorso separati da una barra (/
). Ad esempio, per creare un riferimento al documento alovelace
:
Versione 9 web
import { doc } from "firebase/firestore"; const alovelaceDocumentRef = doc(db, 'users/alovelace');
Versione 8 web
var alovelaceDocumentRef = db.doc('users/alovelace');
Swift
let aLovelaceDocumentReference = db.document("users/alovelace")
Objective-C
FIRDocumentReference *aLovelaceDocumentReference = [self.db documentWithPath:@"users/alovelace"];
Kotlin+KTX
Android
val alovelaceDocumentRef = db.document("users/alovelace")
Java
Android
DocumentReference alovelaceDocumentRef = db.document("users/alovelace");
Freccetto
final aLovelaceDocRef = db.doc("users/alovelace");
Java
Python
Python
(asincrono)
C++
DocumentReference alovelace_document = db->Document("users/alovelace");
Node.js
Go
PHP
PHP
Unità
DocumentReference documentRef = db.Document("users/alovelace");
C#
C#
Ruby
Dati gerarchici
Per capire come funzionano le strutture dei dati gerarchiche in Firestore, valuta un esempio di app di chat con messaggi e stanze virtuali.
Puoi creare una raccolta chiamata rooms
per archiviare stanze virtuali diverse:
stanze
stanzaA
name : "my chat room"
stanzaB
...
Ora che hai le stanze virtuali, decidi come archiviare i messaggi. Potresti non voler archiviarli nel documento della stanza virtuale. I documenti in Firestore devono essere leggeri e una stanza virtuale può contenere un numero elevato di messaggi. Tuttavia, puoi creare raccolte aggiuntive all'interno del documento della stanza virtuale, come sottoraccolte.
Collezioni secondarie
Il modo migliore per archiviare i messaggi in questo scenario è utilizzare le sottoraccolte. Per raccolta secondaria si intende una raccolta associata a un documento specifico.
Puoi creare una raccolta secondaria denominata messages
per ogni documento della stanza nella
raccolta rooms
:
stanze
stanzaA
name : "my chat room"
messaggi
messaggio1
from : "alex"
msg : "Hello World!"
messaggio2
...
stanzaB
...
In questo esempio viene creato un riferimento a un messaggio nella raccolta secondaria con il codice seguente:
Versione 9 web
import { doc } from "firebase/firestore"; const messageRef = doc(db, "rooms", "roomA", "messages", "message1");
Versione 8 web
var messageRef = db.collection('rooms').doc('roomA') .collection('messages').doc('message1');
Swift
let messageRef = db .collection("rooms").document("roomA") .collection("messages").document("message1")
Objective-C
FIRDocumentReference *messageRef = [[[[self.db collectionWithPath:@"rooms"] documentWithPath:@"roomA"] collectionWithPath:@"messages"] documentWithPath:@"message1"];
Kotlin+KTX
Android
val messageRef = db .collection("rooms").document("roomA") .collection("messages").document("message1")
Java
Android
DocumentReference messageRef = db .collection("rooms").document("roomA") .collection("messages").document("message1");
Freccetto
final messageRef = db .collection("rooms") .doc("roomA") .collection("messages") .doc("message1");
Java
Python
Python
(asincrono)
C++
DocumentReference message_reference = db->Collection("rooms") .Document("roomA") .Collection("messages") .Document("message1");
Node.js
Go
PHP
PHP
Unità
DocumentReference documentRef = db .Collection("Rooms").Document("RoomA") .Collection("Messages").Document("Message1");
C#
C#
Ruby
Osserva la sequenza alternata di raccolte e documenti. Le tue raccolte e i tuoi documenti devono sempre seguire questo schema. Non puoi fare riferimento a una raccolta in una raccolta o a un documento in un documento.
Le sottoraccolte consentono di strutturare i dati in modo gerarchico, semplificando l'accesso ai dati. Per ricevere tutti i messaggi in roomA
, puoi creare un riferimento raccolta per la raccolta secondaria messages
e interagire come per ogni altro riferimento raccolta.
I documenti delle sottoraccolte possono contenere anche sottoraccolte, in modo da fornirti ulteriori dati sui nidi. Puoi nidificare i dati fino a 100 livelli di profondità.