11 вопросов
Atomicity - транзакция выполняется целиком или не выполняется. Consistency - после транзакции БД в допустимом состоянии (ограничения соблюдены). Isolation - параллельные транзакции не влияют друг на друга (уровни изоляции). Durability - зафиксированные данные сохраняются при сбое (WAL, redo log).
Нормализация уменьшает избыточность и аномалии. 1NF - атомарные значения, нет повторяющихся групп. 2NF - 1NF + все неключевые атрибуты зависят от всего первичного ключа (нет частичных зависимостей). 3NF - 2NF + нет транзитивных зависимостей (неключевой атрибут не зависит от другого неключевого). Дальше: BCNF, 4NF, 5NF. Денормализация часто применяют осознанно для ускорения чтения.
Денормализация - намеренное дублирование или объединение данных для ускорения чтения. Применяют при тяжелых JOIN или агрегатах, для отчетов, кеша в таблице. Минусы: избыточность, риск рассинхрона, сложнее обновления. Компенсации: триггеры, материализованные представления, отдельные read-модели (CQRS).
Multiversion Concurrency Control - управление конкурентностью через версии данных. Читатель видит снимок на момент начала запроса; писатель создает новую версию строки. Блокировки при чтении не нужны. В PostgreSQL строки помечаются xmin/xmax; старые версии удаляются VACUUM. Обеспечивает изоляцию без блокировок чтения, но требует места для версий и обработки конфликтов при записи.
В распределенной системе при разделении (partition) нельзя одновременно гарантировать все три: Consistency (все узлы видят одни данные), Availability (каждый запрос получает ответ), Partition tolerance (система работает при разрыве связи). При выборе CP - жертвуют доступностью при партиции; при AP - консистентностью (eventual consistency). Классические БД чаще CP; распределенные кеши/очереди - часто AP.
Акроним для подхода к распределенным системам в противовес ACID: Basically Available - базовая доступность (ответ может быть не полный). Soft state - состояние может меняться без явного ввода. Eventually consistent - консистентность в итоге достигается. Характерно для NoSQL и распределенных кешей; упор на доступность и масштабируемость при ослабленной консистентности.
Пул заранее созданных соединений с БД. Запрос берет соединение из пула, использует, возвращает. Избегается многократное создание/закрытие соединений (дорого по времени и ресурсам). Реализации: PgBouncer, ProxySQL, в приложении - пулы в драйверах (например, persistent connections в PHP). Размер пула ограничивают, чтобы не исчерпать лимиты БД и не создавать лишнюю нагрузку.
Реляционные (SQL) - таблицы, связи, ACID (PostgreSQL, MySQL). Документные - JSON/BSON документы (MongoDB). Ключ-значение - Redis, Memcached. Колоночные - колонки хранятся отдельно (ClickHouse, Cassandra). Поисковые - индексы для полнотекстового поиска (Elasticsearch). Графовые - узлы и ребра (Neo4j). Гранулярный выбор под задачу: транзакции, аналитика, кеш, поиск.
Построчное (row-store) - строка хранится целиком. Подходит для OLTP: выборка по ключу, обновление строки. Колоночное (columnar) - значения одного столбца хранятся вместе. Подходит для аналитики: агрегаты по столбцу, сжатие, меньше I/O при сканировании одного столбца. Примеры: PostgreSQL - row; ClickHouse, Cassandra - columnar или гибрид.
Автоинкрементный ID - компактный, быстрый индекс, предсказуемый порядок. Минус: при распределенной вставке или слиянии БД возможны коллизии; раскрывает объем данных. UUID - глобально уникален, можно генерировать на клиенте и в разных узлах; не раскрывает последовательность. Минус: больше места, хуже локальность индекса (B-tree при случайном UUID). UUID v7 (время + random) улучшает вставку в индекс.
Хранить в целых единицах минимальной валюты (центы, копейки) в INTEGER или DECIMAL. Не использовать FLOAT/DOUBLE - ошибки округления. DECIMAL(p,s) с фиксированной точностью (например, DECIMAL(19,4)) для точной арифметики. Валюта - отдельное поле или таблица курсов. Аудит и идемпотентность платежей обязательны; двойная запись (дебет/кредит) для учета.