В чем разница реляционных, NoSQL и колоночных баз данных
Что проверяют
Различаете ли вы модель данных и физическое хранение, и понимаете ли, под какую нагрузку что берут.
Как отвечать
Сразу разведите две разные оси: модель данных (как описаны сущности) и способ хранения (как байты лежат на диске). Реляционные и NoSQL это про первую ось, колоночные про вторую.
Реляционные: данные в таблицах со строгой схемой, связи по внешним ключам, транзакции ACID, язык SQL. Строка хранится целиком в одном месте, поэтому чтение и запись одной записи дёшевы. Это база для операционной нагрузки: заказы, платежи, профили.
NoSQL это зонтик для нескольких моделей: документные, ключ-значение, широких колонок, графовые. Общее у них это гибкая схема и расчёт на горизонтальное масштабирование, часто ценой согласованности в конечном счёте.
Колоночные (ClickHouse, Vertica, BigQuery, а также форматы Parquet и ORC) хранят значения по колонкам, а не по строкам. Отсюда всё их поведение:
- запрос по трём колонкам из сотни не читает остальные девяносто семь, а в строковой базе пришлось бы прочитать строки целиком;
- сжатие в разы лучше, потому что рядом лежат однотипные и часто повторяющиеся значения;
- векторизованное выполнение: операции применяются к блокам значений сразу.
Плата за это: точечные обновления и удаления дороги или почти невозможны, транзакций обычно нет, а чтение одной конкретной строки медленнее, потому что её надо собрать из разных мест.
Правило выбора: операционная нагрузка на реляционной, аналитика на колоночной, специальные шаблоны на NoSQL. Типичная схема это PostgreSQL как основное хранилище плюс ClickHouse для отчётов, куда данные приезжают потоком.
Частая путаница: базы «широких колонок» вроде Cassandra это про модель данных, а не про колоночное хранение. Названия похожи, суть разная.
Где спотыкаются
Путают базы широких колонок и колоночное хранение.
Строят отчёты на операционной базе и роняют её тяжёлыми запросами.
Пытаются обновлять строки в колоночной базе как в обычной.
Считают колоночную базу заменой основной, а не дополнением.