Модель данных Cloud Firestore

Cloud Firestore – это документоориентированная база данных NoSQL. В отличие от базы данных SQL, в ней нет таблиц или строк. Вместо этого данные хранятся в документах, которые организованы в коллекции.

Каждый документ содержит набор пар "ключ-значение". Cloud Firestore оптимизирована для хранения больших коллекций небольших документов.

Все документы должны храниться в коллекциях. Документы могут содержать вложенные коллекции и объекты, которые, в свою очередь, могут включать простые поля, например строки, или сложные объекты, например списки.

Коллекции и документы создаются в Cloud Firestore неявно. Просто назначьте данные документу в коллекции. Если коллекция или документ не существуют, Cloud Firestore создаст их.

Документы

В Cloud Firestore единицей хранения является документ. Документ – это небольшая запись, содержащая поля, которые сопоставляются со значениями. Каждый документ идентифицируется по имени.

Документ, представляющий пользователя alovelace, может выглядеть следующим образом:

  • alovelace

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

Сложные вложенные объекты в документе называются картами. Например, имя пользователя из примера выше можно структурировать с помощью карты следующим образом:

  • alovelace

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

Вы можете заметить, что документы очень похожи на JSON. По сути, так оно и есть. Есть некоторые различия (например, документы поддерживают дополнительные типы данных и ограничены размером документа), но в целом вы можете рассматривать документы как облегченные записи JSON.

подборки

Документы хранятся в коллекциях, которые представляют собой контейнеры для документов. Например, у вас может быть коллекция users, содержащая различных пользователей, каждый из которых представлен документом:

  • пользователя

    • alovelace

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

    • aturing

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

Cloud Firestore не имеет схемы, поэтому вы можете добавлять в документы любые поля и хранить в них данные любых типов. Документы в одной коллекции могут содержать разные поля или хранить в этих полях разные типы данных. Однако рекомендуется использовать одни и те же поля и типы данных в нескольких документах, чтобы упростить отправку запросов к ним.

Подборка содержит только документы. Она не может напрямую содержать необработанные поля со значениями и другие коллекции. Подробнее о том, как структурировать более сложные данные в Cloud Firestore, читайте в статье Иерархические данные.

Названия документов в коллекции уникальны. Вы можете указать собственные ключи, например идентификаторы пользователей, или разрешить Cloud Firestore автоматически создавать случайные идентификаторы.

Вам не нужно создавать или удалять коллекции. Коллекция создается после того, как вы создадите в ней первый документ. Если вы удалите все документы в коллекции, она перестанет существовать.

Ссылки

Каждый документ в Cloud Firestore уникально идентифицируется по его местоположению в базе данных. В предыдущем примере показан документ alovelace в коллекции users. Чтобы ссылаться на это местоположение в коде, можно создать ссылку на него.

Web

import { doc } from "firebase/firestore";

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

Web

var alovelaceDocumentRef = db.collection('users').doc('alovelace');
Swift
Примечание. Этот продукт недоступен для watchOS и App Clip.
let alovelaceDocumentRef = db.collection("users").document("alovelace")
Objective-C
Примечание. Этот продукт недоступен для watchOS и 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');
Проложить маршрут

import (
	"cloud.google.com/go/firestore"
)

func createDocReference(client *firestore.Client) {

	alovelaceRef := client.Collection("users").Doc("alovelace")

	_ = alovelaceRef
}
PHP

PHP

Подробнее о том, как установить и создать клиент Cloud Firestore, рассказывается в статье Клиентские библиотеки Cloud Firestore.

$document = $db->collection('samples/php/users')->document('alovelace');
Unity
DocumentReference documentRef = db.Collection("users").Document("alovelace");
C#

C#

Подробнее о том, как установить и создать клиент Cloud Firestore, рассказывается в статье Клиентские библиотеки Cloud Firestore.

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

Ссылка – это простой объект, который указывает на местоположение в базе данных. Вы можете создать ссылку независимо от того, есть ли там данные. При этом не выполняются никакие сетевые операции.

Вы также можете создавать ссылки на коллекции:

Web

import { collection } from "firebase/firestore";

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

Web

var usersCollectionRef = db.collection('users');
Swift
Примечание. Этот продукт недоступен для watchOS и App Clip.
let usersCollectionRef = db.collection("users")
Objective-C
Примечание. Этот продукт недоступен для watchOS и 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');
Проложить маршрут

import (
	"cloud.google.com/go/firestore"
)

func createCollectionReference(client *firestore.Client) {
	usersRef := client.Collection("users")

	_ = usersRef
}
PHP

PHP

Подробнее о том, как установить и создать клиент Cloud Firestore, рассказывается в статье Клиентские библиотеки Cloud Firestore.

$collection = $db->collection('samples/php/users');
Unity
CollectionReference collectionRef = db.Collection("users");
C#

C#

Подробнее о том, как установить и создать клиент Cloud Firestore, рассказывается в статье Клиентские библиотеки Cloud Firestore.

CollectionReference collectionRef = db.Collection("users");
Ruby
collection_ref = firestore.col "users"

Для удобства вы также можете создавать ссылки, указав путь к документу или коллекции в виде строки, компоненты которой разделены косой чертой (/). Например, чтобы создать ссылку на документ alovelace:

Web

import { doc } from "firebase/firestore"; 

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

Web

var alovelaceDocumentRef = db.doc('users/alovelace');
Swift
Примечание. Этот продукт недоступен для watchOS и App Clip.
let aLovelaceDocumentReference = db.document("users/alovelace")
Objective-C
Примечание. Этот продукт недоступен для watchOS и 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');
Проложить маршрут

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

Подробнее о том, как установить и создать клиент Cloud Firestore, рассказывается в статье Клиентские библиотеки Cloud Firestore.

$document = $db->document('users/alovelace');
Unity
DocumentReference documentRef = db.Document("users/alovelace");
C#

C#

Подробнее о том, как установить и создать клиент Cloud Firestore, рассказывается в статье Клиентские библиотеки Cloud Firestore.

DocumentReference documentRef = db.Document("users/alovelace");
Ruby
document_path_ref = firestore.doc "users/alovelace"

Иерархические данные

Чтобы понять, как работают иерархические структуры данных в Cloud Firestore, рассмотрим пример чат-приложения с сообщениями и чат-комнатами.

Вы можете создать коллекцию rooms, чтобы хранить в ней разные чат-комнаты:

  • переговорных комнат

    • комната

      name : "my chat room"

    • roomB

      ...

Теперь, когда у вас есть чат-комнаты, решите, как вы будете хранить сообщения. Возможно, вы не захотите хранить их в документе чат-комнаты. Документы в Cloud Firestore должны быть небольшими, а чат-комната может содержать большое количество сообщений. Однако вы можете создать дополнительные коллекции в документе чат-комнаты в качестве подколлекций.

Вложенные подборки

В этом случае лучше всего хранить сообщения в подколлекциях. Подколлекция — это коллекция, связанная с определенным документом.

Вы можете создать подколлекцию messages для каждого документа комнаты в коллекции rooms:

  • переговорных комнат

    • комната

      name : "my chat room"

      • сообщение

        • message1

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

        • message2

          ...

    • roomB

      ...

В этом примере вы создадите ссылку на сообщение в подколлекции с помощью следующего кода:

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
Примечание. Этот продукт недоступен для watchOS и App Clip.
let messageRef = db
  .collection("rooms").document("roomA")
  .collection("messages").document("message1")
Objective-C
Примечание. Этот продукт недоступен для watchOS и 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');
Проложить маршрут

import (
	"cloud.google.com/go/firestore"
)

func createSubcollectionReference(client *firestore.Client) {
	messageRef := client.Collection("rooms").Doc("roomA").
		Collection("messages").Doc("message1")

	_ = messageRef
}
PHP

PHP

Подробнее о том, как установить и создать клиент Cloud Firestore, рассказывается в статье Клиентские библиотеки 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#

Подробнее о том, как установить и создать клиент Cloud Firestore, рассказывается в статье Клиентские библиотеки 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")

Обратите внимание на чередование коллекций и документов. Ваши коллекции и документы должны всегда следовать этому шаблону. Вы не можете ссылаться на коллекцию в коллекции или документ в документе.

Вложенные коллекции позволяют структурировать данные иерархически, упрощая доступ к ним. Чтобы получить все сообщения в roomA, вы можете создать ссылку на подколлекцию messages и взаимодействовать с ней так же, как и с любой другой ссылкой на коллекцию.

Документы во вложенных коллекциях также могут содержать вложенные коллекции, что позволяет дополнительно вкладывать данные. Максимальный уровень вложенности данных – 100.