Modelo de dados
O Firestore é uma base de dados NoSQL orientada para documentos. Ao contrário de uma base de dados SQL, não existem tabelas nem linhas. Em vez disso, armazena dados em documentos, que são organizados em coleções.
Cada documento contém um conjunto de pares de chave-valor. O Firestore está otimizado para armazenar grandes coleções de documentos pequenos.
Todos os documentos têm de ser armazenados em coleções. Os documentos podem conter subcoleções e objetos aninhados, que podem incluir campos primitivos como strings ou objetos complexos, como listas.
As coleções e os documentos são criados implicitamente no Firestore. Basta atribuir dados a um documento numa coleção. Se a coleção ou o documento não existir, o Firestore cria-o.
Documentos
No Firestore, a unidade de armazenamento é o documento. Um documento é um registo simples que contém campos, que são mapeados para valores. Cada documento é identificado por um nome.
Um documento que representa um utilizador alovelace
pode ter o seguinte aspeto:
alovelace
first : "Ada"
last : "Lovelace"
born : 1815
Os objetos complexos e aninhados num documento são denominados mapas. Por exemplo, pode estruturar o nome do utilizador do exemplo acima com um mapa, da seguinte forma:
alovelace
name :
first : "Ada"
last : "Lovelace"
born : 1815
Pode reparar que os documentos se assemelham muito ao JSON. Na verdade, são basicamente a mesma coisa. Existem algumas diferenças (por exemplo, os documentos suportam tipos de dados adicionais e têm um limite de tamanho de 1 MB), mas, em geral, pode tratar os documentos como registos JSON simples.
Coleções
Os documentos residem em coleções, que são simplesmente contentores de documentos. Por exemplo, pode ter uma coleção users
para conter os seus vários utilizadores, cada um representado por um documento:
utilizadores
alovelace
first : "Ada"
last : "Lovelace"
born : 1815
aturing
first : "Alan"
last : "Turing"
born : 1912
O Firestore não tem esquemas, pelo que tem total liberdade sobre os campos que coloca em cada documento e os tipos de dados que armazena nesses campos. Os documentos na mesma coleção podem conter campos diferentes ou armazenar diferentes tipos de dados nesses campos. No entanto, é recomendável usar os mesmos campos e tipos de dados em vários documentos para poder consultar os documentos mais facilmente.
Uma coleção contém documentos e nada mais. Não pode conter diretamente campos brutos com valores nem outras coleções. (Consulte Dados hierárquicos para uma explicação de como estruturar dados mais complexos no Firestore.)
Os nomes dos documentos numa coleção são exclusivos. Pode fornecer as suas próprias chaves, como IDs de utilizadores, ou permitir que o Firestore crie IDs aleatórios automaticamente.
Não precisa de "criar" nem "eliminar" coleções. Depois de criar o primeiro documento numa coleção, a coleção existe. Se eliminar todos os documentos numa coleção, esta deixa de existir.
Referências
Cada documento no Firestore é identificado de forma exclusiva pela respetiva localização na base de dados. O exemplo anterior mostrava um documento alovelace
na coleção users
. Para fazer referência a esta localização no seu código, pode criar uma referência à mesma.
Versão Web 9
import { doc } from "firebase/firestore"; const alovelaceDocumentRef = doc(db, 'users', 'alovelace');
Versão Web 8
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
Android
val alovelaceDocumentRef = db.collection("users").document("alovelace")
Java
Android
DocumentReference alovelaceDocumentRef = db.collection("users").document("alovelace");
Dart
final alovelaceDocumentRef = db.collection("users").doc("alovelace");
Java
Python
Python
(assíncrono)
C++
DocumentReference alovelace_document_reference = db->Collection("users").Document("alovelace");
Node.js
Go
PHP
PHP
Para se autenticar no Firestore, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
Unity
DocumentReference documentRef = db.Collection("users").Document("alovelace");
C#
C#
Para se autenticar no Firestore, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
Ruby
Uma referência é um objeto simples que apenas aponta para uma localização na sua base de dados. Pode criar uma referência independentemente de existirem ou não dados e a criação de uma referência não executa operações de rede.
Também pode criar referências a coleções:
Versão Web 9
import { collection } from "firebase/firestore"; const usersCollectionRef = collection(db, 'users');
Versão Web 8
var usersCollectionRef = db.collection('users');
Swift
let usersCollectionRef = db.collection("users")
Objective-C
FIRCollectionReference *usersCollectionRef = [self.db collectionWithPath:@"users"];
Kotlin
Android
val usersCollectionRef = db.collection("users")
Java
Android
CollectionReference usersCollectionRef = db.collection("users");
Dart
final usersCollectionRef = db.collection("users");
Java
Python
Python
(assíncrono)
C++
CollectionReference users_collection_reference = db->Collection("users");
Node.js
Go
PHP
PHP
Para se autenticar no Firestore, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
Unity
CollectionReference collectionRef = db.Collection("users");
C#
C#
Para se autenticar no Firestore, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
Ruby
Para sua conveniência, também pode criar referências especificando o caminho para um documento ou uma coleção como uma string, com os componentes do caminho separados por uma barra (/
). Por exemplo, para criar uma referência ao documento alovelace
:
Versão Web 9
import { doc } from "firebase/firestore"; const alovelaceDocumentRef = doc(db, 'users/alovelace');
Versão Web 8
var alovelaceDocumentRef = db.doc('users/alovelace');
Swift
let aLovelaceDocumentReference = db.document("users/alovelace")
Objective-C
FIRDocumentReference *aLovelaceDocumentReference = [self.db documentWithPath:@"users/alovelace"];
Kotlin
Android
val alovelaceDocumentRef = db.document("users/alovelace")
Java
Android
DocumentReference alovelaceDocumentRef = db.document("users/alovelace");
Dart
final aLovelaceDocRef = db.doc("users/alovelace");
Java
Python
Python
(assíncrono)
C++
DocumentReference alovelace_document = db->Document("users/alovelace");
Node.js
Go
PHP
PHP
Para se autenticar no Firestore, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
Unity
DocumentReference documentRef = db.Document("users/alovelace");
C#
C#
Para se autenticar no Firestore, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
Ruby
Dados hierárquicos
Para compreender como funcionam as estruturas de dados hierárquicas no Firestore, considere uma app de chat de exemplo com mensagens e salas de chat.
Pode criar uma coleção denominada rooms
para armazenar diferentes salas de chat:
salas
roomA
name : "my chat room"
roomB
...
Agora que tem salas de chat, decida como armazenar as suas mensagens. Pode não querer armazená-las no documento da sala de chat. Os documentos no Firestore devem ser simples e uma sala de chat pode conter um grande número de mensagens. No entanto, pode criar coleções adicionais no documento da sala de chat, como subcoleções.
Subcoleções
A melhor forma de armazenar mensagens neste cenário é usar subcoleções. Uma subcoleção é uma coleção associada a um documento específico.
Pode criar uma subcoleção denominada messages
para cada documento de sala na sua coleção rooms
:
salas
roomA
name : "my chat room"
mensagens
message1
from : "alex"
msg : "Hello World!"
message2
...
roomB
...
Neste exemplo, criaria uma referência a uma mensagem na subcoleção com o seguinte código:
Versão Web 9
import { doc } from "firebase/firestore"; const messageRef = doc(db, "rooms", "roomA", "messages", "message1");
Versão Web 8
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
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");
Dart
final messageRef = db .collection("rooms") .doc("roomA") .collection("messages") .doc("message1");
Java
Python
Python
(assíncrono)
C++
DocumentReference message_reference = db->Collection("rooms") .Document("roomA") .Collection("messages") .Document("message1");
Node.js
Go
PHP
PHP
Para se autenticar no Firestore, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
Unity
DocumentReference documentRef = db .Collection("Rooms").Document("RoomA") .Collection("Messages").Document("Message1");
C#
C#
Para se autenticar no Firestore, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
Ruby
Repare no padrão alternado de coleções e documentos. As suas coleções e documentos têm sempre de seguir este padrão. Não pode fazer referência a uma coleção numa coleção nem a um documento num documento.
As subcoleções permitem-lhe estruturar os dados hierarquicamente, o que facilita o acesso aos dados. Para receber todas as mensagens no roomA
, pode criar uma referência de coleção para a subcoleção messages
e interagir com ela como faria com qualquer outra referência de coleção.
Os documentos em subcoleções também podem conter subcoleções, o que lhe permite aninhar ainda mais os dados. Pode aninhar dados até 100 níveis de profundidade.