Базы данных

Базы данных #

1. Виды БД и для чего их лучше использовать? #

Вид БДПримерыОсновное применение
РеляционныеMySQL, PostgreSQLФинансы, CRM, интернет-магазины
Документоориенти-рованныеMongoDB, CouchDBГибкие структуры данных, профили пользователей
Ключ-значениеRedis, DynamoDBКэширование, сессии
ПоисковыеElasticsearchПолнотекстовый поиск, поиск по логам
Колоночные (wide-column)Cassandra, HBaseАналитика, большие данные
ГрафовыеNeo4j, OrientDBАнализ связей, социальные сети
Временных рядовInfluxDB, TimescaleDBМетрики, IoT
Объектно-ориентированныеObjectDBCAD, моделирование
NewSQLCockroachDBМасштабируемость, транзакции

Есть ещё Clickhouse. Она реляционная, но колоночно-ориентированная. Служит для аналитики (OLAP).

OLAP (Online Analytical Processing) - аналитическая обработка в реальном времени - это тип обработки данных, позволяющий в режиме реального времени получить определённый срез данных для их последующего анализа

OLTP (Online Transaction Processing) - обработка транзакций в реальном времени - это тип обработки данных, который заключается в одновременном выполнении нескольких транзакций, таких как интернет-банкинг, покупки, ввод заказов или отправка текстовых сообщений


2. Масштабирование. Как решить нехватку места на сервере? #

Тип масштабированияОписаниеРешение проблемы нехватки места
Вертикальное (Scaling Up)Увеличение ресурсов текущего сервера: больше процессоров, памяти, дисковУстановка новых дисков, плашек оперативной памяти, переход на более мощный сервер
Горизонтальное (Scaling Out)Добавление дополнительных серверов, которые работают совместноРазделение базы данных между несколькими серверами с использованием шардинга
Репликация данныхСоздание копий базы данных на других серверах для распределения нагрузкиРазгрузка основного сервера за счет распределения запросов на чтение
Использование облачных решенийХранение данных в облачных системах, таких как AWS, Azure, GCPМасштабируемое хранилище с оплатой за используемый объем
Архивирование данныхПеремещение редко используемых данных в архивСнижение нагрузки и экономия места за счет переноса устаревших данных в отдельное хранилище


3. Репликация базы данных. Что это такое? #

Репликация - это процесс создания и поддержания копий базы данных на нескольких серверах.
Она используется для обеспечения отказоустойчивости, увеличения производительности и масштабируемости.

Типы репликации

  1. Синхронная репликация:
    • данные копируются на реплику сразу после внесения изменений
    • высокая консистентность, но может снижать производительность
  2. Асинхронная репликация:
    • данные копируются с задержкой
    • более производительная, но возможна временная несогласованность данных.

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

  • увеличение отказоустойчивости
  • балансировка нагрузки (например, чтение может выполняться с реплики)
  • географическое распределение данных для улучшения задержек

Пример использования репликации

  • Master-Slave - один главный сервер (master) обрабатывает запись, а копии (slave) отвечают за чтение.
  • Master-Master - все узлы могут записывать и читать, требуется механизм разрешения конфликтов (по сути это уже кластер)


4. Что такое шардирование? #

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

Как работает шардирование?

  1. Данные разбиваются по определённому ключу (например, идентификатор пользователя, географический регион)
  2. Каждая часть (шард) хранится на отдельном сервере или экземпляре базы данных
  3. При запросе система определяет, на каком шарде находятся нужные данные, и обращается к нему

Зачем нужно шардирование?

  • Масштабируемость - увеличение объёма данных обрабатывается добавлением новых серверов
  • Производительность - запросы выполняются быстрее, так как каждый сервер обрабатывает только часть данных
  • Изоляция - ошибка на одном шарде не влияет на другие

Плюсы шардирования

  • Возможность обработки больших объёмов данных
  • Уменьшение нагрузки на каждый отдельный сервер
  • Горизонтальное масштабирование дешевле чем вертикальное

Минусы шардирования

  • Сложность реализации - требуется правильное распределение данных между шардами
  • Сложность обеспечения ACID на нескольких узлах
  • Обслуживание - управление несколькими серверами сложнее
  • Перераспределение данных - если количество серверов изменяется, данные нужно перераспределить


5. NoSQL vs SQL #

  • SQL (реляционные базы данных) - структурированные таблицы с чёткой схемой данных.
  • NoSQL (нереляционные базы данных) - гибкая структура для неструктурированных или полуструктурированных данных.
КритерийSQL (реляционные)NoSQL (нереляционные)
Структура данныхТаблицы (строки и столбцы)Документы, ключ-значение, графы, колонки
СхемаЖёсткая, требуется заранее определитьГибкая, можно изменять структуру данных
Язык запросовSQL (стандартный язык запросов)API или специальные запросы (например, MongoDB Query)
Предпочтительный тип масштабированияВертикальный (добавление ресурсов серверу). Горизонтальное сложно в связи с жёсткой структуройГоризонтальный (добавление серверов), хотя и вертикальный не доставляет больших проблем
Целостность данныхВысокая (ACID-транзакции)Может быть слабее, иногда поддерживается BASE
СкоростьОптимизировано для сложных операций и JOINВысокая скорость для простых операций
Когда использоватьСтруктурированные данные, сложные связиГибкие, быстро меняющиеся данные
ПримерыMySQL, PostgreSQL, OracleMongoDB, Redis, Cassandra, Neo4j

ACID - это классический подход к управлению транзакциями в реляционных базах данных, который обеспечивает высокий уровень согласованности и надежности данных. ACID-транзакции являются “жёсткими”, так как они гарантируют, что транзакция либо полностью выполнится, либо откатится к исходному состоянию в случае сбоя, что обеспечивает согласованность данных

BASE - более гибкий подход, который учитывает ограничения и неизбежность ошибок в распределенных системах. BASE поддерживает высокую доступность и отказоустойчивость путем снижения требований к согласованности данных. Это достигается за счет того, что база данных может находиться в промежуточном состоянии - состоянии, когда некоторые копии данных могут быть обновлены, а другие нет. Однако, с течением времени все копии данных сходятся к одному состоянию (eventually consistent), что обеспечивает согласованность.

  • Basic Availability - система отвечает на любой запрос, но этот ответ может быть содержать ошибку или несогласованные данные
  • Soft-state - состояние системы может меняться со временем из-за изменений конечной согласованности
  • Eventual consistency (конечная согласованность) - система, в конечном итоге, станет согласованной. Она будет продолжать принимать данные и не будет проверять каждую транзакцию на согласованность

Таким образом, основная разница между BASE и ACID заключается в том, что ACID обеспечивает жесткую согласованность данных, в то время как BASE обеспечивает гибкую согласованность, позволяющую достичь высокой доступности и отказоустойчивости данных в условиях распределённости и масштабируемости.


6. Партиционирование #

Партиционирование (Partitioning) - это разбиение большой таблицы на мелкие подтаблицы (партиции) для ускорения запросов и оптимизации работы БД

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

  • быстрые запросы - обработка меньшего объема данных
  • легкое управление - удаление старых данных без влияния на всю таблицу
  • балансировка нагрузки - равномерное распределение данных между серверами
  • уменьшение блокировок - параллельный доступ к разным партициям

Виды партиционирования

  • горизонтальное партиционирование (Horizontal Partitioning)
 CREATE TABLE orders (
   id SERIAL PRIMARY KEY,
   created_at DATE NOT NULL
   ) PARTITION BY RANGE (created_at);

CREATE TABLE orders_2023 PARTITION OF orders
   FOR VALUES FROM ('2023-01-01') TO ('2023-12-31');

CREATE TABLE orders_2024 PARTITION OF orders
   FOR VALUES FROM ('2024-01-01') TO ('2024-12-31');
  • вертикальное партиционирование
CREATE TABLE users_main (
   id INT PRIMARY KEY,
   name VARCHAR(100),
   email VARCHAR(100)
);

CREATE TABLE users_details (
   id INT PRIMARY KEY,
   address VARCHAR(255),
   preferences TEXT,
   FOREIGN KEY (id) REFERENCES users_main(id)
);
  • партиционирование по списку
CREATE TABLE orders (
    id SERIAL PRIMARY KEY,
    country TEXT NOT NULL
) PARTITION BY LIST (country);

CREATE TABLE orders_usa PARTITION OF orders
    FOR VALUES IN ('USA');

CREATE TABLE orders_europe PARTITION OF orders
    FOR VALUES IN ('Germany', 'France');
  • хэш-партиционирование
  CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name TEXT
    ) PARTITION BY HASH (id);

CREATE TABLE users_0 PARTITION OF users FOR VALUES WITH (MODULUS 3, REMAINDER 0);
CREATE TABLE users_1 PARTITION OF users FOR VALUES WITH (MODULUS 3, REMAINDER 1);
Вид партиционированияКак делитсяКогда применять?
Горизонтальное (Range)По диапазонам (дата, ID)Даты, ID, архивные данные
Вертикальное (Vertical)По столбцамЧасто/редко используемые данные
По списку (List)По конкретным значениямРазделение по категориям (страны, департаменты)
Хэш-партиционирование (Hash)По хеш-функцииРавномерное распределение

Когда применять партиционирование?

  • огромные таблицы (>10M записей)
  • частый доступ к конкретным диапазонам данных (по дате, стране и т. д.)
  • долгая обработка запросов - партиции помогают ускорить SELECT
  • упрощение удаления старых данных - DROP PARTITION быстрее, чем DELETE

Когда НЕ нужно:

  • eсли таблица небольшая (<1M записей)
  • eсли данные часто обновляются (UPDATE в партициях может быть сложным)
  • eсли БД не поддерживает партиционирование (например, MySQL InnoDB до версии 5.7)