Базы данных #
1. Виды БД и для чего их лучше использовать? #
| Вид БД | Примеры | Основное применение |
|---|---|---|
| Реляционные | MySQL, PostgreSQL | Финансы, CRM, интернет-магазины |
| Документоориенти-рованные | MongoDB, CouchDB | Гибкие структуры данных, профили пользователей |
| Ключ-значение | Redis, DynamoDB | Кэширование, сессии |
| Поисковые | Elasticsearch | Полнотекстовый поиск, поиск по логам |
| Колоночные (wide-column) | Cassandra, HBase | Аналитика, большие данные |
| Графовые | Neo4j, OrientDB | Анализ связей, социальные сети |
| Временных рядов | InfluxDB, TimescaleDB | Метрики, IoT |
| Объектно-ориентированные | ObjectDB | CAD, моделирование |
| NewSQL | CockroachDB | Масштабируемость, транзакции |
Есть ещё Clickhouse. Она реляционная, но колоночно-ориентированная. Служит для аналитики (OLAP).
OLAP (Online Analytical Processing) - аналитическая обработка в реальном времени - это тип обработки данных, позволяющий в режиме реального времени получить определённый срез данных для их последующего анализа
OLTP (Online Transaction Processing) - обработка транзакций в реальном времени - это тип обработки данных, который заключается в одновременном выполнении нескольких транзакций, таких как интернет-банкинг, покупки, ввод заказов или отправка текстовых сообщений
2. Масштабирование. Как решить нехватку места на сервере? #
| Тип масштабирования | Описание | Решение проблемы нехватки места |
|---|---|---|
| Вертикальное (Scaling Up) | Увеличение ресурсов текущего сервера: больше процессоров, памяти, дисков | Установка новых дисков, плашек оперативной памяти, переход на более мощный сервер |
| Горизонтальное (Scaling Out) | Добавление дополнительных серверов, которые работают совместно | Разделение базы данных между несколькими серверами с использованием шардинга |
| Репликация данных | Создание копий базы данных на других серверах для распределения нагрузки | Разгрузка основного сервера за счет распределения запросов на чтение |
| Использование облачных решений | Хранение данных в облачных системах, таких как AWS, Azure, GCP | Масштабируемое хранилище с оплатой за используемый объем |
| Архивирование данных | Перемещение редко используемых данных в архив | Снижение нагрузки и экономия места за счет переноса устаревших данных в отдельное хранилище |
3. Репликация базы данных. Что это такое? #
Репликация - это процесс создания и поддержания копий базы данных на нескольких серверах.
Она используется для обеспечения отказоустойчивости, увеличения производительности и масштабируемости.
Типы репликации
- Синхронная репликация:
- данные копируются на реплику сразу после внесения изменений
- высокая консистентность, но может снижать производительность
- Асинхронная репликация:
- данные копируются с задержкой
- более производительная, но возможна временная несогласованность данных.
Преимущества:
- увеличение отказоустойчивости
- балансировка нагрузки (например, чтение может выполняться с реплики)
- географическое распределение данных для улучшения задержек
Пример использования репликации
- Master-Slave - один главный сервер (
master) обрабатывает запись, а копии (slave) отвечают за чтение. - Master-Master - все узлы могут записывать и читать, требуется механизм разрешения конфликтов (по сути это уже кластер)
4. Что такое шардирование? #
Шардирование - это метод горизонтального масштабирования, заключающийся в разбиении данных исходной базы на части (шарды) и распределении этих частей по разным экземплярам субд на одном или нескольких серверах. Каждый шард содержит только часть общего набора данных и работает как отдельная бд
Как работает шардирование?
- Данные разбиваются по определённому ключу (например, идентификатор пользователя, географический регион)
- Каждая часть (шард) хранится на отдельном сервере или экземпляре базы данных
- При запросе система определяет, на каком шарде находятся нужные данные, и обращается к нему
Зачем нужно шардирование?
- Масштабируемость - увеличение объёма данных обрабатывается добавлением новых серверов
- Производительность - запросы выполняются быстрее, так как каждый сервер обрабатывает только часть данных
- Изоляция - ошибка на одном шарде не влияет на другие
Плюсы шардирования
- Возможность обработки больших объёмов данных
- Уменьшение нагрузки на каждый отдельный сервер
- Горизонтальное масштабирование дешевле чем вертикальное
Минусы шардирования
- Сложность реализации - требуется правильное распределение данных между шардами
- Сложность обеспечения ACID на нескольких узлах
- Обслуживание - управление несколькими серверами сложнее
- Перераспределение данных - если количество серверов изменяется, данные нужно перераспределить
5. NoSQL vs SQL #
- SQL (реляционные базы данных) - структурированные таблицы с чёткой схемой данных.
- NoSQL (нереляционные базы данных) - гибкая структура для неструктурированных или полуструктурированных данных.
| Критерий | SQL (реляционные) | NoSQL (нереляционные) |
|---|---|---|
| Структура данных | Таблицы (строки и столбцы) | Документы, ключ-значение, графы, колонки |
| Схема | Жёсткая, требуется заранее определить | Гибкая, можно изменять структуру данных |
| Язык запросов | SQL (стандартный язык запросов) | API или специальные запросы (например, MongoDB Query) |
| Предпочтительный тип масштабирования | Вертикальный (добавление ресурсов серверу). Горизонтальное сложно в связи с жёсткой структурой | Горизонтальный (добавление серверов), хотя и вертикальный не доставляет больших проблем |
| Целостность данных | Высокая (ACID-транзакции) | Может быть слабее, иногда поддерживается BASE |
| Скорость | Оптимизировано для сложных операций и JOIN | Высокая скорость для простых операций |
| Когда использовать | Структурированные данные, сложные связи | Гибкие, быстро меняющиеся данные |
| Примеры | MySQL, PostgreSQL, Oracle | MongoDB, 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)