Модель данных 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 version 9

import { doc } from "firebase/firestore";

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

Web version 8

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"];

Java

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

Kotlin+KTX

val 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(u'users').document(u'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');
Идти
alovelaceRef := client.Collection("users").Doc("alovelace")
PHP
$document = $db->collection('samples/php/users')->document('alovelace');
Единство
DocumentReference documentRef = db.Collection("users").Document("alovelace");
С#
DocumentReference documentRef = db.Collection("users").Document("alovelace");
Рубин
document_ref = firestore.col("users").doc("alovelace")

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

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

Web version 9

import { collection } from "firebase/firestore";

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

Web version 8

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

Java

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

Kotlin+KTX

val usersCollectionRef = db.collection("users")

Dart

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

Python

users_ref = db.collection("users")
С++
CollectionReference users_collection_reference = db->Collection("users");
Node.js
const usersCollectionRef = db.collection('users');
Идти
usersRef := client.Collection("users")
PHP
$collection = $db->collection('samples/php/users');
Единство
CollectionReference collectionRef = db.Collection("users");
С#
CollectionReference collectionRef = db.Collection("users");
Рубин
collection_ref = firestore.col "users"

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

Web version 9

import { doc } from "firebase/firestore"; 

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

Web version 8

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"];

Java

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

Kotlin+KTX

val 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(u'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');
Идти
alovelaceRef := client.Doc("users/alovelace")
PHP
$document = $db->document('users/alovelace');
Единство
DocumentReference documentRef = db.Document("users/alovelace");
С#
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 version 9

import { doc } from "firebase/firestore"; 

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

Web version 8

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"];

Java

DocumentReference messageRef = db
        .collection("rooms").document("roomA")
        .collection("messages").document("message1");

Kotlin+KTX

val 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(u'rooms').document(u'roomA')
message_ref = room_a_ref.collection(u'messages').document(u'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');
Идти
messageRef := client.Collection("rooms").Doc("roomA").
	Collection("messages").Doc("message1")
PHP
$document = $db
    ->collection('rooms')
    ->document('roomA')
    ->collection('messages')
    ->document('message1');
Единство
DocumentReference documentRef = db
	.Collection("Rooms").Document("RoomA")
	.Collection("Messages").Document("Message1");
С#
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 уровней в глубину.