Сравните реляционные и колоночные базы данных. В чем их ключевые различия?

Ответ

Реляционные и колоночные базы данных fundamentally отличаются способом хранения и обработки данных, что делает их подходящими для разных задач.

Реляционные (Row-based) БД хранят данные строками. Каждая строка представляет собой единую запись со всеми ее атрибутами. Они оптимизированы для транзакционных операций (OLTP).

Колоночные (Column-based) БД хранят данные столбцами. Все значения одного столбца хранятся вместе. Они оптимизированы для аналитических запросов (OLAP).

Вот ключевые различия в виде таблицы:

Характеристика Реляционные БД (Row-based) Колоночные БД (Column-based)
Модель хранения Данные хранятся по строкам (вся запись целиком). Данные хранятся по колонкам (значения одного поля вместе).
Основной сценарий OLTP (Online Transaction Processing): частые операции чтения, записи и обновления отдельных строк. OLAP (Online Analytical Processing): агрегация и анализ больших объемов данных по нескольким колонкам.
Скорость чтения Быстрое чтение всей строки (SELECT * ...). Очень быстрое чтение данных из конкретных колонок (SELECT column1, column2 ...).
Скорость записи Быстрая вставка или обновление целой строки. Медленная, так как нужно записать данные в файлы разных колонок.
Сжатие данных Менее эффективное, так как в одной строке хранятся разные типы данных. Очень эффективное, так как однотипные данные в колонке хорошо сжимаются.
Примеры PostgreSQL, MySQL, Oracle, MS SQL Server. ClickHouse, Vertica, Google BigQuery, Apache Cassandra (гибрид).

Простой пример: Запрос SELECT AVG(price) FROM products в колоночной БД прочитает только один столбец price, что будет в разы быстрее, чем в реляционной, которая (упрощенно) будет вынуждена пройти по всем строкам, даже если другие поля не нужны.

Ответ 18+ 🔞

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

Реляционные базы (Row-based) — это как ты, блядь, обычный человек хранишь вещи. Штаны, носки, майку — всё в один ящик комода, комплектом. Пришел с работы, снял всё разом — и хуй в ящик. Утром достал весь комплект — и натянул. Оптимизировано под быструю смену хуйни (OLTP).

Колоночные базы (Column-based) — это уже ёбаный склад перфекциониста-аналитика. У него, сука, отдельный стеллаж на все левые носки, отдельный — на все правые, отдельный — на все штанины. Нужно посчитать, сколько у тебя носков черных? Да хуй проблема — пошел к стеллажу "носки" и посчитал. Но если тебе полный комплект одежды надеть — это пиздец, оббегать все стеллажи. Зато для подсчетов и отчетов (OLAP) — самое то.

Короче, смотри таблицу, я её для наглядности сделал, а то ты опять нихуя не поймешь:

Признак Реляционные (Row-store) Колоночные (Column-store)
Как хранят Всю запись (строку) целиком, как пачку. По колонкам. Все цены в одну кучу, все названия — в другую.
Для чего созданы OLTP: чтобы быстро добавлять заказы, менять статусы, искать клиентов. Живые, ебучие транзакции. OLAP: чтобы начальнику-пидорасу посчитать, сколько в среднем продали за прошлый год по всем филиалам. Аналитика, блядь.
Чтение Молниеносно, если тебе нужна ВСЯ строка. SELECT * FROM orders WHERE id=5 — раз, и вся инфа по заказу №5 у тебя. Овердохуища быстрее, если нужны 2-3 колонки из тысячи. SELECT SUM(revenue) FROM sales — прочитает только колонку revenue, а остальные 999 колонок даже не тронет.
Запись Быстро и просто. Новая строка — и в конец файла её. Медленно и муторно. Новую запись надо раскидать по куче разных файлов-колонок.
Сжатие Так себе. В строке же разная хуйня: и текст, и цифры, и даты — плохо жмется. Ахуенно! В колонке данные одного типа, поэтому сжимаются в разы лучше. Экономия места — просто пиздец.
Примеры PostgreSQL, MySQL — вся эта классика, на чем половина интернета работает. ClickHouse, Vertica — для всяких умных дашбордов и отчетов, где нужно за секунды просрать терабайты логов.

Ну и пример, чтобы окончательно врубиться: Допустим, таблица products на миллион строк, и в ней 50 полей. Тебе надо среднюю цену вычислить.

В реляционной базе запрос SELECT AVG(price) FROM products будет, грубо говоря, читать ВСЕ 50 полей ВСЕХ миллиона строк, чтобы добраться до поля price. Тупизм, но так устроено хранение по строкам.

В колоночной базе этот же запрос прочитает ТОЛЬКО один файл — колонку price. И проигнорирует остальные 49 колонок. Поэтому скорость отличается в десятки, а то и сотни раз. Вот и вся, блядь, магия.

Так что выбирай с умом: если пишешь интернет-магазин — бери реляционку. Если строишь аналитическую панель для CEO, который любит цифры — вали в колоночную.