Питання на співбесіді з баз даних з відповідями
SQL і реляційне моделювання, JOIN і агрегація, індекси та плани запитів, транзакції та ізоляція, PostgreSQL на практиці, NoSQL і Redis, реплікація та шардинг.
225 запитань для співбесіди з теми Бази даних з відповідями й поясненнями - рівні Junior, Middle і Senior. Приклади запитань, онлайн-тести й задачі на код.
- SQL
- PostgreSQL
- Indexes
- Transactions
- NoSQL
Запитання за рівнями
Junior
Базові поняття та синтаксис · 50 запитань
Middle
Практика, нюанси й оптимізація · 50 запитань
Senior
Архітектура, внутрішня будова, edge cases · 50 запитань
Приклади запитань
Кілька запитань із кожного рівня з правильною відповіддю й поясненням.
Бази даних · Junior
- Що таке реляційна база даних?
Правильна відповідь: База, що зберігає дані в таблицях із рядків і стовпців і пов'язує таблиці через ключі
PostgreSQL, MySQL, SQL Server, Oracle і SQLite - реляційні бази. Запити до них пишуть мовою SQL, а зв'язки між таблицями виражають первинними й зовнішніми ключами.
- Що таке первинний ключ?
Правильна відповідь: Стовпець (або набір стовпців), що однозначно ідентифікує кожен рядок і не може бути NULL
У таблиці щонайбільше один первинний ключ. База автоматично створює для нього унікальний індекс, тож пошук за первинним ключем швидкий.
- Що таке зовнішній ключ?
Правильна відповідь: Стовпець, що посилається на первинний (або унікальний) ключ іншої таблиці, а база перевіряє, що такий рядок існує
Наприклад,
orders.user_idпосилається наusers.id. База не дасть створити замовлення для неіснуючого користувача.ON DELETE CASCADEчиON DELETE SET NULLвизначають, що робити, коли рядок, на який посилаються, видаляють. - Як змоделювати зв'язок «багато до багатьох», наприклад студентів і курси?
Правильна відповідь: Через проміжну таблицю, наприклад
enrollments(student_id, course_id), з зовнішнім ключем на кожну сторонуПроміжна таблиця може зберігати й дані про сам зв'язок, як-от дату запису чи оцінку. Список через кому не можна нормально проіндексувати, з'єднати чи обмежити.
Бази даних · Middle
- Яку структуру даних використовує індекс PostgreSQL за замовчуванням?
Правильна відповідь: B-дерево
B-дерева тримають ключі відсортованими, тож підтримують рівність, діапазони (
<,BETWEEN), сортування та префікснийLIKE 'abc%'(з відповідною collation чи класом операторів). Hash, GIN, GiST і BRIN - для особливих випадків. - Є індекс на
(last_name, first_name). Який запит може ефективно його використати?Правильна відповідь:
WHERE last_name = 'Smith'Складений індекс відсортований за першим стовпцем, а всередині нього - за другим, як телефонний довідник. Він допомагає запитам за початковим префіксом стовпців; пошук лише за
first_nameзазвичай не може добре його використати. - Є індекс на
created_at. ЧомуWHERE date(created_at) = '2026-11-01'може його ігнорувати?Правильна відповідь: Функція над стовпцем змінює значення, тож індекс за сирим стовпцем не можна використати для пошуку; беріть діапазон або індекс за виразом
Перепишіть як
created_at >= '2026-11-01' AND created_at < '2026-11-02'або створіть індекс за самим виразом. - Чому звичайний B-tree індекс не пришвидшить
WHERE name LIKE '%son'?Правильна відповідь: З шаблоном на початку невідомо, з чого починається значення, тож відсортований індекс не звузить пошук
LIKE 'son%'може використати B-дерево (з відповідним класом операторів). Для пошуку підрядка чи нечіткого пошуку беріть триграмний GIN-індекс (pg_trgm) або повнотекстовий пошук.
Бази даних · Senior
- Як PostgreSQL вирішує, чи видима версія рядка для транзакції?
Правильна відповідь: Кожна версія рядка зберігає ID транзакцій
xmin/xmax, які порівнюються зі знімком транзакціїxmin- транзакція, що створила версію,xmax- та, що видалила чи оновила. Знімок містить список транзакцій, які ще тривали, тож рядок видимий, лише якщо його творець закомітився раніше. - Що таке переповнення ID транзакцій (wraparound) і чому воно небезпечне?
Правильна відповідь: ID транзакцій 32-бітні й використовуються повторно; якщо VACUUM вчасно не «заморозить» старі рядки, PostgreSQL припинить приймати запис, щоб захистити дані
Autovacuum заморожує старі рядки задовго до межі. Вимкнений autovacuum чи дуже довгі транзакції можуть підвести базу до примусової зупинки.
- Що таке роздування таблиці (bloat) і що його зазвичай спричиняє?
Правильна відповідь: Місце, зайняте мертвими версіями рядків, яке не встигає перевикористовуватися; часто через інтенсивні оновлення, відставання autovacuum або довгі транзакції, що блокують прибирання
Налаштовуйте autovacuum для окремих таблиць (менші scale factor для гарячих), уникайте довгих транзакцій і перебудовуйте роздуті об'єкти онлайн через
pg_repackчиREINDEX CONCURRENTLY. - Яке призначення журналу попереднього запису (WAL)?
Правильна відповідь: Зміни пишуться в послідовний журнал і скидаються на диск до commit, тож база може відновитися після збою й передавати зміни реплікам
Сторінки даних можна записати на диск пізніше, у фоні. WAL також лежить в основі фізичної реплікації, логічного декодування й відновлення на момент часу.
Задачі на код
Напишіть рішення просто в браузері - тести перевірять його одразу. Класика співбесід на JavaScript (debounce, deepClone, Promise.all, LRU-кеш) і на React: компоненти й хуки на кшталт списку справ, вкладок, useDebounce та useInterval.
Відкрити задачі →