Включите исполнение JavaScript в браузере, чтобы запустить приложение.
15 сен 2024

NoSQL: что это такое, отличие от других баз данных, принципы работы и области применения

Подробное руководство по NoSQL базам данных для начинающих. Разберем, что такое NoSQL базы данных, их преимущества и отличия от SQL, когда и для чего следует их применять. Виды NoSQL баз данных, популярные СУБД и примеры их использования.

Появление технологии NoSQL — результат новых вызовов эпохи Big Data, в которой сильно выросли требования к функциональности баз данных. В отличие от реляционных БД, где информация хранится в табличной форме, NoSQL хранит ее менее структурировано. Это полезно в тех случаях, когда традиционные реляционные СУБД неэффективны — при работе с большими данными или высокой нагрузкой.

Что такое NoSQL

NoSQL (от англ. Not only SQL) — общее название технологий управления нереляционными базами данных. У таких БД нет жесткой табличной структуры, как у реляционных, — они поддерживают другие модели хранения информации, среди которых:

  • Столбцовая, или «колоночная», — организована по столбцам, что помогает быстро работать с большими объемами данных и выбирать только необходимые из них при запросах. Используется в СУБД Apache Cassandra, HBase, Google Cloud Bigtable и Apache Phoenix.
  • Графовая — информация хранится в виде узлов, ребер и свойств графов. Это дает возможность моделировать и анализировать связи между данными. Используется в Neo4j и Amazon Neptune.
  • Документоориентированная — данные в виде документов, обычно в формате JSON, BSON или XML. Это позволяет хранить взаимосвязанную информацию в одном документе. Модель используют в MongoDB и Couchbase.
  • Ключ-значение — каждая запись имеет уникальный ключ и соответствующее значение. Эту форму хранения данных для кэширования и быстрого доступа к информации используют в Redis и Amazon DynamoDB.

Таким образом, NoSQL способны хранить информацию в произвольном формате, адаптируя ее под конкретные задачи. Это дает разработчикам свободу проектирования, высокую производительность и масштабируемость.

История появления и развития баз данных NoSQL

Сначала термин NoSQL был использован как название реляционной БД с открытым доступом, созданной итальянским ученым Карло Строззи в 1998 году. Она хранила информацию как ASCII-файлы, а вместо SQL-запросов использовала shell-скрипты. Название этой БД подразумевало, что для запросов не используется SQL — декларативный язык запросов.

В современной трактовке NoSQL database — это системы управления нереляционными базами данных. Сейчас этот термин не означает отказ от SQL. Однако его использование невозможно в нереляционных БД из-за того, что он создавался именно для жестких табличных структур.

Истоки современного понимания NoSQL восходят к началу 2000–2010-го гг., когда большие компании столкнулись с ограничениями реляционных СУБД. Необходимость обрабатывать большие массивы разнородных данных в режиме реального времени, а также поддерживать постоянно меняющиеся требования к их структуре, подтолкнула разработчиков из Google и Amazon к поиску альтернатив. Так появилась высокомасштабируемая поисковая система от Google и прочие сервисы: Gmail, Google Maps, Google Earth, а вместе с ними и Amazon DynamoDB от Amazon. Благодаря этим компаниям технология NoSQL стала использоваться повсеместно:

  • веб-приложения;
  • социальные сети;
  • аналитика больших данных;
  • интернет вещей — IoT;
  • игровая индустрия;
  • мониторинговые системы;
  • финансовые приложения;
  • системы управления контентом.

Преимущества и отличия от SQL

Традиционные СУБД ориентируются на требования ACID (Atomicity, Consistency, Isolation, Durability). Это набор свойств, которые обеспечивают надежность и целостность данных в реляционных БД. Разберем аббревиатуру ACID:

  1. Атомарность. Операции с данными либо выполняются полностью, либо не выполняются вовсе. Транзакция не может быть зафиксирована в системе частично. Если операцию невозможно выполнить из-за ошибки или сбоя, она будет отменена, а данные будут восстановлены до последнего состояния.
  2. Согласованность. Информация в БД всегда должна быть согласована по определенной структуре и правилам. Она не может быть изменена вопреки этим правилам.
  3. Изоляция. Операции с данными выполняются изолированно, то есть параллельные операции не должны влиять друг на друга. Каждая операция выполняется в отдельной транзакции, и ее результаты не могут быть изменены другой транзакцией. Поскольку такое требование затратно для реализации, в БД обычно есть частично изолирующие транзакцию режимы.
  4. Надежность. Изменения, сделанные успешной транзакцией, должны сохраниться даже при сбое системы, вплоть до ее обесточивания или поломки оборудования. У пользователя не должно быть сомнений, что подтвержденные системой изменения были внесены.

Чтобы обеспечить хорошую производительность и масштабируемость, нереляционные БД часто используют свойства, отличные от ACID. К самым популярным можно отнести BASE и CAP-теорему.

BASE

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

Гибкость. Информация может находиться в неустойчивом состоянии в течение некоторого времени, пока не будет достигнута согласованность.

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

В отличие от ACID, принципы BASE обеспечивают большую доступность и масштабируемость, жертвуя строгой согласованностью в краткосрочной перспективе. Это позволяет NoSQL-БД устойчиво и эффективно работать в распределенных средах с возможными сетевыми разделениями. То есть нереляционные базы данных на BASE могут корректно функционировать, даже когда часть узлов теряет связь друг с другом.

CAP-теорема

Теорема утверждает, что в распределенных системах одновременно можно обеспечить только два из трех необходимых свойств: 

  1. Согласованность — во всех вычислительных узлах в один момент времени данные не противоречат друг другу.
  2. Доступность — любой запрос к распределенной системе завершится получением ответа, однако нет гарантии, что ответы всех узлов системы совпадут.
  3. Устойчивость к разделению сети — расщепление распределенной системы на несколько изолированных секций не приводит к ошибочному отклику от каждой из секций.

CAP-теорема и BASE используются для достижения одних и тех же целей — увеличения производительности и масштабируемости.

Преимущества NoSQL баз данных

У NoSQL баз данных много полезных качеств:

  • Хранение неструктурированных и изменяющихся данных без строгой предварительной схемы, что дает гибкость при работе с разнородной информацией.
  • Горизонтальная масштабируемость работает за счет добавления новых узлов, что дает возможность обрабатывать большие объемы информации и поддерживает распределенные системы.
  • Линейная масштабируемость — увеличение производительности системы новыми процессорами.
  • Высокая доступность и отказоустойчивость благодаря распределенной архитектуре помогает избежать единой точки отказа.
  • Высокая скорость обработки точечных запросов за счет оптимизации.
  • Поддержка разных моделей хранения информации.
  • Хранение и обработка данных не требуют строгой предварительной схемы.
  • Простота и доступность разработки.
  • Высокая производительность при работе с большими объемами данных.

Принципы работы NoSQL

Горизонтальное масштабирование

РСУБД, как Oracle или MySQL, масштабируются вертикально, то есть увеличивают вычислительные ресурсы на одном сервере. Однако при работе с географически распределенными данными вертикальное масштабирование может столкнуться с ограничениями в производительности и доступности информации.

Представим глобальный сервис онлайн-карт, который хранит и обрабатывает огромные объемы географических данных. При использовании РСУБД с вертикальным масштабированием возможны проблемы с качеством и скоростью работы в разных уголках мира. Это происходит из-за ограничений по ресурсам одного сервера, а также из-за большого времени отклика.

Нереляционные БД легко поддаются горизонтальному масштабированию, то есть распределению данных и нагрузки на множество серверов. Достигается это добавлением новых узлов, которые обрабатывают больше информации, поддерживают распределенную систему и снижают время отклика. Также это уменьшает затраты на хранение информации.

Гибкость схемы данных

Реляционные БД требуют строгого определения схемы хранения и записи, что затрудняет работу с неструктурированной или изменяющейся информацией. Например, в системе постоянно изменяется информация о расположении объектов и их атрибутах. Использование РСУБД с жесткой схемой может затруднить добавление новых типов данных или изменение существующей структуры без перестройки всей БД.

Нереляционные БД можно строить без предварительной схемы — «schema-less», без схемы. Это упрощает проектирование и удешевляет разработку.

Отказоустойчивость

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

Эффективное хранение и обработка данных

Чем больше информации мы храним, тем больше ресурсов нужно на обработку конкретного запроса. Поскольку нереляционные БД изначально ориентированы на работу с большими массивами информации, в них применяется несколько решений этой проблемы:

  • Компактные структуры данных. Нереляционные БД, особенно документоориентированные, используют компактные форматы для хранения информации — JSON, BSON и XML. Эти форматы файлов могут содержать произвольное количество полей и значений, что позволяет хранить данные разных типов (текст, числа, даты, массивы) в одном документе. В качестве полей и значений они также могут содержать другие документы, что дает возможность создавать иерархические структуры.

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

  • Идентификаторы и индексы. Каждый документ обычно имеет уникальный идентификатор — id, который можно быстро найти и получить доступ к конкретной записи. В зависимости от СУБД либо он генерируется сам, либо указывается атрибут, который будет выполнять роль идентификатора, — например, ИНН предпринимателя.

Индексы позволяют быстро находить данные по определенным полям или критериям, улучшая производительность запросов. NoSQL базы данных, такие как MongoDB, поддерживают разные типы индексов: однополевые, составные, геопространственные и другие. В зависимости от конкретного случая индексы настраиваются вручную либо автоматически.

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

Это древовидная структура, где каждый узел соответствует одному символу в строке. То есть каждый путь от корня до листа условного дерева соответствует одной строке в БД. Чтобы навигация по базе с помощью такого способа не была слишком ресурсозатратной, используются методы сжатия. Например, LOUDS (Level-Order Unary Degree Sequence) позволяет сохранить структуру дерева в виде компактной битовой карты, без необходимости выделения памяти под указатели на узлы. Это экономит место и повышает эффективность навигации. Для обхода префиксного дерева, представленного битовой картой, используются специальные формулы. Они вычисляют индексы родительских и дочерних узлов, реализуя переходы по дереву.

  • Хранение данных в оперативной памяти. Некоторые нереляционные БД целиком хранят данные в оперативной памяти. Каждый раз, отправляя запрос на поиск или обновление информации, они обращаются только к ней в обход жесткого диска.

Для сохранности и возможности восстановления такие СУБД записывают на жесткий диск журнал транзакций — список всех действий, произведенных с памятью. Каждая новая транзакция записывается в самый конец журнала. Производительность БД от этого никак не страдает, поскольку HDD обычно хорошо справляются с последовательной записью информации, чего не скажешь о произвольной записи. Для первого варианта головке диска не нужно двигаться — она считывает данные по мере вращения диска. А для произвольной записи ей нужно совершать физическое движение, из-за чего производительность таких операций чудовищно мала. Несмотря на отличия в устройстве, это правило распространяется и на SSD.

Для компактификации журналов транзакций в таких СУБД используются снимки состояний. Это периодическое копирование всех данных из оперативной памяти на жесткий диск. Имея свежий снимок, мы можем удалить все старые журналы транзакций. Это нужно, чтобы уменьшить занимаемую журналами память и для ускорения восстановления БД в случае сбоя.

Высокая производительность

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

Принцип работы параллельной обработки заключается в одновременном выполнении нескольких операций над данными на различных узлах или процессорах. Это ускоряет обработку запросов за счет оптимизации распределения нагрузки. Также для этих целей используется многопоточность, распределенные вычисления и сегментирование информации — шардирование.

Например, нам нужно проанализировать большой массив информации о поведении пользователей в социальной сети для выявления популярных тем и трендов. Для этого данные дробятся на фрагменты по временным интервалам или группам пользователей. Каждый шард будет обрабатываться отдельным узлом, что позволит распределить нагрузку и ускорить процесс.

Недостатки NoSQL баз данных

Однако у NoSQL есть и недостатки:

  • отсутствие поддержки SQL — у большинства NoSQL свои языки запросов;
  • ограничение согласованности;
  • нарушение целостности;
  • недостаточная надежность, вытекающая из нарушения согласованности и целостности;
  • непостоянная предсказуемость, ставшая следствием недостаточной надежности;
  • больше проблем с безопасностью, чем у РСУБД;

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

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

Целостность подразумевает, что информация в базе точная и соответствует установленным правилам. Это означает, что данные должны быть сохранены в соответствии с ожидаемым форматом и структурой.

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

Базы данных NoSQL обычно не поддерживают сложные сочленения, подзапросы и вложенные запросы. Большинство API для взаимодействия с NoSQL СУБД являются урезанной версией SQL, что ограничивает возможности выполнения сложных SQL-подобных запросов.

Типы NoSQL

Базы данных «ключ — значение»

Такие БД хранят информацию в виде пар «ключ — значение». Ключи служат уникальными идентификаторами для связанных с ними значений: текст, видео, аудио и другие. Основная концепция таких БД заключается в том, что они не обращают внимания на структуру самих значений, а фокусируются на быстром доступе к данным по ключам. Преимущества такого подхода:

  • высокая производительность;
  • быстрая обработка запросов;
  • простота использования;
  • линейная масштабируемость.

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

Популярные БД:

  • Redis — резидентная NoSQL-БД, то есть хранящая данные в оперативной памяти сервера. Она работает очень быстро и может быть использована для обработки информации в реальном времени. Redis также поддерживает функции транзакций и «публикация — отслеживание».
  • Memcached — еще одна резидентная БД. Она используется для кэширования и высокоскоростного доступа к данным.
  • Riak — хранит информацию в большой хеш-таблице. Имеет высокую доступность, отказоустойчивость, поддерживает горизонтальное масштабирование и репликацию.
  • Amazon DynamoDB — управляемая NoSQL-БД, поставляемая Amazon Web Services. Обладает всеми плюсами своего типа БД, предлагает гибкую настройку хранения и поддерживает автоматическое масштабирование в зависимости от нагрузки.

Документоориентированные базы данных 

В них данные организованы в виде документов, записанных в форматах JSON, BSON или XML. Документы сгруппированы в коллекции или контейнеры, что позволяет создавать связи между ними. Также есть возможность создания иерархических структур.

Преимущества:

  • горизонтальная масштабируемость;
  • быстрая обработка запросов;
  • высокая производительность;
  • простота и удобство поддержки.

Популярные БД:

  • MongoDB — одна из самых популярных NoSQL-БД. Использует JSON-документы, поддерживает функции индексирования, агрегации и map-reduce.
  • CouchDB — также использует JSON-документы, поддерживает индексирование и агрегацию.

Графовые базы данных 

Это БД, основанная на топологической структуре графа, где информация хранится в виде узлов, ребер и свойств. Она используется для моделирования сложных отношений между объектами, что делает ее отличным инструментом для анализа и визуализации связей в данных. Графовые БД эффективно работают в ситуациях, когда важны не только данные, но и их взаимосвязь.

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

  • гибкость;
  • глубокий анализ;
  • производительность;
  • адаптивность.

Особенности графовых БД сделали их популярными в моделировании социальных графов, семантической паутины и других областях, где важны отношения между данными. Известные БД:

  • Neo4j — графовая БД с мощными инструментами моделирования и анализа сложных отношений между данными.
  • OrientDB — обеспечивает возможности моделирования сложных структур, поддерживая гибкость и высокую производительность. Также предлагает широкий спектр дополнительных функций для работы над данными — например, визуализацию.
  • Amazon Neptune — управляемая графовая БД, имеющая функции непрерывного резервного копирования и интеграции с другими сервисами AWS. Поддерживает популярные графовые языки запросов Gremlin, openCypher и SPARQL, а потому хорошо подходит для интеграции с существующими приложениями.

Столбцовые базы данных 

В них информация организована по столбцам, то есть она группируется по некоторым признакам. Однородность информации в столбцах помогает более эффективно их сжимать, что экономит место в хранилище. Также при обработке запросов данные извлекаются по столбцам, что дает повышенную производительность. Это особенно полезно для аналитики. Столбцовое хранение позволяет более точно обращаться к данным, необходимым для ответа на запрос, минимизируя количество операций поиска и сканирования. Преимущества:

  • производительность;
  • оптимизация хранения;
  • быстрый поиск.

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

Популярные БД:

  • HBase — поддерживает функции индексирования и агрегации. HBase также имеет высокую производительность и масштабируемость.
  • Apache Cassandra — поддерживает функции индексирования и агрегации. Обеспечивает высокую доступность, отказоустойчивость и горизонтальную масштабируемость. Эффективно работает с большими объемами данных, предоставляет высокую производительность для аналитических запросов, затрагивающих только несколько столбцов.
  • Amazon Redshift — полностью управляемое облачное хранилище. Оно предназначено для быстрого выполнения сложных аналитических запросов на больших объемах информации.

Многомодельные базы данных

Это NoSQL-БД, которые могут работать с разными моделями хранения информации:

  • ArangoDB — многомодельная БД, которая поддерживает документоориентированную, графовую модели и и «ключ — значение». Она предоставляет гибкую схему данных и высокую производительность для различных типов приложений. Использует собственный язык запросов AQL, который сочетает возможности SQL и NoSQL. Особенности ArangoDB включают горизонтальную масштабируемость, транзакционность и интеграцию с другими технологиями.
  • Couchbase — поддерживает документоориентированную и «ключ — значение» модели. Обладает высокой производительностью, масштабируемостью, надежностью. Имеет возможности кэширования, репликации и работы с гибридными моделями хранения.

Заключение

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