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

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

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

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

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

Документы

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

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

  • ловеласа

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

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

  • ловеласа

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

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

Коллекции

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

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

    • ловеласа

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

    • обучение в

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

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

Коллекция содержит документы и ничего больше. Он не может напрямую содержать необработанные поля со значениями и не может содержать другие коллекции. (См. «Иерархические данные» , где объясняется, как структурировать более сложные данные в Cloud Firestore.)

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

Вам не нужно «создавать» или «удалять» коллекции. После создания первого документа в коллекции коллекция существует. Если вы удалите все документы в коллекции, она больше не будет существовать.

Рекомендации

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

Web modular API

import { doc } from "firebase/firestore";

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

Web namespaced API

var alovelaceDocumentRef = db.collection('users').doc('alovelace');
Быстрый
Примечание. Этот продукт недоступен для целевых устройств watchOS и App Clip.
let alovelaceDocumentRef = db.collection("users").document("alovelace")
Цель-C
Примечание. Этот продукт недоступен для целевых устройств watchOS и App Clip.
FIRDocumentReference *alovelaceDocumentRef =
    [[self.db collectionWithPath:@"users"] documentWithPath:@"alovelace"];

Kotlin+KTX

val alovelaceDocumentRef = db.collection("users").document("alovelace")

Java

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

Dart

final alovelaceDocumentRef = db.collection("users").doc("alovelace");
Джава
// Reference to a document with id "alovelace" in the collection "users"
DocumentReference document = db.collection("users").document("alovelace");
Питон
a_lovelace_ref = db.collection("users").document("alovelace")

Python

a_lovelace_ref = db.collection("users").document("alovelace")
С++
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');
Единство
DocumentReference documentRef = db.Collection("users").Document("alovelace");
С#

С#

Дополнительную информацию об установке и создании клиента Cloud Firestore см. в разделе Клиентские библиотеки Cloud Firestore .

DocumentReference documentRef = db.Collection("users").Document("alovelace");
Рубин
document_ref = firestore.col("users").doc("alovelace")

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

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

Web modular API

import { collection } from "firebase/firestore";

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

Web namespaced API

var usersCollectionRef = db.collection('users');
Быстрый
Примечание. Этот продукт недоступен для целевых устройств watchOS и App Clip.
let usersCollectionRef = db.collection("users")
Цель-C
Примечание. Этот продукт недоступен для целевых устройств watchOS и App Clip.
FIRCollectionReference *usersCollectionRef = [self.db collectionWithPath:@"users"];

Kotlin+KTX

val usersCollectionRef = db.collection("users")

Java

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

Dart

final usersCollectionRef = db.collection("users");
Джава
// Reference to the collection "users"
CollectionReference collection = db.collection("users");
Питон
users_ref = db.collection("users")

Python

users_ref = db.collection("users")
С++
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');
Единство
CollectionReference collectionRef = db.Collection("users");
С#

С#

Дополнительную информацию об установке и создании клиента Cloud Firestore см. в разделе Клиентские библиотеки Cloud Firestore .

CollectionReference collectionRef = db.Collection("users");
Рубин
collection_ref = firestore.col "users"

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

Web modular API

import { doc } from "firebase/firestore"; 

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

Web namespaced API

var alovelaceDocumentRef = db.doc('users/alovelace');
Быстрый
Примечание. Этот продукт недоступен для целевых устройств watchOS и App Clip.
let aLovelaceDocumentReference = db.document("users/alovelace")
Цель-C
Примечание. Этот продукт недоступен для целевых устройств watchOS и App Clip.
FIRDocumentReference *aLovelaceDocumentReference =
    [self.db documentWithPath:@"users/alovelace"];

Kotlin+KTX

val alovelaceDocumentRef = db.document("users/alovelace")

Java

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

Dart

final aLovelaceDocRef = db.doc("users/alovelace");
Джава
// Reference to a document with id "alovelace" in the collection "users"
DocumentReference document = db.document("users/alovelace");
Питон
a_lovelace_ref = db.document("users/alovelace")

Python

a_lovelace_ref = db.document("users/alovelace")
С++
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');
Единство
DocumentReference documentRef = db.Document("users/alovelace");
С#

С#

Дополнительную информацию об установке и создании клиента Cloud Firestore см. в разделе Клиентские библиотеки Cloud Firestore .

DocumentReference documentRef = db.Document("users/alovelace");
Рубин
document_path_ref = firestore.doc "users/alovelace"

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

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

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

  • комнаты

    • комнатаА

      name : "my chat room"

    • комнатаБ

      ...

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

Подколлекции

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

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

  • комнаты

    • комнатаА

      name : "my chat room"

      • сообщения

        • сообщение

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

        • сообщение

          ...

    • комнатаБ

      ...

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

Web modular API

import { doc } from "firebase/firestore"; 

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

Web namespaced API

var messageRef = db.collection('rooms').doc('roomA')
                .collection('messages').doc('message1');
Быстрый
Примечание. Этот продукт недоступен для целевых устройств watchOS и App Clip.
let messageRef = db
  .collection("rooms").document("roomA")
  .collection("messages").document("message1")
Цель-C
Примечание. Этот продукт недоступен для целевых устройств watchOS и App Clip.
FIRDocumentReference *messageRef =
    [[[[self.db collectionWithPath:@"rooms"] documentWithPath:@"roomA"]
    collectionWithPath:@"messages"] documentWithPath:@"message1"];

Kotlin+KTX

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");
Джава
// Reference to a document in subcollection "messages"
DocumentReference document =
    db.collection("rooms").document("roomA").collection("messages").document("message1");
Питон
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")
С++
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');
Единство
DocumentReference documentRef = db
	.Collection("Rooms").Document("RoomA")
	.Collection("Messages").Document("Message1");
С#

С#

Дополнительную информацию об установке и создании клиента Cloud Firestore см. в разделе Клиентские библиотеки Cloud Firestore .

DocumentReference documentRef = db
    .Collection("Rooms").Document("RoomA")
    .Collection("Messages").Document("Message1");
Рубин
message_ref = firestore.col("rooms").doc("roomA").col("messages").doc("message1")

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

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

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