Что такое денормализация в 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», мы должны создать разные обходные пути, чтобы получить одинаковое поведение.