Что такое нереляционная (NoSQL) база данных?

Ответ

Нереляционная (NoSQL) база данных — это система хранения, которая не использует табличную реляционную модель. Данные хранятся в форматах, оптимизированных для конкретных сценариев: документы, пары «ключ-значение», графы или широкие столбцы.

Основные типы и примеры:

Тип Модель данных Примеры Лучший сценарий использования
Документная JSON/BSON документы MongoDB, CouchDB Контент-менеджмент, каталоги
Ключ-значение Простая пара ключ-значение Redis, DynamoDB Кэширование, сессии, счетчики
Колоночная Таблицы, оптимизированные по столбцам Cassandra, HBase Аналитика, временные ряды
Графовая Узлы и ребра графа Neo4j, Amazon Neptune Социальные сети, рекомендации

Пример работы с Redis (ключ-значение):

// Сохранение значения
jedis.set("user:1000:name", "Анна");
// Получение значения
String userName = jedis.get("user:1000:name");

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

  • Горизонтальная масштабируемость (шардирование).
  • Гибкая схема данных, не требующая миграций.
  • Высокая производительность для определенных паттернов доступа.

Недостатки:

  • Часто отсутствие полной ACID-транзакционности (модель eventual consistency).
  • Сложность выполнения сложных запросов, аналогичных SQL JOIN.
  • Меньшая стандартизация по сравнению с SQL.

Ответ 18+ 🔞

Давай разберём эту NoSQL-хуйню, а то народ путается, как в тёмной комнате с мандаврами.

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

Основные разновидности этой вольницы:

Тип Как хранит Примеры Когда юзать
Документная JSON-документы, как объекты в коде MongoDB, CouchDB Каталоги товаров, контент всякий, где структура плавает.
Ключ-значение Примитив дохуя: ключ → значение Redis, DynamoDB Кэш, сессии, счётчики лайков — быстро и без затей.
Колоночная Данные хранит по столбцам, а не строкам Cassandra, HBase Для аналитики, где нужно по миллиарду записей одним махом просеять.
Графовая Узлы и связи между ними, как в соцсетях Neo4j Рекомендации, выявление связей, всякие соцграфы — где связи главнее самих данных.

Вот, смотри, как с Redis (ключ-знач) общаться:

// Запихнули значение по ключу — просто, как три копейки.
jedis.set("user:1000:name", "Анна");
// Достали обратно — элементарно, Ватсон!
String userName = jedis.get("user:1000:name");

Чем это всё, блядь, хорошо:

  • Масштабируется вширь (шардирование) — можно на кучу серваков раскидать, если нагрузка овердохуищная.
  • Схема не душит — добавил новое поле в JSON-документ и пошёл дальше, без миграций и истерик.
  • Летит как угорелое для своих паттернов доступа. Redis, например, просто ракета, а не база.

Но и подводных ебуч, конечно, хватает:

  • ACID-транзакции часто хромают или их вообще нет (модель eventual consistency, "станет согласованным... когда-нибудь").
  • Сложные запросы — забудь. Тут нет того мощного JOIN, к которому привык в SQL. Придёшь к этому — и волнение ебать.
  • Стандартов нет, бардак полный. Каждая база живёт по своим понятиям, учи каждый синтаксис отдельно.