200 вопросов по СУБД
200 вопросов по СУБД
Основные понятия и терминология СУБД
Вопрос
Что такое СУБД?
Ответ
СУБД — система управления базами данных — это программное обеспечение, предназначенное для создания, хранения, обработки, администрирования и обеспечения доступа к базам данных. СУБД предоставляет интерфейс для взаимодействия пользователей и приложений с данными, гарантируя целостность, безопасность и эффективность операций.
Вопрос
Что такое база данных?
Ответ
База данных — это организованная совокупность структурированных данных, хранящихся в электронном виде. Данные организованы по определённой модели (реляционной, документной, графовой и др.) и управляются через СУБД.
Вопрос
Какие основные типы СУБД существуют?
Ответ
Основные типы СУБД:
- Реляционные (например, PostgreSQL, MySQL, Oracle, MS SQL Server)
- Документные (например, MongoDB, CouchDB)
- Ключ-значение (например, Redis, DynamoDB)
- Графовые (например, Neo4j)
- Колоночные (например, Apache Cassandra, ClickHouse)
- Поисковые (например, Elasticsearch)
Вопрос
Что такое таблица в реляционной СУБД?
Ответ
Таблица — это основная структура хранения данных в реляционной СУБД. Она состоит из строк (записей) и столбцов (атрибутов). Каждая строка представляет один экземпляр сущности, каждый столбец — одно свойство этой сущности.
Вопрос
Что такое первичный ключ?
Ответ
Первичный ключ — это один или несколько столбцов таблицы, однозначно идентифицирующих каждую строку. Значения первичного ключа не могут быть NULL и должны быть уникальными в пределах таблицы.
Вопрос
Что такое внешний ключ?
Ответ
Внешний ключ — это столбец или набор столбцов в одной таблице, ссылающийся на первичный ключ другой таблицы. Он обеспечивает ссылочную целостность между связанными таблицами.
Вопрос
Что такое индекс в СУБД?
Ответ
Индекс — это структура данных, которая ускоряет поиск и сортировку записей в таблице. Индекс создаётся по одному или нескольким столбцам и позволяет СУБД находить строки без полного сканирования таблицы.
Вопрос
Какие бывают типы индексов?
Ответ
Основные типы индексов:
- B-дерево (наиболее распространённый, используется для диапазонных запросов)
- Хеш-индекс (эффективен для точного совпадения, но не поддерживает диапазоны)
- Уникальный индекс (гарантирует уникальность значений)
- Составной индекс (создаётся по нескольким столбцам)
- Частичный индекс (создаётся только по подмножеству строк, удовлетворяющих условию)
Вопрос
Что такое нормализация базы данных?
Ответ
Нормализация — это процесс приведения структуры базы данных к форме, минимизирующей избыточность и зависимость данных. Она осуществляется через последовательное применение нормальных форм (1NF, 2NF, 3NF, BCNF и др.).
Вопрос
Что такое денормализация?
Ответ
Денормализация — это намеренное введение избыточности в структуру базы данных с целью повышения производительности чтения. Используется в системах аналитики и хранилищах данных, где частые JOIN-операции нежелательны.
Вопрос
Что такое транзакция?
Ответ
Транзакция — это последовательность операций над базой данных, выполняемая как единое логическое целое. Транзакция либо завершается полностью (COMMIT), либо откатывается целиком (ROLLBACK), не оставляя промежуточного состояния.
Вопрос
Какие свойства транзакции описывает ACID?
Ответ
ACID описывает четыре свойства транзакции:
- Atomicity (Атомарность): все операции транзакции выполняются или ни одна.
- Consistency (Согласованность): транзакция переводит базу из одного согласованного состояния в другое.
- Isolation (Изолированность): параллельные транзакции не мешают друг другу.
- Durability (Долговечность): результаты зафиксированной транзакции сохраняются даже при сбое системы.
Вопрос
Что такое уровень изоляции транзакций?
Ответ
Уровень изоляции определяет степень видимости изменений, внесённых одной транзакцией, для других параллельно выполняющихся транзакций. Распространённые уровни:
- Read Uncommitted
- Read Committed
- Repeatable Read
- Serializable
Вопрос
Что такое блокировка (lock) в СУБД?
Ответ
Блокировка — это механизм, используемый СУБД для обеспечения изолированности транзакций. Блокировка предотвращает одновременный доступ нескольких транзакций к одним и тем же данным в конфликтующих режимах (например, запись и чтение).
Вопрос
Что такое мёртвая блокировка (deadlock)?
Ответ
Мёртвая блокировка — это ситуация, при которой две или более транзакций ожидают освобождения ресурсов, удерживаемых друг другом, и ни одна не может продолжить выполнение. Современные СУБД автоматически обнаруживают deadlocks и откатывают одну из транзакций для разрешения ситуации.
Вопрос
Что такое журнал транзакций (transaction log)?
Ответ
Журнал транзакций — это файл, в который СУБД последовательно записывает все изменения, вносимые в базу данных. Он используется для восстановления после сбоев, обеспечения долговечности и поддержки репликации.
Вопрос
Что такое представление (VIEW)?
Ответ
Представление — это виртуальная таблица, определённая SQL-запросом. Представление не хранит данные физически (за исключением материализованных VIEW), а при обращении к нему выполняет underlying-запрос.
Пример:
CREATE VIEW active_users AS
SELECT id, name, email
FROM users
WHERE is_active = true;
Вопрос
Что такое материализованное представление?
Ответ
Материализованное представление — это представление, результат которого физически сохраняется на диске. Оно обновляется периодически или по событию и используется для ускорения сложных аналитических запросов.
Вопрос
Что такое хранимая процедура?
Ответ
Хранимая процедура — это именованный блок кода, написанный на языке СУБД (например, PL/pgSQL, T-SQL), который хранится в базе данных и может быть вызван из приложения или другой процедуры. Процедуры поддерживают параметры, логику и транзакции.
Вопрос
Что такое триггер?
Ответ
Триггер — это специальный вид хранимой процедуры, автоматически выполняемой при наступлении определённого события (INSERT, UPDATE, DELETE) в указанной таблице. Триггеры используются для обеспечения бизнес-правил, аудита или поддержания целостности.
Пример:
CREATE TRIGGER update_modified_time
BEFORE UPDATE ON orders
FOR EACH ROW
EXECUTE FUNCTION set_current_timestamp();
Реляционная модель и проектирование баз данных
Вопрос
Что такое реляционная модель данных?
Ответ
Реляционная модель данных — это математическая модель организации данных в виде таблиц (отношений), где каждая таблица состоит из строк и столбцов. Модель основана на теории множеств и логике предикатов первого порядка. Она определяет правила целостности, связи между таблицами и операции над данными (реляционная алгебра).
Вопрос
Что такое отношение в реляционной модели?
Ответ
Отношение — это формальное название таблицы в реляционной модели. Оно представляет собой множество кортежей (строк), каждый из которых соответствует одному экземпляру сущности. Все кортежи имеют одинаковую структуру, заданную заголовком (набором атрибутов/столбцов).
Вопрос
Что такое домен в реляционной модели?
Ответ
Домен — это множество допустимых значений для одного или нескольких атрибутов (столбцов). Например, домен «возраст» может быть определён как целые числа от 0 до 150. Домены обеспечивают семантическую целостность данных.
Вопрос
Что такое кардинальность таблицы?
Ответ
Кардинальность таблицы — это количество строк (кортежей) в ней. Кардинальность может меняться со временем по мере добавления или удаления записей.
Вопрос
Что такое степень (арность) таблицы?
Ответ
Степень (или арность) таблицы — это количество столбцов (атрибутов) в её заголовке. Степень фиксирована для данной таблицы и не меняется без изменения схемы.
Вопрос
Что такое функциональная зависимость?
Ответ
Функциональная зависимость — это связь между двумя наборами атрибутов, при которой значение одного набора (детерминанта) однозначно определяет значение другого набора. Обозначается как X → Y: если два кортежа совпадают по X, они обязаны совпадать по Y.
Вопрос
Что такое первая нормальная форма (1NF)?
Ответ
Первая нормальная форма требует, чтобы все атрибуты таблицы содержали только атомарные (неделимые) значения, и чтобы каждая строка была уникальной. Таблица не должна содержать повторяющихся групп или массивов в ячейках.
Вопрос
Что такое вторая нормальная форма (2NF)?
Ответ
Вторая нормальная форма требует, чтобы таблица находилась в 1NF и все неключевые атрибуты зависели функционально от всего первичного ключа, а не от его части. Это актуально для составных первичных ключей.
Вопрос
Что такое третья нормальная форма (3NF)?
Ответ
Третья нормальная форма требует, чтобы таблица находилась во 2NF и не содержала транзитивных зависимостей: никакой неключевой атрибут не должен зависеть от другого неключевого атрибута.
Вопрос
Что такое форма Бойса–Кодда (BCNF)?
Ответ
Форма Бойса–Кодда — усиленная версия 3NF. Таблица находится в BCNF, если для каждой нетривиальной функциональной зависимости X → Y, X является суперключом. BCNF устраняет определённые аномалии, которые могут сохраняться в 3NF.
Вопрос
Какие проблемы решает нормализация?
Ответ
Нормализация устраняет три типа аномалий:
- Аномалия вставки: невозможность добавить данные без наличия связанных данных.
- Аномалия обновления: необходимость изменять данные в нескольких местах для поддержания согласованности.
- Аномалия удаления: потеря данных при удалении других записей.
Вопрос
Когда применяется денормализация?
Ответ
Денормализация применяется в системах аналитики (OLAP), хранилищах данных и при высоких требованиях к скорости чтения. Она снижает количество JOIN-операций за счёт введения контролируемой избыточности.
Вопрос
Что такое суррогатный ключ?
Ответ
Суррогатный ключ — это искусственный первичный ключ, не имеющий бизнес-смысла (например, автоинкрементное целое число или UUID). Он используется, когда естественный ключ отсутствует, нестабилен или сложен.
Вопрос
Что такое естественный ключ?
Ответ
Естественный ключ — это атрибут или комбинация атрибутов, которые однозначно идентифицируют запись на основе бизнес-логики (например, ИНН для юридического лица или email для пользователя).
Вопрос
Как выбрать между суррогатным и естественным ключом?
Ответ
Выбор зависит от контекста:
- Суррогатный ключ предпочтителен при отсутствии стабильного естественного ключа, при частых изменениях естественного ключа или при сложных составных ключах.
- Естественный ключ уместен, если он гарантированно уникален, неизменяем и прост (например, код страны ISO).
Вопрос
Что такое звезда и снежинка в проектировании хранилищ данных?
Ответ
- Звезда: схема, где одна центральная фактовая таблица связана напрямую с несколькими измерениями (dimension tables).
- Снежинка: нормализованная версия звезды, где измерения дополнительно разбиты на подтаблицы для устранения избыточности.
Пример звезды:
fact_sales (
sale_id,
product_id,
customer_id,
date_id,
amount
)
dim_product (product_id, name, category)
dim_customer (customer_id, name, city)
dim_date (date_id, day, month, year)
Вопрос
Что такое шардинг и как он влияет на проектирование БД?
Ответ
Шардинг — это горизонтальное разделение таблицы на части (шарды), размещаемые на разных серверах. При проектировании необходимо выбирать ключ шардирования так, чтобы обеспечить равномерное распределение данных и минимизировать межшардовые запросы.
Вопрос
Как проектировать базу данных для многопользовательского SaaS-приложения?
Ответ
Существует три основных подхода:
- Shared nothing — отдельная БД на клиента (высокая изоляция, высокая стоимость).
- Shared schema — одна БД, одна схема, клиент идентифицируется через
tenant_id(простота, риск утечки данных). - Shared database, isolated schema — одна БД, отдельная схема на клиента (баланс между изоляцией и управляемостью).
Вопрос
Что такое slowly changing dimension (SCD) и какие типы существуют?
Ответ
Slowly Changing Dimension — подход к обработке изменений в измерениях хранилища данных.
- Тип 1: перезапись старого значения (история теряется).
- Тип 2: добавление новой строки с новым
surrogate_key, сохранение истории. - Тип 3: добавление дополнительных столбцов для хранения предыдущего значения.
Вопрос
Как обеспечить эволюцию схемы базы данных без простоя?
Ответ
Используется подход backward-compatible migration:
- Добавляются новые столбцы как NULLABLE или со значением по умолчанию.
- Приложение обновляется для работы с новыми и старыми столбцами.
- Старые столбцы удаляются только после полного перехода приложения.
Также применяются стратегии типа expand-and-contract и blue-green deployment.
SQL: синтаксис, команды и практика
Вопрос
Что такое SQL?
Ответ
SQL (Structured Query Language) — это декларативный язык программирования, предназначенный для управления реляционными базами данных. Он позволяет создавать, изменять, запрашивать и удалять данные, а также управлять структурой и доступом к базе.
Вопрос
Какие основные категории команд SQL существуют?
Ответ
Основные категории команд SQL:
- DDL (Data Definition Language):
CREATE,ALTER,DROP,TRUNCATE— управление структурой БД. - DML (Data Manipulation Language):
SELECT,INSERT,UPDATE,DELETE— манипуляции с данными. - DCL (Data Control Language):
GRANT,REVOKE— управление правами доступа. - TCL (Transaction Control Language):
COMMIT,ROLLBACK,SAVEPOINT— управление транзакциями.
Вопрос
Что делает команда SELECT?
Ответ
Команда SELECT извлекает данные из одной или нескольких таблиц. Она может включать фильтрацию (WHERE), сортировку (ORDER BY), группировку (GROUP BY) и объединение таблиц (JOIN).
Пример:
SELECT name, email FROM users WHERE age > 18 ORDER BY name;
Вопрос
Чем отличаются DELETE, TRUNCATE и DROP?
Ответ
DELETEудаляет строки из таблицы, поддерживает условия (WHERE) и может быть отменён черезROLLBACK.TRUNCATEудаляет все строки из таблицы быстро, без логирования отдельных строк; не поддерживаетWHEREи не может быть частично отменён в большинстве СУБД.DROPудаляет всю таблицу (включая структуру, индексы, ограничения).
Вопрос
Что такое псевдоним (alias) в SQL?
Ответ
Псевдоним — это временное имя, присваиваемое таблице или столбцу в запросе для упрощения чтения или разрешения конфликтов имён. Указывается с помощью ключевого слова AS (необязательно).
Пример:
SELECT u.name AS full_name
FROM users AS u;
Вопрос
Какие типы JOIN существуют?
Ответ
Основные типы JOIN:
INNER JOIN: возвращает только совпадающие строки в обеих таблицах.LEFT JOIN(илиLEFT OUTER JOIN): возвращает все строки из левой таблицы и совпадающие из правой.RIGHT JOIN: аналогично, но с приоритетом правой таблицы.FULL OUTER JOIN: объединяет все строки из обеих таблиц.CROSS JOIN: декартово произведение (все возможные пары строк).
Вопрос
Что такое подзапрос (subquery)?
Ответ
Подзапрос — это SQL-запрос, вложенный внутрь другого запроса. Он может использоваться в SELECT, FROM, WHERE или HAVING. Подзапросы бывают коррелированные (зависят от внешнего запроса) и некоррелированные.
Пример:
SELECT name
FROM users
WHERE id IN (SELECT user_id FROM orders WHERE total > 1000);
Вопрос
Что делает оператор UNION?
Ответ
Оператор UNION объединяет результаты двух или более SELECT-запросов в один набор строк. По умолчанию удаляет дубликаты. Для сохранения дубликатов используется UNION ALL.
Требования:
- Одинаковое количество столбцов.
- Совместимые типы данных в соответствующих позициях.
Вопрос
Что такое агрегатные функции? Назовите основные.
Ответ
Агрегатные функции выполняют вычисления над множеством значений и возвращают одно значение. Основные:
COUNT()— количество строк.SUM()— сумма значений.AVG()— среднее значение.MIN()/MAX()— минимальное/максимальное значение.
Вопрос
Чем отличается WHERE от HAVING?
Ответ
WHEREфильтрует строки до группировки.HAVINGфильтрует группы после агрегации (обычно используется сGROUP BY).
Пример:
SELECT department, AVG(salary)
FROM employees
WHERE hire_date > '2020-01-01'
GROUP BY department
HAVING AVG(salary) > 50000;
Вопрос
Что такое общее табличное выражение (CTE)?
Ответ
CTE (Common Table Expression) — это временный именованный результат запроса, определяемый в блоке WITH. Он улучшает читаемость и может быть рекурсивным.
Пример:
WITH high_earners AS (
SELECT id, name, salary
FROM employees
WHERE salary > 100000
)
SELECT name FROM high_earners;
Вопрос
Что такое рекурсивный CTE и где он применяется?
Ответ
Рекурсивный CTE ссылается на самого себя и используется для обработки иерархических или древовидных структур (например, оргструктура, категории товаров).
Пример:
WITH RECURSIVE subordinates AS (
SELECT id, name, manager_id
FROM employees
WHERE id = 1
UNION ALL
SELECT e.id, e.name, e.manager_id
FROM employees e
INNER JOIN subordinates s ON e.manager_id = s.id
)
SELECT * FROM subordinates;
Вопрос
Что такое оконные функции?
Ответ
Оконные функции выполняют вычисления по набору строк, связанных с текущей строкой, без свёртки в одну строку (в отличие от агрегатных). Используются с OVER().
Пример:
SELECT name, salary,
RANK() OVER (ORDER BY salary DESC) as salary_rank
FROM employees;
Вопрос
Какие основные оконные функции вы знаете?
Ответ
Основные оконные функции:
- Ранжирование:
ROW_NUMBER(),RANK(),DENSE_RANK(). - Агрегация:
SUM() OVER(),AVG() OVER()и др. - Смещение:
LAG(),LEAD(),FIRST_VALUE(),LAST_VALUE().
Вопрос
Что такое CASE в SQL?
Ответ
CASE — это условное выражение, аналог if-else в других языках. Позволяет возвращать разные значения в зависимости от условий.
Пример:
SELECT name,
CASE
WHEN salary > 100000 THEN 'High'
WHEN salary > 50000 THEN 'Medium'
ELSE 'Low'
END AS salary_level
FROM employees;
Вопрос
Как проверить наличие NULL-значений в столбце?
Ответ
Для проверки NULL используются специальные операторы IS NULL и IS NOT NULL, так как NULL не равен ничему, даже самому себе.
Пример:
SELECT * FROM users WHERE email IS NULL;
Вопрос
Что такое COALESCE?
Ответ
COALESCE возвращает первое ненулевое значение из списка аргументов. Используется для замены NULL на значение по умолчанию.
Пример:
SELECT name, COALESCE(phone, 'not provided') AS phone
FROM contacts;
Вопрос
Что такое динамический SQL?
Ответ
Динамический SQL — это SQL-код, формируемый во время выполнения (например, через конкатенацию строк в хранимой процедуре). Используется, когда структура запроса заранее неизвестна. Требует осторожности из-за риска SQL-инъекций.
Вопрос
Как избежать SQL-инъекций?
Ответ
Основной способ — использование параметризованных запросов (prepared statements), где значения передаются отдельно от текста SQL. Также применяются валидация входных данных, экранирование и принцип минимальных привилегий.
Пример на псевдокоде:
cursor.execute("SELECT * FROM users WHERE id = ?", (user_id,))
Вопрос
Что такое материализованное представление и как оно отличается от обычного?
Ответ
Материализованное представление хранит результат запроса физически на диске и обновляется периодически или по событию. Обычное представление (VIEW) выполняет underlying-запрос каждый раз при обращении. Материализованные VIEW ускоряют сложные аналитические запросы за счёт использования предварительно вычисленных данных.
Индексы, оптимизация запросов и план выполнения
Вопрос
Что такое индекс и зачем он нужен?
Ответ
Индекс — это вспомогательная структура данных, которая ускоряет поиск, сортировку и соединение строк в таблице. Без индекса СУБД выполняет полное сканирование таблицы (full scan), что неэффективно при большом объёме данных.
Вопрос
Какие основные типы индексов используются в реляционных СУБД?
Ответ
Основные типы индексов:
- B-дерево — стандартный индекс для диапазонных и точечных запросов.
- Хеш-индекс — эффективен только для точного совпадения (
=), не поддерживает диапазоны или сортировку. - GIN (Generalized Inverted Index) — для массивов, JSON, полнотекстового поиска.
- GiST (Generalized Search Tree) — для геометрических, географических и других специализированных типов данных.
- BRIN (Block Range Index) — для очень больших таблиц с упорядоченными данными (например, временные ряды).
Вопрос
Что такое кластеризованный индекс?
Ответ
Кластеризованный индекс определяет физический порядок хранения строк в таблице на диске. В большинстве СУБД (например, MS SQL Server, MySQL с InnoDB) таблица может иметь только один кластеризованный индекс, обычно по первичному ключу.
Вопрос
Что такое некластеризованный индекс?
Ответ
Некластеризованный индекс хранит значения индексируемых столбцов и указатель (обычно кластерный ключ или RID) на соответствующую строку в таблице. Таких индексов может быть несколько.
Вопрос
Когда индекс не используется?
Ответ
Индекс может не использоваться в следующих случаях:
- Запрос использует функцию над индексируемым столбцом (
WHERE UPPER(name) = 'JOHN'). - Низкая селективность (например, флаг
is_activeсо значениями 99% true). - Малый размер таблицы (полное сканирование быстрее).
- Отсутствие статистики или устаревшая статистика.
- Использование
ORбез покрытия всех условий индексами.
Вопрос
Что такое покрывающий индекс (covering index)?
Ответ
Покрывающий индекс — это индекс, который содержит все столбцы, необходимые для выполнения запроса. Это позволяет СУБД удовлетворить запрос, обращаясь только к индексу, без доступа к самой таблице (heap или clustered index).
Пример:
CREATE INDEX idx_users_email_name ON users (email) INCLUDE (name);
SELECT name FROM users WHERE email = 'test@example.com';
Вопрос
Что такое селективность индекса?
Ответ
Селективность — это мера уникальности значений в столбце. Высокая селективность (много уникальных значений) делает индекс эффективным. Формула:
селективность = количество уникальных значений / общее количество строк.
Чем ближе к 1, тем лучше.
Вопрос
Как влияет порядок столбцов в составном индексе?
Ответ
Порядок столбцов критичен. Индекс эффективен только если запрос фильтрует по префиксу индекса. Например, индекс (A, B, C) может использоваться для условий:
WHERE A = ?WHERE A = ? AND B = ?WHERE A = ? AND B = ? AND C = ?
Но не дляWHERE B = ?илиWHERE C = ?.
Вопрос
Что такое план выполнения запроса (query execution plan)?
Ответ
План выполнения — это последовательность операций, которые СУБД планирует выполнить для получения результата запроса. Он показывает, какие индексы используются, как соединяются таблицы, где происходят сортировки и агрегации.
Вопрос
Как получить план выполнения в популярных СУБД?
Ответ
- PostgreSQL:
EXPLAIN [ANALYZE] SELECT ... - MySQL:
EXPLAIN FORMAT=JSON SELECT ... - MS SQL Server:
SET SHOWPLAN_TEXT ONили графический план в SSMS - Oracle:
EXPLAIN PLAN FOR SELECT ..., затемSELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
Вопрос
Что означают основные операторы в плане выполнения?
Ответ
Основные операторы:
- Seq Scan / Table Scan — полное сканирование таблицы.
- Index Scan — обход индекса с обратной ссылкой на таблицу.
- Index Only Scan — данные получены только из индекса.
- Nested Loop, Hash Join, Merge Join — алгоритмы соединения.
- Sort, HashAggregate, GroupAggregate — операции сортировки и группировки.
Вопрос
Чем отличаются Hash Join и Merge Join?
Ответ
- Hash Join: строит хеш-таблицу по одной таблице, затем сканирует вторую. Эффективен, когда одна таблица значительно меньше другой.
- Merge Join: требует, чтобы обе таблицы были отсортированы по ключу соединения. Эффективен при уже отсортированных данных или при необходимости сортировки в любом случае.
Вопрос
Что такое кардинальность в контексте плана выполнения?
Ответ
Кардинальность в плане — это оценка количества строк, которые вернёт каждый шаг запроса. Оптимизатор использует эту оценку для выбора наиболее эффективного плана. Неточная кардинальность часто приводит к плохому плану.
Вопрос
Как обновить статистику по таблице?
Ответ
Статистика помогает оптимизатору оценивать кардинальность и стоимость операций. Обновляется командами:
- PostgreSQL:
ANALYZE table_name; - MySQL:
ANALYZE TABLE table_name; - MS SQL Server:
UPDATE STATISTICS table_name; - Oracle:
DBMS_STATS.GATHER_TABLE_STATS(...)
Вопрос
Что такое параметрический запрос и почему он важен для оптимизации?
Ответ
Параметрический запрос использует placeholders вместо литералов (WHERE id = ?). Это позволяет СУБД кэшировать план выполнения и переиспользовать его для разных значений параметров, снижая накладные расходы на парсинг и оптимизацию.
Вопрос
Когда стоит избегать использования SELECT *?
Ответ
SELECT * следует избегать, потому что:
- Передаётся больше данных по сети, чем нужно.
- Может помешать использованию покрывающего индекса.
- Увеличивает время выполнения при большом числе столбцов.
- Делает код менее устойчивым к изменениям схемы.
Вопрос
Как оптимизировать запрос с OFFSET LIMIT для пагинации?
Ответ
Глубокая пагинация (OFFSET 100000) неэффективна, так как СУБД пропускает все предыдущие строки. Решение — использовать курсорную пагинацию на основе последнего значения ключа:
-- Вместо: SELECT * FROM items ORDER BY id LIMIT 20 OFFSET 100000;
-- Используем:
SELECT * FROM items WHERE id > last_seen_id ORDER BY id LIMIT 20;
Вопрос
Что такое материализация подзапроса?
Ответ
Материализация подзапроса — это сохранение результата подзапроса во временную структуру для многократного использования. Некоторые СУБД (например, PostgreSQL) могут автоматически материализовать CTE, что иногда снижает производительность по сравнению с inline-подстановкой.
Вопрос
Как выявить «тяжёлые» запросы в работающей системе?
Ответ
Методы:
- Включить лог медленных запросов (
slow_query_logв MySQL,log_min_duration_statementв PostgreSQL). - Использовать системные представления:
pg_stat_statements(PostgreSQL),sys.dm_exec_query_stats(SQL Server). - Мониторинг через APM-системы (Datadog, New Relic) или профилировщики.
Вопрос
Что такое оптимизатор запросов и какие подходы он использует?
Ответ
Оптимизатор запросов — компонент СУБД, выбирающий наиболее эффективный план выполнения. Он использует:
- Правила (rule-based) — устаревший подход.
- Стоимостную модель (cost-based) — современный подход, оценивающий CPU, I/O, память.
- Статистику по таблицам и индексам.
- Кэширование планов для повторяющихся запросов.
Транзакции, изоляция и конкурентность
Вопрос
Что такое транзакция в СУБД?
Ответ
Транзакция — это логическая единица работы с базой данных, состоящая из одной или нескольких операций (INSERT, UPDATE, DELETE и др.), которые выполняются как единое целое. Транзакция гарантирует, что база данных перейдёт из одного согласованного состояния в другое.
Вопрос
Какие свойства транзакции описывает ACID?
Ответ
ACID описывает четыре фундаментальных свойства:
- Atomicity (Атомарность): все операции транзакции выполняются полностью или ни одна.
- Consistency (Согласованность): транзакция сохраняет инварианты базы данных (ограничения, ссылочная целостность).
- Isolation (Изолированность): параллельные транзакции не влияют друг на друга.
- Durability (Долговечность): изменения, зафиксированные транзакцией, сохраняются даже после сбоя системы.
Вопрос
Что такое уровень изоляции транзакций?
Ответ
Уровень изоляции определяет, какие изменения, сделанные другими параллельными транзакциями, видны текущей транзакции. Он контролирует компромисс между согласованностью и производительностью.
Вопрос
Какие стандартные уровни изоляции определены в SQL?
Ответ
Стандарт ANSI/ISO SQL определяет четыре уровня:
- Read Uncommitted
- Read Committed
- Repeatable Read
- Serializable
Вопрос
Что такое «грязное чтение» (dirty read)?
Ответ
Грязное чтение — это ситуация, когда транзакция читает данные, записанные другой транзакцией, которая ещё не завершилась (не сделала COMMIT). Если та транзакция будет откачена (ROLLBACK), прочитанные данные окажутся недействительными.
Вопрос
Что такое «неповторяющееся чтение» (non-repeatable read)?
Ответ
Неповторяющееся чтение — это ситуация, когда транзакция читает одну и ту же строку дважды, но получает разные значения, потому что другая транзакция изменила и зафиксировала эту строку между чтениями.
Вопрос
Что такое «фантомное чтение» (phantom read)?
Ответ
Фантомное чтение — это ситуация, когда транзакция повторно выполняет запрос с условием (например, WHERE status = 'active') и получает дополнительные строки, вставленные и зафиксированные другой транзакцией между двумя выполнениями.
Вопрос
Какой уровень изоляции предотвращает грязное чтение?
Ответ
Все уровни изоляции, кроме Read Uncommitted, предотвращают грязное чтение. На практике Read Uncommitted редко используется, так как нарушает базовую согласованность.
Вопрос
Какой уровень изоляции предотвращает неповторяющееся чтение?
Ответ
Уровень Repeatable Read гарантирует, что строки, прочитанные в транзакции, не изменятся другими транзакциями до её завершения. Это предотвращает неповторяющееся чтение.
Вопрос
Какой уровень изоляции предотвращает фантомное чтение?
Ответ
Только уровень Serializable полностью предотвращает фантомное чтение в соответствии со стандартом SQL. Однако некоторые СУБД (например, PostgreSQL) реализуют Serializable Snapshot Isolation (SSI), который также блокирует фантомы на уровне Repeatable Read.
Вопрос
Что такое блокировка (lock) и какие её типы существуют?
Ответ
Блокировка — механизм контроля одновременного доступа к данным. Основные типы:
- Shared lock (S) — разрешает чтение, запрещает запись.
- Exclusive lock (X) — запрещает и чтение, и запись другим транзакциям.
- Intent locks — сигнализируют о намерении установить более детальную блокировку на уровне строк или страниц.
Вопрос
Что такое мёртвая блокировка (deadlock)?
Ответ
Мёртвая блокировка — это циклическое ожидание ресурсов между двумя или более транзакциями, при котором ни одна не может продолжить выполнение. Современные СУБД автоматически обнаруживают deadlocks с помощью графа ожиданий и откатывают одну из транзакций (жертву).
Вопрос
Как избежать мёртвых блокировок?
Ответ
Основные стратегии:
- Доступ к ресурсам в одинаковом порядке во всех транзакциях.
- Минимизация длительности транзакций.
- Использование уровня изоляции, снижающего потребность в блокировках (например, MVCC).
- Применение тайм-аутов (
SET lock_timeout).
Вопрос
Что такое MVCC?
Ответ
MVCC (Multi-Version Concurrency Control) — это механизм управления конкурентным доступом, при котором каждая транзакция видит согласованную «версию» данных на момент своего начала. Вместо блокировок СУБД хранит несколько версий строк, что позволяет читателям не блокировать писателей и наоборот.
Вопрос
Какие СУБД используют MVCC?
Ответ
MVCC реализован в таких СУБД, как PostgreSQL, Oracle, MySQL (движок InnoDB), SQL Server (в режиме snapshot isolation). Подход значительно повышает параллелизм и снижает количество блокировок.
Вопрос
Что такое snapshot isolation?
Ответ
Snapshot isolation — уровень изоляции, при котором транзакция работает с «снимком» базы данных на момент своего старта. Все чтения возвращают данные из этого снимка, независимо от изменений, сделанных другими транзакциями после старта.
Вопрос
Чем отличается Serializable от Snapshot Isolation?
Ответ
Snapshot Isolation не гарантирует полную сериализуемость и может допускать аномалии типа write-skew. Serializable Snapshot Isolation (SSI), используемый в PostgreSQL, расширяет snapshot isolation механизмом обнаружения конфликтов и обеспечивает истинную сериализуемость без блокировок.
Вопрос
Что такое write-skew аномалия?
Ответ
Write-skew — это аномалия, возможная при Snapshot Isolation, когда две транзакции читают одни и те же данные, принимают решения на основе этого и независимо изменяют разные строки, нарушая глобальное ограничение. Например, две транзакции увольняют последних двух врачей в больнице, оставляя её без персонала.
Вопрос
Как работает двухфазная блокировка (2PL)?
Ответ
Двухфазная блокировка — протокол, гарантирующий сериализуемость. Он состоит из двух фаз:
- Фаза роста: транзакция может только захватывать блокировки.
- Фаза сжатия: транзакция может только освобождать блокировки.
После освобождения первой блокировки захват новых запрещён.
Вопрос
Что такое optimistic concurrency control?
Ответ
Optimistic concurrency control — подход, при котором транзакции выполняются без блокировок, предполагая отсутствие конфликтов. Перед фиксацией проверяется, не изменились ли читаемые данные. При конфликте транзакция откатывается и может быть повторена.
Архитектура СУБД и управление хранилищем данных
Вопрос
Из каких основных компонентов состоит архитектура СУБД?
Ответ
Основные компоненты архитектуры СУБД:
- Менеджер запросов (Query Processor): парсинг, оптимизация, выполнение.
- Менеджер транзакций (Transaction Manager): управление ACID, координация COMMIT/ROLLBACK.
- Менеджер хранилища (Storage Manager): взаимодействие с диском, управление буферами, файлами.
- Журнал транзакций (Write-Ahead Log).
- Кэш/буферный пул (Buffer Pool).
- Служебные процессы (checkpoint, vacuum, archiver и др.).
Вопрос
Что такое буферный пул (buffer pool)?
Ответ
Буферный пул — это область оперативной памяти, используемая СУБД для кэширования страниц данных с диска. Чтение и запись происходят через буферный пул, что значительно снижает количество операций ввода-вывода.
Вопрос
Как работает механизм Write-Ahead Logging (WAL)?
Ответ
WAL — это принцип, согласно которому все изменения данных сначала записываются в журнал транзакций (log) на диск, и только затем применяются к основным файлам данных. Это гарантирует долговечность и позволяет восстановить состояние после сбоя.
Вопрос
Что такое контрольная точка (checkpoint)?
Ответ
Контрольная точка — это событие, при котором СУБД сбрасывает «грязные» (изменённые) страницы из буферного пула на диск и обновляет метаданные в журнале. Это сокращает время восстановления после перезапуска, так как не нужно проигрывать весь журнал от начала.
Вопрос
Что такое табличное пространство (tablespace)?
Ответ
Табличное пространство — это логическая или физическая единица хранения, объединяющая один или несколько файлов данных. Таблицы и индексы могут размещаться в разных табличных пространствах для управления производительностью, резервным копированием или размещением на разных дисках.
Вопрос
Как устроено физическое хранение таблицы на диске?
Ответ
Таблица хранится в виде набора страниц (обычно 8 КБ). Каждая страница содержит заголовок, массив записей и свободное пространство. Записи могут быть переменной длины. В кластеризованных таблицах (например, InnoDB) данные хранятся в порядке первичного ключа; в некластеризованных — в порядке вставки.
Вопрос
Что такое страница (page) в контексте СУБД?
Ответ
Страница — это минимальная единица передачи данных между диском и памятью. Размер обычно фиксирован (4–16 КБ). Все операции чтения/записи выполняются целыми страницами.
Вопрос
Что такое экстент (extent)?
Ответ
Экстент — это группа последовательных страниц (например, 8 страниц по 8 КБ = 64 КБ), выделяемых вместе для эффективного управления пространством. Используется в таких СУБД, как Oracle, SQL Server, PostgreSQL.
Вопрос
Как СУБД управляет свободным местом в таблицах?
Ответ
СУБД использует:
- Битовые карты свободного места (free space map) — отслеживают незанятые участки в страницах.
- Списки удалённых записей — для повторного использования места после
DELETE. - Автоматическую дефрагментацию (например,
VACUUMв PostgreSQL,OPTIMIZE TABLEв MySQL).
Вопрос
Что делает команда VACUUM в PostgreSQL?
Ответ
VACUUM освобождает место, занятое удалёнными или обновлёнными строками (вследствие MVCC), и обновляет статистику. VACUUM FULL дополнительно дефрагментирует таблицу, перезаписывая её компактно, но требует эксклюзивной блокировки.
Вопрос
Что такое автоматическое управление памятью в СУБД?
Ответ
Современные СУБД динамически распределяют память между компонентами: буферным пулом, кэшем запросов, сортировочными областями и т.д. Настройки могут быть автоматическими (self-tuning) или ручными (через параметры вроде shared_buffers, work_mem).
Вопрос
Как организован журнал транзакций (redo log)?
Ответ
Журнал транзакций — это циклический файл (или набор файлов), в который последовательно записываются изменения в формате «до/после». Он используется для восстановления (recovery) и репликации. Запись в журнал происходит синхронно и является узким местом производительности.
Вопрос
Что такое undo-лог?
Ответ
Undo-лог хранит предыдущие версии строк для поддержки отката транзакций и MVCC. В некоторых СУБД (например, Oracle) он выделен отдельно; в других (PostgreSQL) старые версии хранятся прямо в таблице (heap).
Вопрос
Как работает архивирование журналов (log archiving)?
Ответ
Архивирование — это процесс копирования заполненных файлов журнала на долговременное хранилище. Используется для Point-in-Time Recovery (PITR): восстановления базы на любой момент времени с момента полной резервной копии.
Вопрос
Что такое горячая и холодная резервная копия?
Ответ
- Горячая резервная копия (online backup) — выполняется при работающей СУБД. Требует использования WAL для обеспечения согласованности.
- Холодная резервная копия (offline backup) — выполняется при остановленной СУБД. Проще, но требует простоя.
Вопрос
Какие стратегии резервного копирования существуют?
Ответ
Основные стратегии:
- Полная копия — копируется вся база.
- Инкрементальная — только изменения с момента последней полной или инкрементальной копии.
- Дифференциальная — изменения с момента последней полной копии.
Часто комбинируются: например, еженедельная полная + ежедневная инкрементальная.
Вопрос
Что такое Point-in-Time Recovery (PITR)?
Ответ
PITR — возможность восстановить базу данных на любой момент времени в прошлом, используя полную резервную копию и архивные журналы транзакций. Поддерживается в PostgreSQL (pg_wal), Oracle (Flashback), SQL Server (log backups).
Вопрос
Как СУБД обеспечивает отказоустойчивость?
Ответ
Отказоустойчивость достигается через:
- Репликацию (мастер-реплика, кворум).
- Автоматический failover (Pacemaker, Patroni, Always On).
- Хранение данных на отказоустойчивых томах (RAID, ZFS).
- Регулярное резервное копирование и тестирование восстановления.
Вопрос
Что такое shared-nothing архитектура?
Ответ
Shared-nothing — архитектура, в которой каждый узел кластера имеет собственную память и диск, и не разделяет ресурсы с другими узлами. Данные распределяются между узлами (шардинг). Примеры: Citus, CockroachDB, Amazon Aurora (частично).
Вопрос
Что такое shared-disk архитектура?
Ответ
Shared-disk — архитектура, в которой несколько узлов имеют доступ к одному и тому же хранилищу данных (SAN, NFS). Примеры: Oracle RAC, SQL Server Failover Cluster Instance. Обеспечивает высокую доступность, но требует сложной синхронизации кэшей.
Репликация, масштабируемость и распределённые базы данных
Вопрос
Что такое репликация в СУБД?
Ответ
Репликация — это процесс автоматического копирования данных с одного узла (мастера или источника) на один или несколько других узлов (реплик или целей). Цели репликации: повышение доступности, отказоустойчивости и масштабируемости чтения.
Вопрос
Какие основные типы репликации существуют?
Ответ
Основные типы репликации:
- Синхронная: мастер ждёт подтверждения от реплики перед завершением записи. Гарантирует согласованность, но снижает производительность.
- Асинхронная: мастер не ждёт подтверждения. Выше производительность, возможна потеря данных при сбое.
- Полусинхронная: компромисс — подтверждение требуется хотя бы от одной реплики.
Вопрос
Что такое мастер-реплика (master-slave) репликация?
Ответ
Мастер-реплика — архитектура, в которой одна нода (мастер) принимает запись, а одна или несколько реплик получают копии данных только для чтения. При отказе мастера может быть выполнено ручное или автоматическое переключение (failover).
Вопрос
Что такое мастер-мастер (multi-master) репликация?
Ответ
Мастер-мастер — архитектура, в которой несколько узлов могут принимать запись одновременно. Требует разрешения конфликтов (например, по временным меткам или векторным часам) и сложнее в управлении согласованностью.
Вопрос
Что такое логическая и физическая репликация?
Ответ
- Физическая репликация копирует байты или страницы на уровне хранилища (например, WAL-репликация в PostgreSQL). Быстрая, но требует идентичной версии СУБД.
- Логическая репликация передаёт изменения на уровне SQL-операций или строк (например,
INSERT/UPDATE). Гибкая, позволяет фильтровать таблицы и использовать разные версии СУБД.
Вопрос
Что такое read replica?
Ответ
Read replica — это реплика, предназначенная исключительно для обработки запросов на чтение. Используется для разгрузки основного сервера и масштабирования горизонтально по нагрузке чтения.
Вопрос
Что такое вертикальное масштабирование?
Ответ
Вертикальное масштабирование — увеличение ресурсов одного сервера (CPU, RAM, диск). Простой способ, но ограничен физическими пределами оборудования и не обеспечивает отказоустойчивость.
Вопрос
Что такое горизонтальное масштабирование?
Ответ
Горизонтальное масштабирование — добавление новых серверов и распределение данных между ними (например, через шардинг). Позволяет обрабатывать большие объёмы данных и запросов, но усложняет архитектуру.
Вопрос
Что такое шардинг?
Ответ
Шардинг — это горизонтальное разделение таблицы на части (шарды), размещаемые на разных серверах. Каждый шард содержит подмножество строк, определяемое ключом шардирования (например, user_id).
Вопрос
Как выбрать ключ шардирования?
Ответ
Хороший ключ шардирования:
- Обеспечивает равномерное распределение данных (высокая селективность).
- Минимизирует межшардовые запросы (часто используемые фильтры содержат этот ключ).
- Не изменяется со временем.
Примеры:user_id,tenant_id, хеш от email.
Вопрос
Что такое координатор (query router) в шардированной системе?
Ответ
Координатор — компонент, который принимает запрос от клиента, определяет нужные шарды на основе ключа шардирования и объединяет результаты. Примеры: Citus (для PostgreSQL), Vitess (для MySQL).
Вопрос
Что такое распределённая транзакция?
Ответ
Распределённая транзакция — это транзакция, затрагивающая данные на нескольких узлах (например, в разных шардах или репликах). Для её координации используется протокол двухфазного коммита (2PC).
Вопрос
Как работает протокол двухфазного коммита (2PC)?
Ответ
2PC состоит из двух фаз:
- Prepare: координатор спрашивает все участники, готовы ли они зафиксировать транзакцию.
- Commit/Rollback: если все ответили «готов», координатор отправляет команду COMMIT; иначе — ROLLBACK.
Недостаток: блокировка ресурсов при отказе координатора.
Вопрос
Что такое CAP-теорема?
Ответ
CAP-теорема утверждает, что в распределённой системе невозможно одновременно обеспечить:
- Consistency (согласованность),
- Availability (доступность),
- Partition tolerance (устойчивость к сетевым разделениям).
Можно выбрать не более двух из трёх.
Вопрос
Какие СУБД относятся к CP, а какие к AP по CAP?
Ответ
- CP-системы: PostgreSQL с синхронной репликацией, MongoDB (в режиме majority write concern), CockroachDB — жертвуют доступностью ради согласованности.
- AP-системы: Cassandra, DynamoDB, Riak — жертвуют строгой согласованностью ради доступности и устойчивости к разделениям.
Вопрос
Что такое eventual consistency?
Ответ
Eventual consistency — модель согласованности, при которой система гарантирует, что если новые обновления прекратятся, все реплики со временем станут идентичными. Не гарантируется согласованность в момент чтения.
Вопрос
Что такое глобально распределённая база данных?
Ответ
Глобально распределённая база данных размещает данные в нескольких географических регионах для снижения задержек и обеспечения отказоустойчивости. Примеры: Google Spanner, Azure Cosmos DB, Amazon Aurora Global Database.
Вопрос
Как Spanner обеспечивает внешнюю согласованность?
Ответ
Google Spanner использует TrueTime API — аппаратно-программный механизм, обеспечивающий точные временные метки с известными границами погрешности. Это позволяет реализовать строгую сериализуемость даже в глобально распределённой среде.
Вопрос
Что такое федерация баз данных?
Ответ
Федерация — архитектура, в которой несколько автономных баз данных объединены под единым интерфейсом запросов. Клиент видит одну логическую БД, но данные физически распределены. Часто используется в legacy-системах.
Вопрос
Какие подходы к миграции на шардированную архитектуру?
Ответ
Основные подходы:
- Offline migration: полная остановка сервиса, перераспределение данных, запуск новой архитектуры.
- Online resharding: постепенный перенос данных с поддержкой двойной записи и сверки.
- Использование прокси-слоя (например, ProxySQL, MaxScale) для абстракции шардов от приложения.
Безопасность, администрирование и мониторинг СУБД
Вопрос
Как в СУБД реализуется управление доступом?
Ответ
Управление доступом реализуется через систему привилегий и ролей. Администратор назначает пользователям или группам права на выполнение операций (SELECT, INSERT, UPDATE, DELETE, DDL и др.) над объектами базы данных (таблицами, схемами, функциями). Используются команды GRANT и REVOKE.
Вопрос
Что такое принцип минимальных привилегий?
Ответ
Принцип минимальных привилегий предполагает, что пользователь или приложение получает только те права, которые необходимы для выполнения его задач. Это снижает риск несанкционированного доступа или повреждения данных.
Вопрос
Как защитить СУБД от SQL-инъекций?
Ответ
Основные меры:
- Использование параметризованных запросов (prepared statements).
- Валидация и санитизация всех входных данных.
- Ограничение прав приложения (например, запрет DDL и DROP).
- Регулярное обновление СУБД и применение патчей безопасности.
Вопрос
Что такое аутентификация и авторизация в контексте СУБД?
Ответ
- Аутентификация — проверка подлинности пользователя (логин/пароль, сертификат, Kerberos, LDAP).
- Авторизация — определение, какие действия разрешены аутентифицированному пользователю (через роли и привилегии).
Вопрос
Какие методы аутентификации поддерживают современные СУБД?
Ответ
Поддерживаемые методы:
- Локальные учётные записи (логин/пароль).
- Интеграция с LDAP/Active Directory.
- Аутентификация по сертификатам SSL/TLS.
- Многофакторная аутентификация (MFA) через внешние провайдеры.
- Аутентификация на основе доверенных соединений (например, peer authentication в PostgreSQL).
Вопрос
Что такое шифрование данных в СУБД?
Ответ
Шифрование данных защищает информацию от несанкционированного доступа. Поддерживается на трёх уровнях:
- In transit: шифрование сетевого трафика (TLS/SSL).
- At rest: шифрование файлов данных на диске (TDE — Transparent Data Encryption).
- In use: шифрование в памяти (редко, экспериментальные технологии).
Вопрос
Что такое TDE (Transparent Data Encryption)?
Ответ
TDE — технология, автоматически шифрующая файлы данных, журналов и резервных копий на уровне хранилища. Данные расшифровываются при чтении в память. Поддерживается в Oracle, SQL Server, PostgreSQL (через расширения или файловую систему).
Вопрос
Что такое аудит в СУБД?
Ответ
Аудит — это регистрация событий безопасности и доступа к данным (кто, когда, что сделал). Используется для соответствия требованиям регуляторов (GDPR, PCI DSS) и расследования инцидентов. Реализуется через встроенные средства (pgAudit, SQL Server Audit) или внешние системы.
Вопрос
Какие параметры СУБД чаще всего настраиваются для производительности?
Ответ
Ключевые параметры:
- Размер буферного пула (
shared_buffersв PostgreSQL,innodb_buffer_pool_sizeв MySQL). - Память для сортировки и хеш-операций (
work_mem,sort_buffer_size). - Количество одновременных соединений (
max_connections). - Настройки WAL (
wal_buffers,checkpoint_segments). - Параметры параллелизма (
max_parallel_workers).
Вопрос
Что такое connection pool и зачем он нужен?
Ответ
Connection pool — это промежуточный слой, который управляет пулом постоянных соединений с СУБД и предоставляет их приложению по запросу. Это снижает накладные расходы на установку/разрыв соединений и предотвращает переполнение лимита max_connections.
Вопрос
Какие метрики СУБД следует мониторить?
Ответ
Ключевые метрики:
- Количество активных соединений.
- Время выполнения медленных запросов.
- Использование CPU, RAM, диска.
- Размер и возраст WAL-файлов.
- Hit ratio буферного пула.
- Частота блокировок и deadlocks.
- Размер таблиц и индексов.
Вопрос
Какие инструменты используются для мониторинга СУБД?
Ответ
Популярные инструменты:
- Встроенные:
pg_stat_statements,Performance Schema(MySQL),DMVs(SQL Server). - Сторонние: Prometheus + Grafana, Datadog, Zabbix, Percona Monitoring and Management (PMM).
- Облачные: AWS RDS Performance Insights, Azure SQL Database Metrics.
Вопрос
Что такое SLA и как он связан с СУБД?
Ответ
SLA (Service Level Agreement) — соглашение об уровне обслуживания, включающее цели по доступности, времени отклика и времени восстановления. Администратор СУБД обеспечивает выполнение SLA через репликацию, резервное копирование, мониторинг и автоматизацию аварийного переключения.
Вопрос
Как автоматизировать резервное копирование СУБД?
Ответ
Автоматизация достигается через:
- Планировщики задач (cron, Windows Task Scheduler).
- Скрипты с использованием утилит (
pg_dump,mysqldump,sqlcmd). - Интеграция с системами управления конфигурацией (Ansible, Terraform).
- Использование облачных решений (AWS Backup, Azure Backup).
Вопрос
Что такое DR-план (Disaster Recovery Plan)?
Ответ
DR-план — документированный процесс восстановления базы данных после катастрофического сбоя (пожар, стихийное бедствие, полная потеря ЦОД). Включает: RPO (цель точки восстановления), RTO (цель времени восстановления), процедуры тестирования и ответственных лиц.
Вопрос
Как проверить корректность резервной копии?
Ответ
Резервную копию следует регулярно восстанавливать в изолированной среде и проверять:
- Целостность данных (сравнение контрольных сумм).
- Возможность запуска СУБД.
- Выполнение тестовых запросов.
- Соответствие RPO/RTO.
Вопрос
Что такое роль DBA?
Ответ
DBA (Database Administrator) — специалист, отвечающий за установку, настройку, мониторинг, резервное копирование, безопасность и оптимизацию производительности СУБД. Также участвует в проектировании схем и разработке политик доступа.
Вопрос
Как обновлять СУБД без простоя?
Ответ
Стратегии:
- Использование репликации: обновление реплик по очереди, затем failover на обновлённую ноду.
- Blue-green deployment: запуск новой версии параллельно, переключение трафика.
- Rolling update в кластере (например, Patroni для PostgreSQL).
- Минорные обновления часто допускают «на лету» без остановки.
Вопрос
Что такое политика хранения данных (data retention policy)?
Ответ
Политика хранения определяет, как долго данные должны сохраняться в системе, и когда подлежат архивированию или удалению. Реализуется через партиционирование, cron-задачи или TTL (time-to-live) в NoSQL-системах.
Вопрос
Как обеспечить соответствие GDPR при работе с СУБД?
Ответ
Меры включают:
- Шифрование персональных данных.
- Анонимизацию или псевдонимизацию.
- Реализацию «права на забвение» (удаление данных по запросу).
- Ведение журнала согласий и операций с данными.
- Ограничение доступа по принципу минимальных привилегий.
NoSQL и альтернативные модели данных
Вопрос
Что такое NoSQL?
Ответ
NoSQL — это обобщённое название систем управления данными, не использующих реляционную модель и язык SQL как основной интерфейс. NoSQL-системы разработаны для масштабируемости, гибкости схемы и работы с большими объёмами неструктурированных или полуструктурированных данных.
Вопрос
Какие основные типы NoSQL-баз данных существуют?
Ответ
Основные типы:
- Ключ-значение (Redis, DynamoDB) — простая модель, высокая производительность.
- Документные (MongoDB, Couchbase) — хранение JSON/BSON-документов.
- Колоночные (Cassandra, HBase) — данные организованы по столбцам, эффективны для аналитики.
- Графовые (Neo4j, Amazon Neptune) — оптимизированы для связей и обхода графов.
Вопрос
Чем документная база отличается от реляционной?
Ответ
Документная база хранит данные в виде самодостаточных документов (обычно JSON), где структура может различаться от документа к документу. Нет жёсткой схемы, JOIN’ов и нормализации. Это упрощает эволюцию данных, но усложняет сложные запросы и поддержание целостности.
Вопрос
Что такое денормализация в контексте NoSQL?
Ответ
Денормализация в NoSQL — стандартная практика, при которой связанные данные дублируются внутри документа или записи, чтобы избежать дорогостоящих JOIN’ов. Это повышает скорость чтения за счёт увеличения объёма данных и усложнения обновлений.
Вопрос
Как обеспечивается масштабируемость в NoSQL-системах?
Ответ
Масштабируемость достигается через:
- Горизонтальное масштабирование (добавление узлов).
- Шардинг на уровне системы (часто прозрачный для приложения).
- Отказ от строгой согласованности в пользу доступности (AP по CAP).
- Минимизация централизованных компонентов.
Вопрос
Что такое eventual consistency?
Ответ
Eventual consistency — модель согласованности, при которой система гарантирует, что если прекратить обновления, все реплики со временем станут идентичными. В промежуточный момент разные клиенты могут видеть разные версии данных.
Вопрос
Как NoSQL-системы обрабатывают конфликты при записи?
Ответ
Методы разрешения конфликтов:
- Last-write-wins (LWW) — побеждает запись с более поздней меткой времени.
- Векторные часы — отслеживают причинно-следственные связи между операциями.
- CRDT (Conflict-Free Replicated Data Types) — математически гарантированно сходящиеся структуры данных.
Вопрос
Что такое консистентное хеширование?
Ответ
Консистентное хеширование — алгоритм распределения ключей по узлам, при котором добавление или удаление узла затрагивает минимальное количество ключей. Используется в Dynamo, Cassandra, Riak для эффективного шардинга и отказоустойчивости.
Вопрос
Что такое партиционирование в колоночных базах?
Ответ
В колоночных базах данные физически хранятся по столбцам, а не по строкам. Партиционирование часто выполняется по временным меткам или другим часто используемым фильтрам, что позволяет эффективно читать только нужные столбцы и блоки.
Вопрос
Какие операции эффективны в графовых базах?
Ответ
Графовые базы оптимизированы для:
- Обхода связей (например, «друзья друзей»).
- Поиска кратчайшего пути.
- Выявления сообществ и центральных узлов.
Операции видаMATCH (a)-[:KNOWS*1..3]->(b)выполняются значительно быстрее, чем эквивалентные JOIN’ы в реляционных СУБД.
Вопрос
Можно ли использовать транзакции в NoSQL?
Ответ
Поддержка транзакций зависит от системы:
- MongoDB поддерживает многострочные транзакции с версии 4.0.
- Cassandra поддерживает локальные транзакции в пределах партиции.
- Redis предоставляет команды MULTI/EXEC для группировки операций.
- Многие AP-системы отказываются от межузловых транзакций ради масштабируемости.
Вопрос
Что такое TTL в NoSQL?
Ответ
TTL (Time-To-Live) — механизм автоматического удаления записей по истечении заданного времени. Широко используется в кэширующих системах (Redis) и для хранения временных данных (логи, сессии).
Вопрос
Как хранятся индексы в документных базах?
Ответ
Документные базы (например, MongoDB) поддерживают вторичные индексы по полям внутри документов, включая вложенные поля и массивы. Индексы могут быть составными, текстовыми, геопространственными и уникальными.
Вопрос
Что такое secondary index в распределённой NoSQL-системе?
Ответ
Secondary index — индекс по нешардированному полю. В распределённой среде он может быть:
- Локальным — существует только в рамках одного шарда (быстро, но требует сканирования всех шардов для глобального запроса).
- Глобальным — реплицируется или шардируется отдельно (медленнее при записи, но эффективен при чтении).
Вопрос
Какие языки запросов используют NoSQL-системы?
Ответ
Примеры:
- MongoDB: MongoDB Query Language (MQL) — JSON-подобный синтаксис.
- Cassandra: CQL (Cassandra Query Language) — похож на SQL, но с ограничениями.
- Redis: набор команд (
GET,SET,HGETALLи др.). - Neo4j: Cypher — декларативный язык для работы с графами.
Вопрос
Что такое materialized view в NoSQL?
Ответ
Materialized view — предварительно вычисленное представление данных, обновляемое при изменении исходных записей. Используется в Cassandra и ScyllaDB для поддержки запросов по нешардированным ключам.
Вопрос
Как обеспечивается отказоустойчивость в NoSQL?
Ответ
Отказоустойчивость достигается через:
- Репликацию данных на несколько узлов (обычно N ≥ 3).
- Кворумные чтение/запись (
R + W > N). - Автоматическое обнаружение сбоев и восстановление (gossip protocol, hinted handoff).
- Multi-region deployment в облачных системах.
Вопрос
Что такое quorum в контексте NoSQL?
Ответ
Quorum — минимальное количество узлов, которые должны подтвердить операцию для её успешного завершения. Для записи обычно требуется W = (N / 2) + 1, для чтения — R = (N / 2) + 1, где N — число реплик. Это гарантирует пересечение множеств чтения и записи и предотвращает чтение устаревших данных.
Вопрос
Когда стоит выбирать NoSQL вместо реляционной СУБД?
Ответ
NoSQL предпочтителен при:
- Необходимости горизонтального масштабирования на тысячи узлов.
- Гибкой или неизвестной заранее схеме данных.
- Высокой скорости записи и низкой задержке.
- Специфических моделях данных (графы, временные ряды, документы).
Если важна строгая согласованность, сложные транзакции и отчёты — лучше выбрать реляционную СУБД.
Вопрос
Какие гибридные подходы существуют между SQL и NoSQL?
Ответ
Современные СУБД стирают границы:
- PostgreSQL поддерживает JSONB, полнотекстовый поиск, ключ-значение (через расширения).
- MySQL имеет документный API и движок Document Store.
- Azure Cosmos DB, FaunaDB, CockroachDB предлагают SQL-подобные интерфейсы поверх распределённых NoSQL-движков.
Это позволяет сочетать гибкость NoSQL с мощью SQL.
Практические сценарии, задачи и архитектурные паттерны
Вопрос
Как спроектировать базу данных для чата?
Ответ
Основные таблицы:
users(id, name)chats(id, type /* direct/group */, created_at)chat_participants(chat_id, user_id)messages(id, chat_id, sender_id, content, sent_at, status /* sent/delivered/read */)
Оптимизации:
- Индекс по
(chat_id, sent_at)для пагинации. - Архивирование старых сообщений.
- Использование очередей для доставки уведомлений.
Для высокой нагрузки — шардинг поchat_id.
Вопрос
Как реализовать систему лайков/рейтингов?
Ответ
Варианты:
- Таблица лайков:
likes(user_id, item_id, created_at), уникальный индекс по(user_id, item_id). - Счётчик в основной таблице:
items(id, ..., like_count), обновляется триггером или приложением.
Компромисс:
- Таблица лайков — точность, возможность аналитики, но больше I/O.
- Счётчик — быстрое чтение, но риск рассогласования при сбоях.
Вопрос
Как хранить дерево категорий (например, каталог товаров)?
Ответ
Способы:
- Adjacency List:
categories(id, parent_id, name). Простой, но рекурсивные запросы нужны для обхода. - Path Enumeration:
path = "/1/5/12/". Быстрый поиск потомков, но сложное обновление. - Nested Sets:
left,rightномера. Эффективен для чтения, неэффективен для записи. - Closure Table: отдельная таблица
category_ancestors(ancestor_id, descendant_id, depth). Гибкий и эффективный для большинства операций.
Вопрос
Как реализовать soft delete?
Ответ
Добавляется столбец deleted_at TIMESTAMP (или is_deleted BOOLEAN). Все запросы должны включать условие WHERE deleted_at IS NULL.
Минусы:
- Загромождение индексов «мёртвыми» строками.
- Необходимость регулярной очистки (архивации).
Альтернатива — перемещение удалённых записей в отдельную таблицу.
Вопрос
Как хранить историю изменений (audit trail)?
Ответ
Подходы:
- Триггеры: автоматически записывают изменения в таблицу
audit_log(table_name, row_id, old_values, new_values, changed_by, changed_at). - Логическая репликация: перехват изменений через WAL или binlog.
- Прикладной уровень: приложение само пишет историю.
Рекомендуется хранить как минимум: кто, что, когда, откуда (IP/user agent).
Вопрос
Как выбрать СУБД для стартапа?
Ответ
Критерии:
- PostgreSQL: лучший баланс функциональности, надёжности и open-source. Подходит для большинства случаев.
- MySQL: если важна простота и совместимость с существующим стеком (например, WordPress).
- MongoDB: если данные сильно неструктурированы и схема меняется ежедневно.
- Redis: для кэша, сессий, очередей.
Избегайте экзотики без веской причины.
Вопрос
Как масштабировать систему аналитики?
Ответ
Архитектура:
- OLTP-система (PostgreSQL/MySQL) для операционных данных.
- ETL/ELT-процесс переносит данные в хранилище данных (ClickHouse, Redshift, BigQuery, Snowflake).
- Используется схема «звезда» или «снежинка».
- Предварительно агрегированные материализованные представления для дашбордов.
Вопрос
Как реализовать очередь задач в реляционной СУБД?
Ответ
Таблица:
jobs (
id,
payload JSON,
status ENUM('pending', 'processing', 'completed', 'failed'),
created_at,
started_at,
worker_id
)
Алгоритм захвата задачи:
UPDATE jobs
SET status = 'processing', started_at = NOW(), worker_id = ?
WHERE id = (
SELECT id FROM jobs
WHERE status = 'pending'
ORDER BY created_at
LIMIT 1
FOR UPDATE SKIP LOCKED
);
SKIP LOCKED предотвращает конфликты между воркерами.
Вопрос
Как хранить временные ряды (time-series data)?
Ответ
Варианты:
- Специализированные СУБД: TimescaleDB (расширение PostgreSQL), InfluxDB, Prometheus.
- Реляционная СУБД с партиционированием: таблицы по дням/неделям, индекс по
(metric_id, timestamp). - Колоночные СУБД: ClickHouse — высокая скорость вставки и агрегации.
Не используйте обычную таблицу без партиционирования — будет медленно.
Вопрос
Как реализовать мультитенантность на уровне БД?
Ответ
Три стратегии:
- Отдельная БД на клиента — максимальная изоляция, высокая стоимость.
- Общая БД, отдельная схема — баланс между изоляцией и управляемостью.
- Общая схема, tenant_id в каждой таблице — самая экономичная, требует строгого контроля в приложении (
WHERE tenant_id = ?во всех запросах).
Вопрос
Как обнаружить и устранить узкое место в производительности?
Ответ
Пошагово:
- Включить лог медленных запросов.
- Проанализировать планы выполнения (
EXPLAIN ANALYZE). - Проверить hit ratio буферного пула.
- Оценить использование диска (IOPS, latency).
- Проверить блокировки и deadlocks.
- При необходимости — масштабировать вертикально или горизонтально.
Вопрос
Как обеспечить идемпотентность операций при повторных вызовах?
Ответ
Методы:
- Использовать идемпотентные ключи: клиент передаёт уникальный ID операции, сервер проверяет его наличие перед выполнением.
- Делать операции по своей природе идемпотентными (например,
UPDATE balance SET amount = 100, а неamount += 10). - Хранить журнал применённых операций.
Вопрос
Как реализовать поиск по тексту?
Ответ
Варианты:
- Полнотекстовый поиск в СУБД:
tsvector/tsqueryв PostgreSQL,FULLTEXT INDEXв MySQL. - Внешний поисковый движок: Elasticsearch, OpenSearch — для сложных сценариев (фасеты, ранжирование, анализ).
Не используйтеLIKE '%...%'в production — это full scan.
Вопрос
Как хранить географические данные?
Ответ
Используйте специализированные типы и индексы:
- PostGIS (расширение PostgreSQL): типы
geometry,geography, индексы GIST. - MySQL Spatial: типы
POINT,POLYGON, индексы R-tree. - MongoDB: геопространственные индексы, запросы
$near,$geoWithin.
Поддержка стандартов (WKT, GeoJSON) обязательна.
Вопрос
Как реализовать ограничение на количество одновременных активных сессий пользователя?
Ответ
Таблица сессий:
sessions(user_id, session_id, created_at, expires_at)
Перед созданием новой сессии:
- Удалить просроченные сессии (
DELETE FROM sessions WHERE expires_at < NOW()). - Посчитать активные:
SELECT COUNT(*) FROM sessions WHERE user_id = ?. - Если лимит превышен — отказать или удалить самую старую сессию.
Можно использоватьON CONFLICTилиMERGEдля атомарности.
Вопрос
Как мигрировать с одной СУБД на другую (например, MySQL → PostgreSQL)?
Ответ
Этапы:
- Анализ схемы и SQL-кода на совместимость.
- Преобразование типов данных, функций, триггеров.
- Настройка двойной записи или CDC (Change Data Capture).
- Постепенное переключение чтения на новую БД.
- Финальный cutover после сверки данных.
Инструменты: AWS DMS, pgloader, custom скрипты.
Вопрос
Как протестировать отказоустойчивость СУБД?
Ответ
Методы:
- Chaos Engineering: принудительное отключение нод, сетевых интерфейсов, дисков.
- Failover-тесты: ручной или автоматический переход на реплику.
- Нагрузочное тестирование после восстановления.
- Проверка целостности данных после сценария сбоя.
Используйте инструменты: Chaos Monkey, Gremlin, custom скрипты.
Вопрос
Как реализовать rate limiting на уровне БД?
Ответ
Пример для Redis (чаще используется, чем реляционная БД):
INCR key
EXPIRE key 60
Если значение > лимит — блокировать.
В реляционной БД:
INSERT INTO rate_limits (user_id, window_start, count)
VALUES (?, ?, 1)
ON CONFLICT (user_id, window_start)
DO UPDATE SET count = rate_limits.count + 1;
Но это дороже и медленнее, чем Redis.
Вопрос
Как хранить конфигурацию приложения в БД?
Ответ
Таблица:
app_config (
key VARCHAR PRIMARY KEY,
value JSONB,
updated_at TIMESTAMP
)
Преимущества:
- Централизованное управление.
- Возможность hot-reload без деплоя.
- Аудит изменений.
Минусы: - Дополнительный запрос при старте.
- Риск ошибок при некорректных значениях.
Кэшируйте в приложении.
Вопрос
Как обеспечить соответствие требованиям к времени восстановления (RTO) и точке восстановления (RPO)?
Ответ
- RPO ≈ 0: синхронная репликация + WAL shipping в реальном времени.
- RTO < 1 мин: автоматический failover (Patroni, Orchestrator), готовые standby-ноды.
- RPO/RTO в минутах: асинхронная репликация + регулярные архивы WAL.
Тестируйте восстановление не реже раза в квартал.