Modello dati
Firestore è un database NoSQL orientato ai documenti. A differenza di un database SQL, non sono presenti tabelle o righe. Invece, archivia i dati in documenti, che sono organizzati in raccolte.
Ogni documento contiene una serie di coppie chiave-valore. Firestore è ottimizzato per l'archiviazione di grandi raccolte di piccoli documenti.
Tutti i documenti devono essere archiviati in raccolte. I documenti possono contenere sottoraccolte e oggetti nidificati, che possono includere entrambi campi primitivi come stringhe o oggetti complessi come gli elenchi.
Le raccolte e i documenti vengono creati in modo implicito in Firestore. Basta assegnare i dati a un documento all'interno di una raccolta. Se la raccolta o il documento non esistono, Firestore li crea.
Documenti
In Firestore, l'unità di archiviazione è il documento. Un documento è un record leggero che contiene campi mappati a valori. Ogni documento è identificata da un nome.
Un documento che rappresenta un utente alovelace
potrebbe avere il seguente aspetto:
alovelace
first : "Ada"
last : "Lovelace"
born : 1815
Gli oggetti nidificati complessi in un documento sono chiamati mappe. Ad esempio, potresti strutturare il nome dell'utente dell'esempio precedente con una mappa, come questa:
alovelace
name :
first : "Ada"
last : "Lovelace"
born : 1815
Potresti notare che i documenti assomigliano molto a JSON. In effetti, lo sono. Esistono alcune differenze (ad esempio, i documenti supportano tipi di dati aggiuntivi e hanno una dimensione massima di 1 MB), ma in generale puoi trattare i documenti come record JSON leggeri.
Raccolte
I documenti si trovano nelle raccolte, che sono semplicemente contenitori per i documenti. Ad esempio, potresti avere una raccolta users
per contenere i vari utenti, ciascuno rappresentato da un documento:
utenti
alovelace
first : "Ada"
last : "Lovelace"
born : 1815
aturing
first : "Alan"
last : "Turing"
born : 1912
Firestore è privo di schemi, quindi hai completa libertà su quali campi inserire in ogni documento e su quali tipi di dati memorizzare in questi campi. I documenti all'interno della stessa raccolta possono contenere tutti campi diversi o archiviare tipi diversi di dati in questi campi. Tuttavia, è buona norma utilizzare gli stessi campi e tipi di dati in più documenti, in modo da poter eseguire query sui documenti più facilmente.
Una raccolta contiene solo documenti. Non può contenere direttamente campi non elaborati con valori e non può contenere altre raccolte. Consulta la sezione Dati gerarchici per una spiegazione su come strutturare dati più complessi in Firestore.
I nomi dei documenti all'interno di una raccolta sono univoci. Puoi fornire le tue chiavi, ad esempio gli ID utente, oppure puoi lasciare che sia Firestore a creare automaticamente ID casuali per te.
Non è necessario "creare" o "eliminare" le raccolte. Dopo aver creato il primo documento in una raccolta, la raccolta esiste. Se elimini tutti i documenti di una raccolta, questa 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
all'interno della raccolta users
. Per fare riferimento a questa posizione nel codice, puoi creare un
riferimento.
import { doc } from "firebase/firestore"; const alovelaceDocumentRef = doc(db, 'users', 'alovelace');
var alovelaceDocumentRef = db.collection('users').doc('alovelace');
let alovelaceDocumentRef = db.collection("users").document("alovelace")
FIRDocumentReference *alovelaceDocumentRef = [[self.db collectionWithPath:@"users"] documentWithPath:@"alovelace"];
val alovelaceDocumentRef = db.collection("users").document("alovelace")
DocumentReference alovelaceDocumentRef = db.collection("users").document("alovelace");
final alovelaceDocumentRef = db.collection("users").doc("alovelace");
DocumentReference alovelace_document_reference = db->Collection("users").Document("alovelace");
PHP
Per autenticarti a Firestore, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
DocumentReference documentRef = db.Collection("users").Document("alovelace");
C#
Per autenticarti a Firestore, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Un riferimento è un oggetto leggero che punta a una posizione nel database. Puoi creare un riferimento indipendentemente dal fatto che i dati esistano o meno e la creazione di un riferimento non esegue operazioni di rete.
Puoi anche creare riferimenti alle collezioni:
import { collection } from "firebase/firestore"; const usersCollectionRef = collection(db, 'users');
var usersCollectionRef = db.collection('users');
let usersCollectionRef = db.collection("users")
FIRCollectionReference *usersCollectionRef = [self.db collectionWithPath:@"users"];
val usersCollectionRef = db.collection("users")
CollectionReference usersCollectionRef = db.collection("users");
final usersCollectionRef = db.collection("users");
CollectionReference users_collection_reference = db->Collection("users");
PHP
Per autenticarti a Firestore, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
CollectionReference collectionRef = db.Collection("users");
C#
Per autenticarti a Firestore, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
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
:
import { doc } from "firebase/firestore"; const alovelaceDocumentRef = doc(db, 'users/alovelace');
var alovelaceDocumentRef = db.doc('users/alovelace');
let aLovelaceDocumentReference = db.document("users/alovelace")
FIRDocumentReference *aLovelaceDocumentReference = [self.db documentWithPath:@"users/alovelace"];
val alovelaceDocumentRef = db.document("users/alovelace")
DocumentReference alovelaceDocumentRef = db.document("users/alovelace");
final aLovelaceDocRef = db.doc("users/alovelace");
DocumentReference alovelace_document = db->Document("users/alovelace");
PHP
Per autenticarti a Firestore, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
DocumentReference documentRef = db.Document("users/alovelace");
C#
Per autenticarti a Firestore, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Dati gerarchici
Per comprendere il funzionamento delle strutture di dati gerarchiche in Firestore, considera un esempio di app di chat con messaggi e chat room.
Puoi creare una raccolta denominata rooms
per archiviare diverse chat room:
stanze
stanzaA
name : "my chat room"
roomB
...
Ora che hai creato le stanze di chat, decidi come archiviare i messaggi. Potresti non volerli memorizzare nel documento della chat room. I documenti in Firestore devono essere leggeri e una chat room potrebbe contenere un numero elevato di messaggi. Tuttavia, puoi creare raccolte aggiuntive all'interno del documento della tua stanza virtuale come sottoraccolte.
Sottoraccolte
Il modo migliore per archiviare i messaggi in questo scenario è utilizzare le sottocollezioni. Una subraccolta è una raccolta associata a un documento specifico.
Puoi creare una sottoraccolta denominata messages
per ogni documento della sala nella raccolta rooms
:
stanze
stanzaA
name : "my chat room"
messaggi
message1
from : "alex"
msg : "Hello World!"
message2
...
roomB
...
In questo esempio, creerai un riferimento a un messaggio nella sottoraccolta con il seguente codice:
import { doc } from "firebase/firestore"; const messageRef = doc(db, "rooms", "roomA", "messages", "message1");
var messageRef = db.collection('rooms').doc('roomA') .collection('messages').doc('message1');
let messageRef = db .collection("rooms").document("roomA") .collection("messages").document("message1")
FIRDocumentReference *messageRef = [[[[self.db collectionWithPath:@"rooms"] documentWithPath:@"roomA"] collectionWithPath:@"messages"] documentWithPath:@"message1"];
val messageRef = db .collection("rooms").document("roomA") .collection("messages").document("message1")
DocumentReference messageRef = db .collection("rooms").document("roomA") .collection("messages").document("message1");
final messageRef = db .collection("rooms") .doc("roomA") .collection("messages") .doc("message1");
DocumentReference message_reference = db->Collection("rooms") .Document("roomA") .Collection("messages") .Document("message1");
PHP
Per autenticarti a Firestore, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
DocumentReference documentRef = db .Collection("Rooms").Document("RoomA") .Collection("Messages").Document("Message1");
C#
Per autenticarti a Firestore, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Nota il pattern alternato di collezioni e documenti. Le collezioni e i documenti devono sempre seguire questo schema. Non puoi fare riferimento a una raccolta in una raccolta o a un documento in un documento.
Le sottocollezioni ti consentono di strutturare i dati in modo gerarchico, semplificandone l'accesso. Per recuperare tutti i messaggi in roomA
, puoi creare un riferimento alla raccolta
messages
e interagire con esso come con qualsiasi altro
riferimento alla raccolta.
I documenti nelle sottoraccolte possono contenere anche sottoraccolte, il che ti consente di nidificare ulteriormente i dati. Puoi nidificare i dati fino a 100 livelli di profondità.