TCP - это возможный достигнуть более высокой скорости передачи с многочисленными связями?

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

blockquote>

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

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

blockquote>

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

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

blockquote>

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

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

blockquote>

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

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

blockquote>

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

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 в отдельную коллекцию верхнего уровня, например: [1121 ]

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. Таким образом, мы сглаживаем данные, чтобы сгруппировать каким-то образом существующие данные.

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

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

13
задан JtR 3 November 2008 в 20:31
поделиться

4 ответа

Одно преимущество, которое несколько параллельных соединений могут дать Вам (подвергающийся тем же протестам, упомянутым голубем и Brian), является Вами, сможет лучше преодолеть проблему наличия слишком маленького окна приема TCP.

Принцип, которого это касается, является продуктом задержки пропускной способности. (Существует более подробное объяснение здесь).

Краткий обзор: в высокой задержке, широкополосных средах, надежная связь, такая как TCP часто ограничивается объемом данных в полете в любой момент времени. Многочисленные связи являются одним путем вокруг этого, поскольку продукт задержки пропускной способности относится к каждому соединению индивидуально.

Более подробно рассмотрите следующее: у Вас есть сквозная пропускная способность 10^8 биты в секунду (10 мегабит/секунда), и круговая задержка 100 мс (0,1 секунды). Поэтому там может составить 10^7 биты (10 мегабит = ~1.25 мегабайта) данных, отправленных, прежде чем подтверждение первого бита данных возвратилось к отправителю.

Это будет варьироваться в зависимости от стека TCP Вашей ОС, но не - редкое значение для размера окна приема TCP составляет 64 кбайта. Это является очевидно слишком маленьким, чтобы позволить Вам полностью использовать вплотную пропускная способность; после того как 64 кбайта (512 кбит) данных были отправлены, Ваш процесс отправки будет ожидать обновления окна от получателя, указывающего, что некоторые данные были использованы прежде, чем больше помещать данные по проводу.

Наличие нескольких открытых сеансов TCP обходит это на основании того, что каждый сеанс TCP будет иметь свое собственное, отправляют/получают буферы.

Конечно, в Интернете трудно определить истинную доступную сквозную пропускную способность, из-за размера окна TCP, конкуренции, и т.д. Если Вы можете предоставить некоторым демонстрационным числам, мы можем помогать больше.

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

18
ответ дан 1 December 2019 в 21:12
поделиться

Если Вы будете единственным на ссылке, то ты увеличишься наверху и уменьшишь скорость. Однако, делясь полностью насыщенной ссылкой с другими, это - способ играть система и увеличить Вашу общую скорость (каждое соединение будет медленнее, чем единственное, но агрегат будет быстрее, поскольку Вы теперь получили больший процент "временных интервалов" (каков технический термин? Это выходит из меня теперь) выделенный Вам).

7
ответ дан 1 December 2019 в 21:12
поделиться

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

1
ответ дан 1 December 2019 в 21:12
поделиться

Описание Muz проблемы является пятном на.

Следует иметь в виду, что использование в своих интересах его может зависеть от реализации TCP в Вашей операционной системе. В частности, для лучших результатов Вы хотите стек TCP, который поддерживает опцию Window Scale от RFC 1323.

Далее, Вы, возможно, должны настроить некоторые настройки OS для создания этой работы. В Windows существует установка Registry под названием TcpWindowSize, который Вы, возможно, должны скорректировать. Существует Статья 224829 базы знаний Microsoft: Описание Windows 2000 и Windows Server 2003 Функции TCP, который описывает, как сделать это.

1
ответ дан 1 December 2019 в 21:12
поделиться