Нормализация
Вопрос: Что такое нормализация?
Ответ: Нормализация — это процесс приведения базы данных к нормальным формам для устранения логической избыточности. Логическая избыточность возникает, например, когда в таблице пользователей хранится только один номер телефона, хотя у пользователя может быть несколько. В этом случае номер телефона целесообразно вынести в отдельную таблицу и организовать связь «один ко многим». Декомпозиция — одна из вариаций нормализации. Существует восемь нормальных форм (от первой до шестой, а также нормальная форма Бойса-Кодда и доменная ключевая форма).
NoSQL vs SQL
Вопрос: Есть ли преимущества NoSQL над SQL?
Ответ: Да, иногда NoSQL обеспечивает большее быстродействие, особенно в запросах с большим количеством связей, где SQL-системам приходится обращаться к большим таблицам. Это связано с отсутствием жесткой схемы и связей в NoSQL. Например, MongoDB может превосходить PostgreSQL в подобных сценариях.
Транзакции
Вопрос: Что такое транзакция?
Ответ: Транзакция — это элементарная операция в базе данных, которая может состоять из нескольких операций. Это логически целостная структура, где должны быть выполнены либо все операции, либо ни одна. Транзакция начинается с команды BEGIN и заканчивается командой COMMIT (фиксация) или ROLLBACK (отмена).
Свойства ACID
Вопрос: Какие требования предъявляются к транзакциям (свойства ACID)?
Ответ: Транзакции должны обладать свойствами:
- Атомарность (Atomicity): Транзакция выполняется полностью или не выполняется вовсе.
- Согласованность (Consistency): Транзакция переводит базу данных из одного согласованного состояния в другое.
- Изолированность (Isolation): Другие транзакции минимально влияют на выполняющуюся транзакцию.
- Долговечность (Durability): После успешной фиксации данные надежно сохраняются и доступны даже при сбоях системы.
Аномалии при параллельном выполнении транзакций
Вопрос: Какие аномалии могут возникать при параллельном выполнении транзакций?
Ответ: При параллельном выполнении транзакций могут возникать следующие аномалии:
- Потерянное обновление (Lost update): Разные транзакции изменяют одни и те же данные, и изменения одной транзакции перезаписываются другой.
- Грязное чтение (Dirty read): Транзакция читает данные, измененные параллельной транзакцией, которая еще не завершилась.
- Неповторяющееся чтение (Non-repeatable read): При повторном чтении одних и тех же данных в рамках одной транзакции другая транзакция успела изменить и зафиксировать эти данные, в результате запрос выдает другой результат.
- Фантомное чтение (Phantom read): Транзакция повторно выбирает множество строк по одному и тому же критерию, а другая транзакция добавляет новые строки между выборками, что приводит к изменению результата.
- Аномалия сериализации: Результат успешной фиксации группы параллельных транзакций не совпадает ни с одним вариантом их последовательного выполнения.
Уровни изоляции
Вопрос: Какие уровни изоляции существуют в SQL?
Ответ: Существуют следующие уровни изоляции:
- Read Uncommitted: Самый низкий уровень, допускающий чтение незафиксированных данных (в PostgreSQL запрещено).
- Read Committed: Не допускает чтения незафиксированных данных; транзакция видит только свои незафиксированные изменения.
- Repeatable Read: Не допускает чтения незафиксированных данных и неповторяющегося чтения (в PostgreSQL также запрещено фантомное чтение).
- Serializable: Самый высокий уровень изоляции, предотвращающий все перечисленные аномалии, но может снижать производительность.
Блокировки
Вопрос: Что такое блокировки?
Ответ: Блокировки обеспечивают поддержку уровней изоляции транзакций. СУБД позволяют создавать блокировки на уровне отдельных строк или целых таблиц. Команда SELECT … FOR UPDATE позволяет блокировать строки для последующего обновления.
Индексы
Вопрос: Что такое индексы и какие типы индексов существуют?
Ответ: Индекс — это структура данных, связанная с таблицей и используемая для повышения производительности запросов. Типы индексов: B-дерево (по умолчанию), Hash, GiST, SP-GiST, GIN, BRIN. Индексы можно создавать по одному или нескольким столбцам, создавать уникальные индексы, индексы на основе выражений и частичные индексы.
Планировщик запросов
Вопрос: Что такое планировщик запросов?
Ответ: Планировщик запросов — это встроенный механизм СУБД, формирующий план выполнения запроса. Команда EXPLAIN позволяет посмотреть план выполнения.
Оптимизация запросов
Вопрос: Как можно оптимизировать запросы?
Ответ: Оптимизация запросов может включать: изменение самого SQL-запроса, обновление статистики, денормализацию (создание временных таблиц или индексов), изменение параметров планировщика (порядок соединения, метод доступа к данным, агрегирование, материализация, сортировка).
Масштабируемость
Вопрос: Какие существуют концепции масштабируемости баз данных?
Ответ: Основные концепции:
- Шардирование (Sharding): Разбиение данных на части (шарды), хранящиеся на разных серверах.
- Репликация: Полное копирование базы данных на другие серверы.
EXPLAIN ANALYZE DROP DATABASE
Вопрос: Что произойдет, если выполнить EXPLAIN ANALYZE DROP DATABASE postgres?
Ответ: База данных postgres будет удалена, а EXPLAIN ANALYZE покажет план выполнения и время удаления.