NoSQL (первоначально обозначавший «не- SQL » или «нереляционный») [1] — это подход к проектированию базы данных , который фокусируется на обеспечении механизма хранения и извлечения данных, моделируемых способами, отличными от табличных отношений, используемых в реляционные базы данных . Вместо типичной табличной структуры реляционной базы данных в базах данных NoSQL данные размещаются в одной структуре данных. Поскольку эта конструкция нереляционной базы данных не требует схемы, она обеспечивает быструю масштабируемость для управления большими и обычно неструктурированными наборами данных. [2] Системы NoSQL также иногда называют «не только SQL» , чтобы подчеркнуть, что они могут поддерживать SQL -подобные языки запросов или располагаться рядом с базами данных SQL в многоязычных архитектурах. [3] [4]
Нереляционные базы данных существуют с конца 1960-х годов, но название «NoSQL» было придумано только в начале 2000-х годов [5] , вызванное потребностями компаний Web 2.0 . [6] [7] Базы данных NoSQL все чаще используются в больших данных и веб-приложениях реального времени . [8]
Мотивами для этого подхода являются простота конструкции , более простое «горизонтальное» масштабирование для кластеров машин (что является проблемой для реляционных баз данных), [5] более точный контроль над доступностью и ограничение несоответствия объектно-реляционного импеданса . [9] Структуры данных, используемые базами данных NoSQL (например, пара ключ-значение , широкий столбец , график или документ ), отличаются от тех, которые используются по умолчанию в реляционных базах данных, что делает некоторые операции в NoSQL более быстрыми. Конкретная пригодность конкретной базы данных NoSQL зависит от проблемы, которую она должна решить. Иногда структуры данных, используемые базами данных NoSQL, также считаются «более гибкими», чем таблицы реляционных баз данных. [10]
Многие хранилища NoSQL ставят под угрозу согласованность (в смысле теоремы CAP ) в пользу доступности, устойчивости к разделению и скорости. Препятствия для более широкого внедрения хранилищ NoSQL включают использование языков запросов низкого уровня (например, вместо SQL), отсутствие возможности выполнять специальные соединения между таблицами, отсутствие стандартизированных интерфейсов и огромные предыдущие инвестиции в существующие реляционные базы данных. . [11] В большинстве хранилищ NoSQL отсутствуют настоящие ACID- транзакции, хотя некоторые базы данных сделали их центральными в своих проектах.
Вместо этого большинство баз данных NoSQL предлагают концепцию « конечной согласованности », при которой изменения базы данных распространяются на все узлы «со временем» (обычно в течение миллисекунд), поэтому запросы к данным могут не возвращать обновленные данные немедленно или могут привести к чтению данных, которые неточно, проблема, известная как устаревшее чтение. [12] Кроме того, в некоторых системах NoSQL могут наблюдаться потери записи и другие формы потери данных . [13] Некоторые системы NoSQL предоставляют такие концепции, как упреждающая запись в журнал , чтобы избежать потери данных. [14] При распределенной обработке транзакций в нескольких базах данных согласованность данных является еще более серьезной проблемой, которая сложна как для NoSQL, так и для реляционных баз данных. Реляционные базы данных «не позволяют ограничениям ссылочной целостности охватывать базы данных». [15] Лишь немногие системы поддерживают как транзакции ACID , так и стандарты X/Open XA для распределенной обработки транзакций. [16] Общей чертой интерактивных реляционных баз данных являются методы конформационного релейного анализа. [17] Ограничения в интерфейсной среде преодолеваются с помощью протоколов семантической виртуализации, благодаря чему службы NoSQL доступны для большинства операционных систем. [18]
Термин NoSQL был использован Карло Строцци в 1998 году для названия его облегченной реляционной базы данных Strozzi NoSQL с открытым исходным кодом , которая не предоставляла стандартный интерфейс языка структурированных запросов (SQL), но все еще была реляционной. [19] Его СУБД NoSQL отличается от общей концепции баз данных NoSQL, существовавшей примерно в 2009 году. Строцци предполагает, что, поскольку нынешнее движение NoSQL «полностью отходит от реляционной модели, его следовало бы называть более уместно «NoREL»», [20] имея в виду «нереляционную».
Йохан Оскарссон, в то время разработчик Last.fm , вновь представил термин NoSQL в начале 2009 года, когда организовал мероприятие для обсуждения « распределенных нереляционных баз данных с открытым исходным кодом ». [21] Этим названием пытались обозначить появление растущего числа нереляционных, распределенных хранилищ данных, включая клоны с открытым исходным кодом Bigtable / MapReduce от Google и DynamoDB от Amazon .
Существуют различные способы классификации баз данных NoSQL с разными категориями и подкатегориями, некоторые из которых частично совпадают. Ниже приводится неполная классификация по модели данных с примерами: [22]
Хранилища «ключ-значение» (KV) используют ассоциативный массив (также называемый картой или словарем) в качестве фундаментальной модели данных. В этой модели данные представлены как набор пар ключ-значение, так что каждый возможный ключ появляется в коллекции не более одного раза. [25] [26]
Модель «ключ-значение» — одна из простейших нетривиальных моделей данных, а более богатые модели данных часто реализуются как ее расширение. Модель «ключ-значение» может быть расширена до дискретно упорядоченной модели, которая поддерживает ключи в лексикографическом порядке . Это расширение является мощным в вычислительном отношении, поскольку оно может эффективно извлекать выборочные диапазоны ключей . [27]
Хранилища «ключ-значение» могут использовать модели согласованности , начиная от окончательной согласованности и заканчивая сериализуемостью . Некоторые базы данных поддерживают порядок ключей. Существуют различные аппаратные реализации, и некоторые пользователи хранят данные в памяти (ОЗУ), а другие — на твердотельных накопителях (SSD) или вращающихся дисках (также известных как жесткий диск (HDD)).
Центральным понятием хранилища документов является понятие «документ». Хотя детали этого определения различаются в зависимости от документо-ориентированных баз данных, все они предполагают, что документы инкапсулируют и кодируют данные (или информацию) в некоторых стандартных форматах или кодировках. Используемые кодировки включают XML , YAML и JSON , а также двоичные формы, такие как BSON . Документы обращаются в базе данных с помощью уникального ключа , который представляет этот документ. Еще одной определяющей характеристикой документо-ориентированной базы данных является API или язык запросов для извлечения документов на основе их содержимого.
Различные реализации предлагают разные способы организации и/или группировки документов:
По сравнению с реляционными базами данных коллекции можно считать аналогами таблиц, а документы — аналогами записей. Но они разные — каждая запись в таблице имеет одинаковую последовательность полей, а документы в коллекции могут иметь совершенно разные поля.
Базы данных графов предназначены для данных, отношения которых хорошо представлены в виде графа , состоящего из элементов, связанных конечным числом отношений. Примеры данных включают социальные отношения, маршруты общественного транспорта, дорожные карты, топологии сетей и т. д.
Производительность баз данных NoSQL обычно оценивается с помощью показателя пропускной способности , который измеряется как количество операций в секунду. При оценке производительности необходимо уделять внимание правильным критериям, таким как производственные конфигурации, параметры баз данных, ожидаемый объем данных и одновременные рабочие нагрузки пользователей.
Бен Скофилд оценил различные категории баз данных NoSQL следующим образом: [29]
Сравнение производительности и масштабируемости чаще всего проводится с использованием теста YCSB .
Поскольку в большинстве баз данных NoSQL отсутствует возможность объединения запросов, схему базы данных обычно необходимо проектировать по-другому. Существует три основных метода обработки реляционных данных в базе данных NoSQL. (См. таблицу «Поддержка соединений и ACID» для баз данных NoSQL, поддерживающих соединения.)
Вместо получения всех данных с помощью одного запроса, для получения нужных данных обычно выполняется несколько запросов. Запросы NoSQL часто выполняются быстрее, чем традиционные запросы SQL, поэтому стоимость дополнительных запросов может быть приемлемой. Если потребуется чрезмерное количество запросов, более подходящим будет один из двух других подходов.
Вместо хранения только внешних ключей обычно вместе с данными модели сохраняются фактические внешние значения. Например, каждый комментарий в блоге может включать имя пользователя в дополнение к идентификатору пользователя, что обеспечивает легкий доступ к имени пользователя без необходимости повторного поиска. Однако при изменении имени пользователя его теперь необходимо будет изменить во многих местах базы данных. Таким образом, этот подход работает лучше, когда чтение происходит гораздо чаще, чем запись. [30]
В базах данных документов, таких как MongoDB, обычно больше данных помещается в меньшее количество коллекций. Например, в приложении для ведения блога можно сохранить комментарии в документе сообщения блога, чтобы при одном извлечении можно было получить все комментарии. Таким образом, при таком подходе один документ содержит все данные, необходимые для конкретной задачи.
База данных помечается как поддерживающая свойства ACID (атомарность, согласованность, изоляция, долговечность) или операции соединения , если это утверждается в документации к базе данных. Однако это не обязательно означает, что эта возможность полностью поддерживается так же, как и в большинстве баз данных SQL.
База данных NoSQL, также называемая Not Only SQL
многие сторонники NoSQL говорят, что это не означает «нет» SQL, скорее это означает «Не только SQL».
Карло Строцци впервые использовал термин NoSQL в 1998 году в качестве названия своей реляционной базы данных с открытым исходным кодом, которая не предлагала интерфейс SQL[...]
Хранилища «ключ-значение» позволяют разработчику приложения хранить данные без схемы.
Эти данные обычно состоят из строки, представляющей ключ, и фактических данных, которые считаются значением в отношениях «ключ-значение».
Сами данные обычно представляют собой своего рода примитив языка программирования (строка, целое число или массив) или объект, который маршалируется привязками языка программирования к хранилищу значений ключа.
Эта структура заменяет необходимость в фиксированной модели данных и обеспечивает правильное форматирование.
Хранилища «ключ-значение» предоставляют высокопроизводительную альтернативу системам реляционных баз данных в отношении хранения данных и доступа к ним.
В этой статье представлен краткий обзор некоторых доступных в настоящее время хранилищ «ключ-значение» и их интерфейса с языком программирования Ruby.