Google is committed to advancing racial equity for Black communities. See how.
Эта страница переведена с помощью Cloud Translation API.
Switch to English

Модель данных 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. Фактически, они в основном таковы. Есть некоторые различия (например, документы поддерживают дополнительные типы данных и ограничены по размеру до 1 МБ), но в целом вы можете рассматривать документы как облегченные записи JSON.

Коллекции

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

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

    • alovelace

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

    • учеба в

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

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

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

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

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

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

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

Интернет
var alovelaceDocumentRef = db.collection('users').doc('alovelace');
Быстрый
let alovelaceDocumentRef = db.collection("users").document("alovelace")
Цель-C
FIRDocumentReference *alovelaceDocumentRef =
    [[self.db collectionWithPath:@"users"] documentWithPath:@"alovelace"];

Ява

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

Котлин + KTX

val alovelaceDocumentRef = db.collection("users").document("alovelace")
Ява
// Reference to a document with id "alovelace" in the collection "users"
DocumentReference document = db.collection("users").document("alovelace");
Python
a_lovelace_ref = db.collection(u'users').document(u'alovelace')
C ++
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('users')->document('lovelace');
Единство
DocumentReference documentRef = db.Collection("users").Document("alovelace");
C #
DocumentReference documentRef = db.Collection("users").Document("alovelace");
Рубин
document_ref = firestore.col("users").doc("alovelace")

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

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

Интернет
var usersCollectionRef = db.collection('users');
Быстрый
let usersCollectionRef = db.collection("users")
Цель-C
FIRCollectionReference *usersCollectionRef = [self.db collectionWithPath:@"users"];

Ява

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

Котлин + KTX

val usersCollectionRef = db.collection("users")
Ява
// Reference to the collection "users"
CollectionReference collection = db.collection("users");
Python
users_ref = db.collection(u'users')
C ++
CollectionReference users_collection_reference = db->Collection("users");
Node.js
const usersCollectionRef = db.collection('users');
Идти
usersRef := client.Collection("users")
PHP
$collection = $db->collection('users');
Единство
CollectionReference collectionRef = db.Collection("users");
C #
CollectionReference collectionRef = db.Collection("users");
Рубин
collection_ref = firestore.col "users"

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

Интернет
var alovelaceDocumentRef = db.doc('users/alovelace');
Быстрый
let aLovelaceDocumentReference = db.document("users/alovelace")
Цель-C
FIRDocumentReference *aLovelaceDocumentReference =
    [self.db documentWithPath:@"users/alovelace"];

Ява

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

Котлин + KTX

val alovelaceDocumentRef = db.document("users/alovelace")
Ява
// Reference to a document with id "alovelace" in the collection "users"
DocumentReference document = db.document("users/alovelace");
Python
a_lovelace_ref = db.document(u'users/alovelace')
C ++
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/lovelace');
Единство
DocumentReference documentRef = db.Document("users/alovelace");
C #
DocumentReference documentRef = db.Document("users/alovelace");
Рубин
document_path_ref = firestore.doc "users/alovelace"

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

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

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

  • комнаты

    • комнатаA

      name : "my chat room"

    • комнатаB

      ...

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

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

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

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

  • комнаты

    • комнатаA

      name : "my chat room"

      • сообщения

        • message1

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

        • message2

          ...

    • комнатаB

      ...

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

Интернет
var messageRef = db.collection('rooms').doc('roomA')
                .collection('messages').doc('message1');
Быстрый
let messageRef = db
    .collection("rooms").document("roomA")
    .collection("messages").document("message1")
Цель-C
FIRDocumentReference *messageRef =
    [[[[self.db collectionWithPath:@"rooms"] documentWithPath:@"roomA"]
    collectionWithPath:@"messages"] documentWithPath:@"message1"];

Ява

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

Котлин + KTX

val messageRef = db
        .collection("rooms").document("roomA")
        .collection("messages").document("message1")
Ява
// Reference to a document in subcollection "messages"
DocumentReference document =
    db.collection("rooms").document("roomA").collection("messages").document("message1");
Python
room_a_ref = db.collection(u'rooms').document(u'roomA')
message_ref = room_a_ref.collection(u'messages').document(u'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');
Идти
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");
C #
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 уровней.