Pytania rekrutacyjne z baz danych z odpowiedziami
SQL i modelowanie relacyjne, JOIN-y i agregacja, indeksy i plany zapytań, transakcje i izolacja, PostgreSQL w praktyce, NoSQL i Redis, replikacja i sharding.
225 pytań na rozmowę rekrutacyjną z tematu Bazy danych z odpowiedziami i wyjaśnieniami - poziomy Junior, Middle i Senior. Przykładowe pytania, testy online i zadania z kodu.
- SQL
- PostgreSQL
- Indexes
- Transactions
- NoSQL
Pytania według poziomu
Junior
Podstawowe pojęcia i składnia · 50 pytań
Middle
Praktyka, niuanse i optymalizacja · 50 pytań
Senior
Architektura, mechanizmy wewnętrzne, przypadki brzegowe · 50 pytań
Przykładowe pytania
Kilka pytań z każdego poziomu z poprawną odpowiedzią i wyjaśnieniem.
Bazy danych · Junior
- Czym jest relacyjna baza danych?
Poprawna odpowiedź: Bazą, która przechowuje dane w tabelach z wierszami i kolumnami i łączy tabele kluczami
PostgreSQL, MySQL, SQL Server, Oracle i SQLite to bazy relacyjne. Zapytania do nich pisze się w SQL, a powiązania między tabelami wyraża kluczami głównymi i obcymi.
- Czym jest klucz główny?
Poprawna odpowiedź: Kolumną (lub zestawem kolumn), która jednoznacznie identyfikuje każdy wiersz i nie może być NULL
Tabela ma co najwyżej jeden klucz główny. Baza automatycznie tworzy dla niego unikalny indeks, więc wyszukiwanie po kluczu głównym jest szybkie.
- Czym jest klucz obcy?
Poprawna odpowiedź: Kolumną, która odwołuje się do klucza głównego (lub unikalnego) innej tabeli, a baza sprawdza, czy taki wiersz istnieje
Na przykład
orders.user_idodwołuje się dousers.id. Baza odrzuci zamówienie dla nieistniejącego użytkownika.ON DELETE CASCADElubON DELETE SET NULLokreślają, co się stanie po usunięciu wiersza, do którego jest odwołanie. - Jak zamodelować relację wiele do wielu, np. studentów i kursy?
Poprawna odpowiedź: Tabelą łączącą, np.
enrollments(student_id, course_id), z kluczem obcym do każdej stronyTabela łącząca może też przechowywać dane o samej relacji, np. datę zapisu czy ocenę. Listy po przecinku nie da się porządnie zindeksować, złączyć ani ograniczyć.
Bazy danych · Middle
- Jakiej struktury danych używa domyślny indeks w PostgreSQL?
Poprawna odpowiedź: B-drzewa
B-drzewa trzymają klucze posortowane, więc obsługują równość, zakresy (
<,BETWEEN), sortowanie i prefiksowyLIKE 'abc%'(z odpowiednią collation lub klasą operatorów). Hash, GIN, GiST i BRIN są do szczególnych przypadków. - Jest indeks na
(last_name, first_name). Które zapytanie może go efektywnie użyć?Poprawna odpowiedź:
WHERE last_name = 'Smith'Indeks złożony jest posortowany po pierwszej kolumnie, a w jej obrębie po drugiej, jak książka telefoniczna. Pomaga zapytaniom po początkowym prefiksie kolumn; szukanie tylko po
first_namezwykle nie wykorzysta go dobrze. - Jest indeks na
created_at. DlaczegoWHERE date(created_at) = '2026-11-01'może go zignorować?Poprawna odpowiedź: Funkcja na kolumnie zmienia wartość, więc indeksu na surowej kolumnie nie da się przeszukać; użyj zakresu albo indeksu na wyrażeniu
Przepisz to jako
created_at >= '2026-11-01' AND created_at < '2026-11-02'albo utwórz indeks na samym wyrażeniu. - Dlaczego zwykły indeks B-tree nie przyspieszy
WHERE name LIKE '%son'?Poprawna odpowiedź: Z symbolem wieloznacznym na początku nie wiadomo, jak zaczyna się wartość, więc posortowany indeks nie zawęzi wyszukiwania
LIKE 'son%'może użyć B-drzewa (z odpowiednią klasą operatorów). Do szukania podciągów lub wyszukiwania rozmytego użyj trigramowego indeksu GIN (pg_trgm) albo wyszukiwania pełnotekstowego.
Bazy danych · Senior
- Jak PostgreSQL decyduje, czy wersja wiersza jest widoczna dla transakcji?
Poprawna odpowiedź: Każda wersja wiersza przechowuje ID transakcji
xmin/xmax, porównywane ze snapshotem transakcjixminto transakcja, która utworzyła wersję, axmaxta, która ją usunęła lub zaktualizowała. Snapshot zawiera listę transakcji jeszcze trwających, więc wiersz jest widoczny tylko wtedy, gdy jego twórca zatwierdził się wcześniej. - Czym jest przepełnienie ID transakcji (wraparound) i dlaczego jest groźne?
Poprawna odpowiedź: ID transakcji są 32-bitowe i używane ponownie; jeśli VACUUM nie „zamrozi” starych wierszy na czas, PostgreSQL przestaje przyjmować zapisy, żeby chronić dane
Autovacuum zamraża stare wiersze dużo przed limitem. Wyłączony autovacuum albo bardzo długie transakcje mogą doprowadzić bazę do wymuszonego zatrzymania.
- Czym jest puchnięcie tabeli (bloat) i co je zwykle powoduje?
Poprawna odpowiedź: Miejscem zajętym przez martwe wersje wierszy, które nie jest wystarczająco szybko ponownie używane; często przez intensywne aktualizacje, opóźniony autovacuum lub długie transakcje blokujące sprzątanie
Dostrajaj autovacuum per tabela (niższe scale factor dla gorących tabel), unikaj długich transakcji i przebudowuj spuchnięte obiekty online przez
pg_repacklubREINDEX CONCURRENTLY. - Jaki jest cel dziennika zapisu z wyprzedzeniem (WAL)?
Poprawna odpowiedź: Zmiany są zapisywane do sekwencyjnego dziennika i zrzucane na dysk przed commitem, więc baza może się odtworzyć po awarii i przesyłać zmiany do replik
Strony danych można zapisać na dysk później, w tle. WAL napędza też replikację fizyczną, dekodowanie logiczne i odtwarzanie do punktu w czasie.
Zadania z kodu
Napisz rozwiązanie prosto w przeglądarce, a testy od razu je sprawdzą. Klasyka rozmów rekrutacyjnych z JavaScriptu (debounce, deepClone, Promise.all, cache LRU) i z Reacta: komponenty i hooki, takie jak lista zadań, zakładki, useDebounce i useInterval.
Otwórz zadania →