Базы данных

Базы данных #

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

  1. Реляционные БД
  2. Документоориентированные базы данных
  3. Графовые базы данных
  4. Ключ-значение базы данных
  5. Колонноориентированные базы данных
  6. Временные базы данных (Time-Series)
  7. Объектно-ориентированные базы данных
  8. NewSQL

Таблица сравнений

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

5. NoSQL vs SQL #

  • SQL (реляционные базы данных): Структурированные таблицы с чёткой схемой данных.
  • NoSQL (нереляционные базы данных): Гибкая структура для неструктурированных или полуструктурированных данных.

Таблица сравнения

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

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

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

📌 Ключевые преимущества:
Быстрые запросы – обработка меньшего объема данных.
Легкое управление – удаление старых данных без влияния на всю таблицу.
Балансировка нагрузки – равномерное распределение данных между серверами.
Уменьшение блокировок – параллельный доступ к разным партициям.

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

🔹 1. Горизонтальное партиционирование (Horizontal Partitioning)

Данные разделяются по строкам, например, по дате, диапазону ID или географическому региону.

📌 Пример:
Разделение заказов (orders) по году создания (created_at).

orders_2022orders_2023orders_2024
id=1, 2022-05-10id=5, 2023-07-12id=9, 2024-02-01

💡 Плюсы:
✔ Ускоряет выборки, работа идет только с нужной партицией.
✔ Уменьшает нагрузку на БД.

Минусы:
⛔ Сложнее обновлять и поддерживать индексы.

📌 SQL (PostgreSQL):

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');

🔹 2. Вертикальное партиционирование (Vertical Partitioning)

Разделение таблицы по столбцам. Данные хранятся в разных таблицах, но связаны по ID.

📌 Пример:
Разделение таблицы users на часто и редко используемые данные.

users_main (ID, name, email)users_details (ID, address, preferences)
1, “Иван”, “ ivan@mail.com1, “Москва”, “Театр, книги”

💡 Плюсы:
✔ Оптимизирует запросы (основные данные загружаются быстрее).
✔ Экономит память (холодные данные хранятся отдельно).

Минусы:
⛔ Усложняет SQL-запросы (нужно делать JOIN).

📌 SQL (MySQL):

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)
);

🔹 3. Партиционирование по списку (List Partitioning)

Каждая партиция содержит определенные значения из списка.

📌 Пример:
Разделение заказов по стране клиента.

orders_usa (USA)orders_europe (Germany, France)orders_asia (China, India)
id=1, country=‘USA’id=3, country=‘Germany’id=7, country=‘China’

📌 SQL (PostgreSQL):

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');

💡 Плюсы:
✔ Оптимизирует работу с данными по категориям.

Минусы:
⛔ Новые категории требуют пересоздания схемы.

🔹 4. Хеш-партиционирование (Hash Partitioning)

Данные распределяются по партициям по хеш-функции (например, id % N).

📌 Пример:
Разделение таблицы пользователей по user_id.

users_0 (id % 3 = 0)users_1 (id % 3 = 1)users_2 (id % 3 = 2)
id=3, Иванid=1, Алексейid=2, Ольга

📌 SQL (PostgreSQL):

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);

💡 Плюсы:
✔ Равномерное распределение нагрузки.

Минусы:
⛔ Невозможно предсказать, где окажется конкретная строка.

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

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

Когда НЕ нужно:
⛔ Если таблица небольшая (<1M записей).
⛔ Если данные часто обновляются (UPDATE в партициях может быть сложным).
⛔ Если БД не поддерживает партиционирование (например, MySQL InnoDB до версии 5.7).

📌 Итог

Вид партиционированияКак делитсяКогда применять?
Горизонтальное (Range)По диапазонам (дата, ID)Даты, ID, архивные данные
Вертикальное (Vertical)По столбцамЧасто/редко используемые данные
По списку (List)По конкретным значениямРазделение по категориям (страны, департаменты)
Хеш-партиционирование (Hash)По хеш-функцииРавномерное распределение

📢 Вывод:

  • Горизонтальное партиционирование – если у вас данные по диапазонам (например, даты).
  • Вертикальное – если у вас есть “холодные” и “горячие” данные.
  • Список – если четкое разделение по категориям (например, страны).
  • Хеш – если нужно равномерное распределение записей.