SQL собеседование: шпаргалка по нормализации баз данных

Нормализация

Вопрос: Что такое нормализация?

Ответ: Нормализация — это процесс приведения базы данных к нормальным формам для устранения логической избыточности. Логическая избыточность возникает, например, когда в таблице пользователей хранится только один номер телефона, хотя у пользователя может быть несколько. В этом случае номер телефона целесообразно вынести в отдельную таблицу и организовать связь «один ко многим». Декомпозиция — одна из вариаций нормализации. Существует восемь нормальных форм (от первой до шестой, а также нормальная форма Бойса-Кодда и доменная ключевая форма).

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 покажет план выполнения и время удаления.

Что будем искать? Например,программа