Поиск по сайту:

Что такое база данных NoSQL и для чего они нужны?


База данных NoSQL — это любая база данных, отличающаяся от традиционной конструкции SQL. Базы данных NoSQL, такие как MongoDB на основе документов, в последние годы стали более популярными. О чем весь хайп?

Ограничение SQL: масштабируемость

SQL существует всегда — 45 лет. Он работает на удивление хорошо, а современные реализации SQL работают очень быстро. Но по мере роста Интернета росла и потребность в мощных базах данных, масштабируемых для удовлетворения спроса.

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

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

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

И MySQL, и MongoDB, скорее всего, выполнят работу для вашего приложения, поэтому выбор между ними сводится к тому, какую структуру и синтаксис вы предпочитаете. Простота разработки важна, и вы можете обнаружить, что с моделью документа и синтаксисом гораздо более новой MongoDB работать проще, чем с SQL.

NoSQL против структуры SQL

Традиционные базы данных SQL часто называют реляционными базами данных из-за их структуры. В базе данных SQL у вас будет несколько таблиц, каждая из которых содержит несколько строк (называемых записями), которые сами имеют несколько разных столбцов или атрибутов. Каждая отдельная таблица связана с другой через первичный ключ, который образует отношение.

Например, представьте, что у вас есть таблица, в которой каждая запись представляет сообщение, сделанное пользователем. Первичным ключом здесь является имя пользователя, которое можно использовать для связи таблицы сообщений с таблицей пользователей. Если вы хотите найти адрес электронной почты того, кто сделал сообщение, вы должны выполнить поиск «Jon1996» в таблице пользователей и выбрать поле «Электронная почта».

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

Основной тип базы данных NoSQL — это база данных документов JSON, например MongoDB. Вместо хранения строк и столбцов все данные хранятся в отдельных документах. Эти документы хранятся в коллекциях (например, документ «пользователь» будет храниться в коллекции «все пользователи») и не обязательно должны иметь ту же структуру, что и другие документы в коллекции.

Например, «пользовательский» документ может выглядеть примерно так:

{
  "username":"Jon1996",
  "email":"jon1996@gmail.com",
  "posts": [
   {"id":1},
   {"id":2},
   {"id":3},
  ]
}

Поля имени пользователя и электронной почты представляют собой просто пары ключ-значение, похожие на столбцы в SQL, но поле «сообщения» содержит массив, чего вы не найдете в базах данных SQL. Теперь скажем, что у нас есть коллекция сообщений с такими документами, как:

{
  "id":1,
  "title":"First Post",
  "content":"Hello, World!",
  "madeby":"Jon1996"
}

Теперь, когда кто-то посещает страницу Джона, ваше приложение может получить три сообщения с идентификаторами 1, 2 и 3, что обычно является быстрым запросом. По сравнению с SQL, где вам, возможно, придется получить все сообщения, соответствующие идентификатору пользователя Джона. Все еще довольно быстро, но запрос MongoDB более прямой и имеет больше смысла.

Для чего нужны базы данных NoSQL?

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

Базы данных SQL, такие как MySQL, Oracle и PostgreSQL, существуют еще до появления Интернета. Они очень стабильны, имеют большую поддержку и в целом могут выполнять работу для большинства людей. Если ваши данные ценны для вас, и вы хотите получить проверенное, согласованное решение, придерживайтесь SQL.

Базы данных документов JSON, такие как MongoDB и Couchbase, популярны для веб-приложений с изменяющимися моделями данных и для хранения сложных документов. Например, такому сайту, как Amazon, часто приходится менять модель данных для хранения продуктов на сайте, поэтому для них может хорошо подойти база данных на основе документов.

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

RethinkDB – это база данных документов JSON, созданная для приложений реального времени. В базе данных, такой как MongoDB, вам нужно будет опрашивать обновления каждые несколько секунд или реализовать некоторый API поверх этого для отслеживания обновлений в реальном времени, что быстро становится тяжелым. RethinkDB решает эту проблему, автоматически отправляя обновления через потоки веб-сокетов, к которым могут подключаться клиенты.

Redis – это чрезвычайно производительная база данных типа ключ-значение, в которой небольшие ключи и строки хранятся исключительно в оперативной памяти, что намного быстрее для чтения и записи, чем даже для самых быстрых твердотельных накопителей. Он часто используется вместе с другими базами данных в качестве кэша в памяти для небольших данных, которые часто записываются и считываются. Например, приложение для обмена сообщениями может захотеть использовать Redis для хранения пользовательских сообщений (и даже для отправки обновлений в реальном времени с помощью своих методов Pub/Sub). Хранение большого количества небольших сообщений таким образом может привести к проблемам с производительностью других типов баз данных.

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

В этом примере Джордж дружит с двумя людьми, Джоном и Джейн. Если другой тип базы данных захочет понять связь Джорджа с Сарой, им придется опросить всех друзей Джона и всех друзей Джейн. Но графовые базы данных понимают эту связь интуитивно; для запроса друзей друзей популярная графовая база данных Neo4J на 60 % быстрее, чем MySQL. Для друзей друзей друзей (3 уровня) Neo4J в 180 раз быстрее.

Базы данных с широкими столбцами, такие как Cassandra и Hbase, используются для хранения больших объемов данных. Они созданы для наборов данных, которые настолько велики, что вам нужно несколько компьютеров для их хранения, и они намного быстрее, чем SQL и другие базы данных NoSQL, когда распределены по нескольким узлам.