Jako frontend developer wysyłasz requesty do API i dostajesz JSON. Ale skąd te dane pochodzą? Z bazy danych. Zrozumienie jak działają bazy to klucz do lepszej współpracy z backendowcami i pisania fullstack aplikacji.
Krótka odpowiedź:SQL to język zapytań używany do pracy z relacyjnymi bazami danych. (np. PostgreSQL) dla danych z relacjami, stałą strukturą i wymogami spójności (e-commerce, CRM, finanse). NoSQL to szeroka grupa baz danych nierelacyjnych, zwykle lepiej dopasowanych do elastycznych modeli danych. (np. MongoDB) dla elastycznej struktury dokumentów i dużej zmienności danych. Redis jako uzupełnienie do cache i sesji — nie jako alternatywa.
W tym artykule poznasz fundamenty baz danych, różnicę między SQL i NoSQL, i nauczysz się podstawowych operacji.
Czym jest baza danych?
Baza danych to zorganizowany zbiór danych z mechanizmami do:
Przechowywania (storage)
Wyszukiwania (queries)
Aktualizacji (updates)
Zarządzania dostępem (permissions)
Bez bazy danych:
Code
// Dane w pamięci — giną po restarcielet users = [ { id: 1, name: 'Jan' }, { id: 2, name: 'Anna' }]
Z bazą danych:
Code
// Dane trwałe, skalowalne, bezpieczneconst users = await db.query('SELECT * FROM users')
SQL vs NoSQL — podstawowa różnica
SQL (relacyjne)
Dane w tabelach z wierszami i kolumnami:
Code
Tabela: users
┌────┬──────────┬─────────────────────┬─────────┐
│ id │ name │ email │ role │
├────┼──────────┼─────────────────────┼─────────┤
│ 1 │ Jan │ jan@example.com │ admin │
│ 2 │ Anna │ anna@example.com │ user │
│ 3 │ Piotr │ piotr@example.com │ user │
└────┴──────────┴─────────────────────┴─────────┘
Tabela: posts
┌────┬─────────┬──────────────────┐
│ id │ user_id │ title │
├────┼─────────┼──────────────────┤
│ 1 │ 1 │ Pierwszy post │
│ 2 │ 1 │ Drugi post │
│ 3 │ 2 │ Aktualności │
└────┴─────────┴──────────────────┘
Dane mogą być zagnieżdżone, a schemat bywa bardziej elastyczny. To nie znaczy jednak, że schematu nie ma wcale — zwykle istnieje w kodzie, walidacji albo regułach aplikacji.
Najważniejsze uproszczenie do obalenia: to nie jest wojna religijna. Wiele systemów używa SQL jako głównej bazy, a obok Redis, Elastic albo dokumentowy store do konkretnych zadań.
Wybierz SQL gdy:
Dane mają stałą strukturę (users, orders, products)
Potrzebujesz relacji między danymi
Ważna jest spójność danych (transakcje)
Złożone zapytania i raportowanie
Przykłady: E-commerce, systemy bankowe, CRM, ERP
Wybierz NoSQL gdy:
Struktura danych się zmienia
Dane są hierarchiczne/zagnieżdżone
Potrzebujesz wysokiej skalowalności
Szybki prototyping
Przykłady: Social media, real-time apps, IoT, cache
Porównanie
Cecha
SQL
NoSQL
Struktura
Jawny schemat
Elastyczny lub jawnie walidowany schemat
Relacje
Tak (JOIN)
Modelowane inaczej, często przez embedding lub referencje
Skalowalność
Pionowa (typowo)
Pozioma (typowo)
Transakcje
ACID
Zależy od silnika i konkretnej operacji
Zapytania
SQL (standaryzowany)
Różne API, czyli Application Programming Interface, definiuje sposób komunikacji między aplikacjami lub modułami.
Use case
Dane transakcyjne, raportowanie
Dane dokumentowe, cache, eventy, duża zmienność struktury
SQL — podstawy
Tworzenie tabeli
Code
CREATE TABLE users ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL, email VARCHAR(255) UNIQUE NOT NULL, role VARCHAR(50) NOT NULL DEFAULT 'user', last_login TIMESTAMP, created_at TIMESTAMP DEFAULT NOW());CREATE TABLE posts ( id SERIAL PRIMARY KEY, user_id INTEGER REFERENCES users(id), title VARCHAR(255) NOT NULL, content TEXT, created_at TIMESTAMP DEFAULT NOW());
CRUD — Create, Read, Update, Delete
CREATE (INSERT):
Code
INSERT INTO users (name, email) VALUES ('Jan Kowalski', 'jan@example.com');INSERT INTO users (name, email) VALUES ('Anna Nowak', 'anna@example.com'), ('Piotr Wiśniewski', 'piotr@example.com');
READ (SELECT):
Code
-- Wszystkie kolumnySELECT * FROM users;-- Wybrane kolumnySELECT name, email FROM users;-- Z warunkiemSELECT * FROM users WHERE name = 'Jan Kowalski';-- Wiele warunkówSELECT * FROM users WHERE role = 'admin' AND created_at > '2025-01-01';-- SortowanieSELECT * FROM users ORDER BY created_at DESC;-- LimitSELECT * FROM users LIMIT 10 OFFSET 20;-- ZliczanieSELECT COUNT(*) FROM users WHERE role = 'admin';
UPDATE:
Code
UPDATE users SET email = 'nowy@example.com'WHERE id = 1;UPDATE users SET role = 'premium'WHERE created_at < '2024-01-01';
DELETE:
Code
DELETE FROM users WHERE id = 1;DELETE FROM users WHERE last_login < '2024-01-01';
JOIN — łączenie tabel
Code
-- INNER JOIN — tylko pasująceSELECT users.name, posts.titleFROM usersINNER JOIN posts ON users.id = posts.user_id;-- LEFT JOIN — wszystkie z lewej + pasujące z prawejSELECT users.name, posts.titleFROM usersLEFT JOIN posts ON users.id = posts.user_id;-- Pokaże też userów bez postów (posts.title = NULL)
Code
users: posts:
id | name id | user_id | title
1 | Jan 1 | 1 | Post A
2 | Anna 2 | 1 | Post B
3 | Piotr 3 | 2 | Post C
INNER JOIN:
Jan | Post A
Jan | Post B
Anna | Post C
LEFT JOIN:
Jan | Post A
Jan | Post B
Anna | Post C
Piotr | NULL
Agregacje
Code
-- GrupowanieSELECT role, COUNT(*) as countFROM usersGROUP BY role;-- Z filtrem na grupySELECT role, COUNT(*) as countFROM usersGROUP BY roleHAVING COUNT(*) > 5;-- Średnia, suma, min, maxSELECT AVG(price) as avg_price, SUM(quantity) as total_quantity, MIN(price) as cheapest, MAX(price) as most_expensiveFROM products;
// schema.prismamodel User { id Int @id @default(autoincrement()) email String @unique name String? posts Post[]}model Post { id Int @id @default(autoincrement()) title String author User @relation(fields: [authorId], references: [id]) authorId Int}
Bez indeksu baza skanuje wszystkie wiersze. Z indeksem — szybkie wyszukiwanie.
Code
-- SQLCREATE INDEX idx_users_email ON users(email);CREATE INDEX idx_posts_user_id ON posts(user_id);-- Sprawdź plan zapytaniaEXPLAIN SELECT * FROM users WHERE email = 'jan@example.com';
Nie indeksuj wszystkiego — indeksy spowalniają INSERT/UPDATE
Compound indexes dla złożonych zapytań
Transakcje — spójność danych
Transakcja to grupa operacji, które wykonują się wszystkie albo żadna:
Code
BEGIN; UPDATE accounts SET balance = balance - 100 WHERE id = 1; UPDATE accounts SET balance = balance + 100 WHERE id = 2;COMMIT;-- Jeśli coś pójdzie nie tak:ROLLBACK;
ACID:
Atomicity — wszystko albo nic
Consistency — dane zawsze spójne
Isolation — transakcje nie przeszkadzają sobie
Durability — zatwierdzone dane są trwałe
FAQ
SQL czy NoSQL — co wybrać dla aplikacji webowej?
Dla większości aplikacji webowych SQL (PostgreSQL) to bezpieczniejszy i bardziej wszechstronny wybór. Daje transakcje ACID, relacje między tabelami, standaryzowany język zapytań i jest wspierany przez niemal każde środowisko hostingowe. NoSQL (MongoDB, Firestore) ma sens gdy struktura danych jest bardzo zmienna, dane są hierarchiczne (zagnieżdżone dokumenty) lub potrzebujesz poziomej skalowalności od pierwszego dnia.
Jaka jest różnica między SQL a NoSQL?
SQL przechowuje dane w tabelach z wierszami i kolumnami oraz jawnym schematem. Relacje między tabelami realizuje przez JOIN. NoSQL przechowuje dane jako dokumenty JSON, pary klucz-wartość, grafy lub kolumny — schemat jest elastyczny lub definiowany w kodzie. Kluczowa różnica praktyczna: SQL wymaga zdefiniowania struktury z góry, NoSQL pozwala na ewolucję struktury.
Kiedy używać PostgreSQL, a kiedy MongoDB?
PostgreSQL — gdy dane mają relacje (użytkownik ma zamówienia, zamówienie ma produkty), potrzebujesz ACID transakcji, piszesz złożone raporty lub agregacje, albo budujesz system, gdzie spójność danych jest krytyczna (e-commerce, finanse, auth). MongoDB — gdy dane to dokumenty o zmiennej strukturze, budujesz prototyp i schemat jeszcze się kształtuje, lub pracujesz z danymi hierarchicznymi gdzie embedding jest naturalny.
Co to jest ORM i kiedy go używać?
ORM (Object-Relational Mapper) to biblioteka, która tłumaczy operacje na obiektach w kodzie na zapytania SQL. Zamiast pisać SELECT * FROM users WHERE id = 1 piszesz prisma.user.findUnique({ where: { id: 1 } }). Warto używać ORM (Prisma, Drizzle, Sequelize) gdy zależy Ci na type-safety, automatycznych migracjach i czystym API. Nie rezygnuj jednak z rozumienia SQL — ORM nie zastąpi wiedzy o tym, jak działają zapytania i indeksy.
Czy mogę używać SQL i NoSQL w tym samym projekcie?
Tak i to jest normalna architektura. Typowy wzorzec: PostgreSQL jako główna baza transakcyjna, Redis do cache i sesji, Elasticsearch do wyszukiwania pełnotekstowego, S3 do plików. Nie musisz wybierać jednego rozwiązania — dobieraj narzędzia do konkretnych zadań.
Co to jest Redis i kiedy jest potrzebny?
Redis to baza danych in-memory operująca na parach klucz-wartość. Nie służy do przechowywania głównych danych aplikacji, lecz jako cache (przyspieszenie kosztownych zapytań), store sesji użytkowników i kolejka zadań. Dane w Redis są dostępne w mikrosekundach — stąd wartość przy często odczytywanych, niezmiennych (lub rzadko zmienianych) danych.
Jaką bazę danych wybrać dla projektu Next.js?
Dla nowego projektu Next.js popularnym stackiem jest PostgreSQL + Prisma jako ORM — Prisma ma świetną integrację z TypeScript i Next.js, a Supabase lub Neon oferują PostgreSQL hostowany z darmowym tieram. Jeśli potrzebujesz szybkiego startu bez konfiguracji bazy — Firebase lub PlanetScale. Dla cache i sesji — Upstash Redis (bezserwerowy Redis kompatybilny z Edge Runtime Next.js).
Podsumowanie
Potrzebujesz
Wybierz
Relacje między danymi
SQL (PostgreSQL)
Elastyczna struktura lub dokumenty
NoSQL (MongoDB)
Cache / sesje
Redis
Prototyp / MVP
Firebase, Supabase
Enterprise / finanse
PostgreSQL, MySQL
Rekomendacja dla początkujących:
Naucz się SQL — to fundament, nawet jeśli później użyjesz też NoSQL
PostgreSQL — dla większości aplikacji webowych to bardzo dobry start
Prisma — dobry ORM, ale najpierw rozumiej model danych, nie tylko API biblioteki
Bazy danych to ogromny temat. Ten artykuł to fundament — wystarczy, żebyś mógł rozmawiać z backendowcami i budować proste fullstack aplikacje.
Jeśli chcesz uporządkować backendowe fundamenty aplikacji i uniknąć typowych błędów architektonicznych już na starcie, skontaktuj się ze mną. Pomagam przekładać wiedzę techniczną na rozwiązania, które da się sensownie utrzymać i rozwijać.
Maciej Sala — project manager i frontendowiec z doświadczeniem w marketingu internetowym. Na co dzień pracuję z Reactem, Next.js i TypeScriptem, łącząc perspektywę produktową z praktycznym podejściem do kodu. Przez kilka lat związany z branżą gier wideo jako project manager i game designer.
Absolwent historii na Uniwersytecie Jagiellońskim i studiów podyplomowych z marketingu internetowego na Akademii Górniczo-Hutniczej w Krakowie. Poza pracą trenuje na siłowni, maluje figurki i realizuje własne projekty.
Anthropic uderza w Figmę i Adobe — oto Claude Design
Anthropic wypuścił właśnie narzędzie AI do tworzenia stron, landing page'ów i prezentacji z promptu. Oto co wiemy o Claude Design i Opus 4.7 — i co to oznacza dla developerów.
Astro.js vs Next.js — które narzędzie wybrać w 2026 roku?
Fachowe porównanie Astro.js i Next.js z perspektywy developera pracującego na co dzień w Next.js. Architektura, wydajność, SEO, DX, koszty i konkretne use case — z benchmarkami i przykładami kodu.
WordPress → Next.js — migracja treści, redirecty 301 i zachowanie pozycji SEO
Jak przenieść stronę z WordPress na Next.js bez utraty pozycji w Google? Eksport treści, mapowanie URL, redirecty 301, migracja obrazów i weryfikacja indeksacji.