Основная цель NoSQL баз данных — предоставление дополнительного функционала в отличии от реляционных систем. Например, это может быть хранение пар ключ-значение, тогда вы получите значительное увеличение производительности за счет кеширования, или хранение неструктурных наборов данных с которыми проще будет обращаться.
Системы управления базами данных
Базы данных это логические смоделированные хранилища предназначенные для разных типов данных. Каждая база данных, за исключением безсхемных (NoSQL), использует модель, которая описывает структуру данных. СУБД — это специальные приложения или набор библиотек для работы с различными базами данных.
NoSQL системы управления базами данных
В течение последнего десятилетия, выбор многих разработчиков и системных администраторов для их приложений всегда падал на реляционные СУБД. Не смотря на то, что они не такие уж и адаптивные, функционал реляционных СУБД позволяет создавать довольно сложные системы данных. Этого было более чем достаточно, пока не появились NoSQL СУБД.
Сам термин NoSQL появился около десяти лет назад, как бы это не казалось смешным, но сначала это было названием очередной реляционной системы управления базами данных. Тем не менее подразумевала она немного другое — избежать использования стандартов SQL. В последующие несколько лет другие подхватили эту идею и стали использовать этот термин в отношении нереляционных баз данных.
По задумке NoSQL базы данных и СУБД не подразумевают внутренних связей. Они не основываются на одной модели, а каждая база данных в зависимости от целей использует различные модели.
Существует довольно много различных моделей и функциональных систем для NoSQL баз данных:
- Хранилище ключ-значение — Redis, MemcacheDB и т.д. (обычно хранят данные в памяти)
- Распределённое хранилище (Column-oriented) — Cassandra, HBase и т.д (предназначены для очень больших объёмов данных).
- Документо-ориентированные СУБД — MongoDB, Couchbase и т.д. (предназначены для хранения иерархических структур данных — документов)
- БД на основе графов — OrientDB, Neo4J и т.д.
Чтобы лучше понять чем отличаются все эти типы СУБД, рассмотрим их.
Хранилище ключ-значение
Начнем наше рассмотрение с типа хранилища ключ-значение, так как это самое основное решение из семейства NoSQL. Этот тип БД работает с данными типа ключ-значение, например как словарь. Здесь нет места ни структуре, ни связям. После подключения к серверу (например Redis) приложение может задать ключ и его значение, а в последствии получать эти данныe по запросу.
Такие СУБД обычно используются для быстрого сохранения базовых данных, а иногда не таких уж и базовых, если подсчитать затраты процессора и памяти. Они, обычно, очень быстры, работоспособны или легко масштабируемы (хорошо использовать такие БД для хранения сессий, кеша, счётчиков посещений или просмотров и т.д.).
Заметка: когда дело касается компьютеров, словарь это особый тип данных. Он представляет собой массив коллекций с различными ключами и соответствующими им значениями.
Распределённое хранилище
По сути это следующий шаг после СУБД типа ключ-значение. Несмотря на довольно сложную для понимания сущность, эти базы данных отлично работают просто создавая коллекции из одного или нескольких пар ключ-значение, которые в сумме соответствуют одной записи.
В отличии от привычных таблиц в реляционных моделях, эти СУБД не требует предварительного описания структуры данных. Каждая запись состоит из одного или нескольких столбцов содержащих данные, а каждый столбец разных записей может хранить разные типы данных.
В целом, распределённое хранилище ни что иное как двумерный массив, где каждый ключ (запись) содержит одну или несколько пар ключ-значение привязанных к нему. Такая система позволяет хранить и использовать большие объемы неструктурированных данных. (одна запись с большим количество дополнительной информации) . Такие базы данных обычно используются, когда недостаточно простых пар ключ-значение, а хранить необходимо большой объем записей с различной информацией. Такие СУБД при соответствующем использовании могут быть очень производительными.
Документо-ориентированные хранилища
Такие NoSQL СУБД очень быстро захватили свой рынок. Они работают так же как и предыдущие системы, но они допускают гораздо большую вложенность и сложность структуры данных. (например, документ вложенный в документ, вложенный в документ). Документы снимают ограничения вложенности первого и второго уровней типа ключ-значение в распределённых хранилищах. В целом, можно описать сколь угодно сложную структуру данных как документ и сохранить в такой БД.
Несмотря на довольно большой функционал и способность доступа к данным по одному ключу, такие СУБД имеют ряд своих проблем. Например, при доступе к одному документу вы полностью получаете его в ответ на запрос, даже если вам необходимо какое-то одно поле, что не может не сказаться на производительности.
Базы данных на основе графов
На последок мы оставили самое интересное. БД на основе графов хранят данные в совсем другом виде. Они используют древовидные структуры с узлами и связями соединяющими их. Так же как и в математике, некоторые операции гораздо удобнее выполнять с такими данными благодаря связям между ними и их группировке (например, связи между людьми).
Такие базы данных часто используются в приложениях, где нужно иметь четко установленные связи. Например, когда вы регистрируетесь в какой либо социальной сети, хранить связи между вами и вашими друзьями хранить гораздо проще при использовании баз данных на основе графов.
СУБД Ключ-Значение (Key-Value)
Такие БД очень производительны, просты в обращении и легко масштабируются
Популярные СУБД
Некоторые популярные хранилища:
- Redis — БД в оперативной памяти с дополнительной отказоустойчивостью
- Riak — Распределенное, репликационное хранилище
- Memcached / MemcacheDB — распределённая БД в оперативной памяти
Примеры использования
Часто встречающиеся случаи применения БД хранилищ ключ-значение:
- Кеширование — быстрое и частое сохранение данных для будущего использования
- Очередь — некоторые БД типа ключ-значение поддерживают списки, наборы и очереди
- Распределение информации/задач — используется для реализации паттерна Pub/Sub
- Живое обновление информации — приложения использующие состояния
NoSQL распределённые СУБД
Такие системы баз данных очень эффективны и могут быть использованы для хранения важной информации больших объемов. Может они где то не очень гибки в плане данных, зато они функциональны и производительны.
Популярные СУБД
Вот основные представители этого типа БД:
- Cassandra — структура данных основана на BigTable и DynamoDB
- HBase — хранилище для Apache Hadoop основанное на принципах BigTable
Примеры использования
Основные области применения:
- Хранение неструктурированных, не разрушаемых данных — если вам необходимо хранить большие объемы данных в течение долгого времени, то такие БД очень хорошо справятся с задачей
- Масштабирование — по задумке такие базы данных легко масштабируются. Они легко справляются с любым объемом данных
Документо-ориентированные СУБД
Документ-ориентированные хранилища отлично хранят несвязанную информацию больших объемов, даже если она очень разнится от сущности к сущности.
Популярные СУБД
Часто встречающиеся СУБД:
- Couchbase — основанное на JSON, совместимое c Memcached хранилище
- CouchDB — передовое документо-ориентированное хранилище
- MongoDB — очень популярное и функциональное хранилище
Примеры использования
Часто встречающиеся сферы применения:
- Вложенная информация — документо-ориентированные хранилища отлично работают с глубоко вложенной, сложной информацией
- Поддержка JavaScript — одна из отличительных особенностей документо-ориентированных хранилищ это то, как они работают с другими приложениями: поддержка JSON
NoSQL базы данных типа граф
Такие типы БД хранят информацию совершенно особенно, совсем не как все остальные СУБД.
Популярные СУБД
Часто встречаемые СУБД:
- OrientDB — очень быстрое документо-ориентированное хранилище гибрид типа граф написанное на Java. Включает в себя разные режимы работы
- Neo4J — безсхемное, очень мощное и популярное хранилище написанное на Java
Примеры использования
Часто встречаемые примеры использования:
- работа со сложно связанной информацией — как было сказано во вступлении, хранилища типа граф отлично справляются со сложно связанной информацией. Например хранения связей между двумя сущностями и целого ряда разноуровневых связей между сущностями не связанных с первыми напрямую.
- Моделирование и поддержка классификаций — такие БД преуспели везде где есть связи. Моделирование данных и классификация различной информации по связям можно с легкостью представить используя эти БД.
Сравнение NoSQL СУБД и реляционных СУБД
Чтобы иметь четкое представление чем NoSQL отличается от реляционных систем, давайте составим список с основными различиями.
Примеры использования NoSQL
- Скорость — NoSQL базы данных обычно быстрее, а иногда намного быстрее, когда дело доходит до записи. Операции чтения также могут быть довольно быстрыми в зависимости от того какую именно БД вы используете
- Безсхемная разработка — Реляционные СУБД требуют четко описанную структуру данных до начала работы. NoSQL решения предлагают более гибкие решения.
- Автоматизированная (или очень простая) репликация/масштабирование — NoSQL базы данных быстро развиваются — разработчики активно решают основные проблемы, одна из которых — репликация и масштабирование. В отличии от реляционных СУБД, NoSQL решения легко масштабируются и работают с кластерами.
- Большой выбор — когда дело доходит до выбора NoSQL хранилища, существует большой выбор различных моделей. Как было сказано ранее, то насколько правильно вы сделаете свой выбор повлияет на производительность вашей системы.