Что такое денормализация в Firebase Cloud Firestore? - PullRequest
0 голосов
/ 18 января 2019

О чем действительно эта денормализация, когда речь идет о Firebase Cloud Firestore? Я прочитал несколько статей в Интернете и некоторые ответы здесь на stackoverflow, и большинство ответов рекомендуют этот подход. Как эта денормализация действительно помогает? Всегда ли это необходимо?

Является ли выравнивание и денормализация базы данных одним и тем же?

Это мой первый вопрос, и я надеюсь, что найду ответ, который поможет мне понять концепцию. Я знаю, отличается, но у меня есть два года опыта в MySQL.

1 Ответ

0 голосов
/ 18 января 2019

Что такое денормализация в Firebase Cloud Firestore?

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

Что это за денормализация?

Денормализация - это процесс оптимизации производительности баз данных NoSQL путем добавления избыточных данных в других местах базы данных. Что я имею в виду, добавляя избыточные данные, как @FrankvanPuffelen уже упоминал в своем комментарии, это означает, что мы копируем те же самые данные, которые уже существуют в одном месте, в другом месте, чтобы удовлетворить запросы, которые могут быть невозможны в противном случае. Таким образом, денормализация помогает скрыть недостатки, присущие реляционным базам данных.

Как эта денормализация действительно помогает?

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

Всегда ли это необходимо?

Мы не используем денормализацию только ради ее использования. Мы используем это, только когда это определенно необходимо.

Является ли выравнивание и денормализация базы данных одним и тем же?

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

Firestore-root
    |
    --- questions (collections)
          |
          --- questionId (document)
                 |
                 --- questionId: "LongQuestionIdOne"
                 |
                 --- title: "Question Title"
                 |
                 --- tags (collections)
                      |
                      --- tagIdOne (document)
                      |     |
                      |     --- tagId: "yR8iLzdBdylFkSzg1k4K"
                      |     |
                      |     --- tagName: "History"
                      |     |
                      |     --- //Other tag properties
                      |
                      --- tagIdTwo (document)
                            |
                            --- tagId: "tUjKPoq2dylFkSzg9cFg"
                            |
                            --- tagName: "Geography"
                            |
                            --- //Other tag properties

Мы можем сгладить базу данных, просто переместив коллекцию tags в отдельную коллекцию верхнего уровня, например:

Firestore-root
    |
    --- questions (collections)
    |     |
    |     --- questionId (document)
    |            |
    |            --- questionId: "LongQuestionIdOne"
    |            |
    |            --- title: "Question Title"
    |
    --- tags (collections)
          |
          --- tagIdOne (document)
          |     |
          |     --- tagId: "yR8iLzdBdylFkSzg1k4K"
          |     |
          |     --- tagName: "History"
          |     |
          |     --- questionId: "LongQuestionIdOne"
          |     |
          |     --- //Other tag properties
          |
          --- tagIdTwo (document)
                |
                --- tagId: "tUjKPoq2dylFkSzg9cFg"
                |
                --- tagName: "Geography"
                |
                --- questionId: "LongQuestionIdTwo"
                |
                --- //Other tag properties

Теперь, чтобы получить все теги, которые соответствуют конкретному вопросу, вам нужно просто запросить коллекцию tags, где свойство questionId содержит идентификатор нужного вопроса.

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

Firestore-root
    |
    --- questions (collections)
    |     |
    |     --- questionId (document)
    |            |
    |            --- questionId: "LongQuestionIdOne"
    |            |
    |            --- title: "Question Title"
    |            |
    |            --- tags (collections)
    |                 |
    |                 --- tagIdOne (document) //<----------- Same tag id
    |                 |     |
    |                 |     --- tagId: "yR8iLzdBdylFkSzg1k4K"
    |                 |     |
    |                 |     --- tagName: "History"
    |                 |     |
    |                 |     --- //Other tag properties
    |                 |
    |                 --- tagIdTwo (document) //<----------- Same tag id
    |                       |
    |                       --- tagId: "tUjKPoq2dylFkSzg9cFg"
    |                       |
    |                       --- tagName: "Geography"
    |                       |
    |                       --- //Other tag properties
    |
    --- tags (collections)
          |
          --- tagIdOne (document) //<----------- Same tag id
          |     |
          |     --- tagId: "yR8iLzdBdylFkSzg1k4K"
          |     |
          |     --- tagName: "History"
          |     |
          |     --- questionId: "LongQuestionIdOne"
          |     |
          |     --- //Other tag properties
          |
          --- tagIdTwo (document) //<----------- Same tag id
                |
                --- tagId: "tUjKPoq2dylFkSzg9cFg"
                |
                --- tagName: "Geography"
                |
                --- questionId: "LongQuestionIdTwo"
                |
                --- //Other tag properties

Видите, объекты тегов такие же, как в users -> uid -> tags -> tagId, так и в tags -> tagId. Таким образом, мы сливаем данные, чтобы сгруппировать как-то существующие данные.

Для получения дополнительной информации вы также можете посмотреть:

Поскольку вы говорите, что у вас есть фон SQL, попробуйте подумать о нормализованном дизайне, который часто будет хранить разные, но связанные фрагменты данных в отдельных логические таблицы, которые называются отношениями. Если эти отношения физически хранятся в виде отдельных файлов на диске, выполнение запроса, извлекающего информацию из нескольких отношений (операций соединения), может быть медленным. Если многие отношения объединяются, это может быть слишком медленным. Поскольку в базах данных NoSQL у нас нет предложений «JOIN», мы должны создать разные обходные пути, чтобы получить одинаковое поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...