PostgreSQL (Postgres) to zaawansowana, open-source relacyjna baza danych z ponad 35-letnią historią. Jest znana z niezawodności, rozszerzalności i zgodności ze standardami SQL. Postgres obsługuje zarówno dane relacyjne (tabele, JOIN-y) jak i NoSQL (JSONB, arrays, hstore).
PostgreSQL jest bazą danych nr 1 dla startupów, SaaS i enterprise. Używają go Supabase, Neon, Railway, Vercel Postgres, Amazon RDS i tysiące firm na świecie.
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name TEXT NOT NULL,
email TEXT UNIQUE NOT NULL,
role TEXT CHECK (role IN ('admin', 'user', 'editor')),
metadata JSONB DEFAULT '{}',
created_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE orders (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES users(id) ON DELETE CASCADE,
total NUMERIC(10,2) NOT NULL,
status TEXT DEFAULT 'pending',
items JSONB NOT NULL,
created_at TIMESTAMPTZ DEFAULT now()
);
CREATE INDEX idx_orders_user ON orders(user_id);
CREATE INDEX idx_orders_status ON orders(status);
-- Top 10 klientów wg wydatków w ostatnim miesiącu
SELECT
u.name,
u.email,
COUNT(o.id) AS order_count,
SUM(o.total) AS total_spent,
ROUND(AVG(o.total), 2) AS avg_order
FROM users u
JOIN orders o ON o.user_id = u.id
WHERE o.created_at >= now() - INTERVAL '30 days'
AND o.status = 'completed'
GROUP BY u.id
ORDER BY total_spent DESC
LIMIT 10;
-- Szukaj w JSONB metadata
SELECT * FROM users
WHERE metadata->>'plan' = 'premium'
AND (metadata->'tags') ? 'vip';
-- Aktualizuj zagnieżdżony JSONB
UPDATE users
SET metadata = jsonb_set(
metadata,
'{preferences,theme}',
'"dark"'
)
WHERE id = 'abc-123';
-- Agregacja JSONB array
SELECT
jsonb_array_elements_text(metadata->'tags') AS tag,
COUNT(*) AS count
FROM users
GROUP BY tag
ORDER BY count DESC;
-- Dodaj kolumnę search vector
ALTER TABLE articles ADD COLUMN search_vector TSVECTOR;
UPDATE articles SET search_vector =
to_tsvector('polish', title || ' ' || body);
CREATE INDEX idx_search ON articles USING GIN(search_vector);
-- Szukaj z rankingiem
SELECT title,
ts_rank(search_vector, query) AS rank
FROM articles,
to_tsquery('polish', 'flutter & aplikacja') query
WHERE search_vector @@ query
ORDER BY rank DESC;
Pełne wsparcie SQL. Foreign keys, constraints, triggers, views, CTEs, window functions.
Przechowuj i query'uj dane NoSQL. Indeksy GIN, operatory JSONB, jsonb_path_query.
Wbudowane wyszukiwanie pełnotekstowe. tsvector, tsquery, ranking, stemming po polsku.
Dane geolokalizacyjne. Punkty, polygony, odległości, routing. Standard w GIS.
Polityki bezpieczeństwa na poziomie wiersza. Idealne do multi-tenant SaaS.
pgvector (AI embeddings), pg_cron, pg_stat, timescaledb (time series), Citus (sharding).
Idealny gdy: budujesz SaaS z relacjami między danymi, potrzebujesz transakcji ACID, chcesz JSONB + SQL, budujesz multi-tenant platform, potrzebujesz full-text search.
Nie najlepszy gdy: budujesz prosty MVP i chcesz zero-config (lepiej Firebase), potrzebujesz real-time sync out-of-the-box (lepiej Firestore), budujesz prototyp w weekend.