PostgreSQL — co to jest i jak działa?

    PostgreSQL to najbardziej zaawansowana open-source relacyjna baza danych. Poznaj JSONB, zaawansowany SQL, indeksy, MVCC i rozszerzenia (PostGIS, pgvector).

    Czym jest PostgreSQL?

    PostgreSQL to zaawansowana, open-source relacyjna baza danych rozwijana od 1986 roku. Znana z niezawodności, pełnej zgodności z ACID, rozbudowanego systemu typów (JSONB, arrays, geometry) i ogromnego ekosystemu rozszerzeń.

    PostgreSQL jest domyślną bazą danych w wielu framework'ach (Django, Rails, Laravel) i preferowana przez firmy budujące skalowalne aplikacje: Instagram, Spotify, Twitch, Reddit używają PostgreSQL w produkcji.

    1986

    Początek projektu POSTGRES na UC Berkeley. Open-source od 1996 jako PostgreSQL.

    #1 RDBMS

    Najpopularniejsza baza danych wg Stack Overflow Developer Survey 2023 (wśród profesjonalnych deweloperów)

    ACID

    Pełna zgodność z ACID (Atomicity, Consistency, Isolation, Durability) — gwarancja integralności danych

    Typy danych PostgreSQL

    Numeryczne

    • INTEGER, BIGINT, SMALLINT
    • DECIMAL/NUMERIC (precyzja)
    • REAL, DOUBLE PRECISION
    • SERIAL, BIGSERIAL (auto-increment)

    Tekstowe

    • VARCHAR(n) — limit znaków
    • TEXT — nieograniczona długość
    • CHAR(n) — fixed-length
    • CITEXT — case-insensitive text

    Data i czas

    • DATE — tylko data
    • TIME — czas (z/bez timezone)
    • TIMESTAMP — data + czas
    • INTERVAL — przedział czasu

    JSON

    • JSON — walidacja składni, wolny
    • JSONB — binarny, indeksowalny, szybki
    • jsonpath — XPath dla JSON (pg12+)

    Specjalne

    • UUID — uniwersalne ID
    • ARRAY — tablice dowolnych typów
    • ENUM — lista wartości
    • INET/CIDR — adresy IP

    Geometryczne / GIS

    • POINT, LINE, POLYGON
    • geometry, geography (PostGIS)
    • tsquery/tsvector — full-text search

    Zaawansowany SQL — przykłady

    Zaawansowane zapytanie z CTE i Window Functions

    -- CTE (Common Table Expression) + window function
    WITH ranked_orders AS (
      SELECT
        customer_id,
        order_date,
        amount,
        ROW_NUMBER() OVER (
          PARTITION BY customer_id
          ORDER BY order_date DESC
        ) as rn,
        SUM(amount) OVER (
          PARTITION BY customer_id
        ) as total_spent
      FROM orders
      WHERE status = 'completed'
    )
    SELECT customer_id, order_date, amount, total_spent
    FROM ranked_orders
    WHERE rn = 1  -- tylko ostatnie zamówienie każdego klienta
    ORDER BY total_spent DESC
    LIMIT 10;

    Indeks i EXPLAIN ANALYZE

    -- Utwórz indeks częściowy (partial index)
    CREATE INDEX idx_orders_pending
    ON orders (created_at DESC)
    WHERE status = 'pending';  -- tylko dla pending zamówień
    
    -- Sprawdź plan zapytania
    EXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT)
    SELECT * FROM orders
    WHERE status = 'pending'
      AND created_at > NOW() - INTERVAL '7 days';
    
    -- Indeks GIN dla JSONB
    CREATE INDEX idx_products_attrs
    ON products USING GIN (attributes);
    
    -- Zapytanie po JSONB
    SELECT * FROM products
    WHERE attributes @> '{"color": "red", "size": "XL"}'::jsonb;

    Partitioning (dla dużych tabel)

    -- Tabela partycjonowana po dacie
    CREATE TABLE events (
      id BIGSERIAL,
      user_id INTEGER,
      event_type TEXT,
      created_at TIMESTAMP DEFAULT NOW()
    ) PARTITION BY RANGE (created_at);
    
    -- Utwórz partycje per miesiąc
    CREATE TABLE events_2024_01
      PARTITION OF events
      FOR VALUES FROM ('2024-01-01') TO ('2024-02-01');
    
    CREATE TABLE events_2024_02
      PARTITION OF events
      FOR VALUES FROM ('2024-02-01') TO ('2024-03-01');

    Kluczowe rozszerzenia PostgreSQL

    PostGIS

    Wsparcie dla danych geospatialnych — geometry, geography, spatial queries. Standard dla GIS w PostgreSQL.

    pgvector

    Wektory i similarity search dla AI/ML — przechowuj embeddings, szukaj najbliższych sąsiadów (ANN).

    TimescaleDB

    Optymalizacja dla time-series data — automatyczne chunking, compression, continuous aggregates.

    pg_trgm

    Trigram similarity dla fuzzy string matching i full-text search z LIKE/ILIKE na indeksach GIN/GiST.

    uuid-ossp

    Generowanie UUID v1/v4. Alternatywa: gen_random_uuid() wbudowana od PostgreSQL 13.

    pg_cron

    Cron-like scheduler wewnątrz PostgreSQL — uruchamiaj SQL co godzinę, dzień, tydzień.

    FAQ — PostgreSQL

    Co to jest PostgreSQL?

    PostgreSQL (Postgres) to zaawansowana, open-source'owa relacyjna baza danych obiektowo-relacyjna (ORDBMS). Rozwijana od 1986 roku na Uniwersytecie Berkeley jako POSTGRES, od 1996 roku jako PostgreSQL. Znana z niezawodności, rozszerzalności i zgodności ze standardami SQL. Obsługuje zaawansowane funkcje: JSONB (dokumenty), pełnotekstowe wyszukiwanie (FTS), tablice, typy geometryczne, dziedziczenie tabel, procedury składowane (PL/pgSQL, Python, JavaScript), widoki zmaterializowane i rozszerzenia (PostGIS, TimescaleDB, pgvector).

    Czym PostgreSQL różni się od MySQL?

    PostgreSQL vs MySQL: PostgreSQL jest bardziej zgodny ze standardem SQL, obsługuje bardziej zaawansowane typy danych (JSONB, arrays, range types, custom types), lepsze wsparcie dla concurrent write (MVCC), zaawansowane indeksy (GiST, GIN, BRIN, partial, expression indexes). MySQL jest szybszy przy prostych odczytach (MyISAM), łatwiej skonfigurować, szeroko używany w LAMP stack (WordPress, Drupal). PostgreSQL preferowany w aplikacjach wymagających złożonych zapytań, transakcji i zaawansowanych typów danych.

    Co to jest MVCC w PostgreSQL?

    MVCC (Multi-Version Concurrency Control) to mechanizm kontroli współbieżności PostgreSQL. Zamiast blokować wiersze podczas odczytu — każda transakcja widzi 'snapshot' danych z momentu jej rozpoczęcia. Operacje SELECT nie blokują UPDATE/DELETE i odwrotnie — readers don't block writers. MVCC zapewnia izolację transakcji (domyślnie Read Committed, opcjonalnie Repeatable Read lub Serializable) bez kosztownych blokad. Skutkiem ubocznym są 'dead tuples' — stare wersje wierszy usuwane przez VACUUM.

    Jak PostgreSQL obsługuje JSON?

    PostgreSQL oferuje dwa typy JSON: JSON (przechowuje jako tekst, waliduje składnię) i JSONB (Binary JSON — przechowuje binarnie, indeksowalny, szybsze operacje). JSONB obsługuje operatory: -> (pobierz klucz), ->> (pobierz wartość jako tekst), @> (zawiera), <@ (jest zawarty), ? (klucz istnieje). Indeksy GIN na JSONB umożliwiają efektywne wyszukiwanie po zawartości dokumentów. PostgreSQL z JSONB łączy elastyczność NoSQL z niezawodnością ACID transakcji SQL.

    Jakie są kluczowe optymalizacje PostgreSQL?

    Optymalizacja PostgreSQL: indeksy (B-tree domyślnie, GIN dla FTS/JSONB, GiST dla geometrii, BRIN dla dużych tabel z sekwencyjnymi danymi, partial indexes dla podzbioru wierszy), EXPLAIN ANALYZE do analizy planów zapytań, connection pooling (PgBouncer — 1000+ połączeń do 20 pooled), vacuuming (autovacuum usuwa dead tuples), partitioning (Range, List, Hash dla bardzo dużych tabel), widoki zmaterializowane dla ciężkich zapytań read-heavy, read replicas dla odczytu.

    Czytaj dalej

    Powiązane artykuły

    Kontakt

    Skontaktuj się z nami

    Porozmawiajmy o Twoim projekcie. Bezpłatna wycena w ciągu 24 godzin.

    Wyślij zapytanie

    Bezpłatna wycena w 24h
    Bez zobowiązań
    Indywidualne podejście
    Ekspresowa realizacja

    Telefon

    +48 790 814 814

    Pon-Pt: 9:00 - 18:00

    Email

    adam@fotz.pl

    Odpowiadamy w ciągu 24h

    Adres

    Plac Wolności 16

    61-739 Poznań

    Godziny pracy

    Pon - Pt9:00 - 18:00
    Sob - NdzZamknięte

    Wolisz porozmawiać?

    Zadzwoń teraz i porozmawiaj z naszym specjalistą o Twoim projekcie.

    Zadzwoń teraz