Lekcje modułu (1/4)
Zaawansowane typy danych i typy ENUM
W poprzedniej lekcji widzieliśmy podstawowe polecenie CREATE TABLE. Przyjrzyjmy się teraz niektórym zaawansowanym typom danych, które oferuje PostgreSQL, aby modelować nasze domeny w bardziej precyzyjny i bezpieczny sposób.
Typy numeryczne i tekstowe
PostgreSQL ma kilka typów liczb i tekstu. Wybór odpowiedniego pomaga zarówno w walidacji, jak i w przestrzeni dyskowej.
CREATE TABLE advanced_products (
id SERIAL PRIMARY KEY,
name VARCHAR(50) NOT NULL,
description TEXT,
-- NUMERIC(p,s) dove p = cifre totali, s = cifre decimali
price NUMERIC(10, 2) NOT NULL,
featured BOOLEAN DEFAULT FALSE
);TEXTvsVARCHAR(n): W Postgres wydajność jest identyczna. UżywaszVARCHAR(n)tylko wtedy, gdy chcesz jawnie ograniczyć wstawianą długość na poziomie bazy danych.NUMERIC(10, 2): Idealny do pomiaru pieniędzy lub precyzji arytmetycznej. Tutaj pozwala na maksymalnie 8 cyfr całkowitych i 2 miejsca po przecinku (w sumie 10). Jeśli wstawisz10.555, Postgres zaokrągli go do10.56.
Typ UUID
W przypadku bezpiecznych identyfikatorów udostępnianych w Internecie (takich jak identyfikatory publiczne w adresach URL) często preferowany jest UUID w porównaniu z klasycznym przyrostem SERIAL.
CREATE TABLE public_orders (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
customer TEXT NOT NULL,
total NUMERIC(10, 2)
);ENUM (Wyliczenia)
Często kolumna musi zawierać tylko jedną z kilku predefiniowanych wartości (np. status zamówienia: „nowe”, „zapłacone”, „wysłane”). Jednym z podejść jest użycie słowa kluczowego CHECK, ale PostgreSQL oferuje niestandardowe typy ENUM.
-- Dobbiamo prima creare il tipo:
CREATE TYPE order_status AS ENUM ('nuovo', 'pagato', 'spedito', 'cancellato');
-- Ora possiamo usarlo in una tabella:
CREATE TABLE orders_demo (
id SERIAL PRIMARY KEY,
status order_status NOT NULL DEFAULT 'nuovo'
);Gwarantuje to, że nikt nigdy nie będzie mógł wstawić nieprawidłowego statusu, chroniąc spójność danych.
Spróbuj
Utwórz tabelę „user_reviews” zawierającą: id (SERIAL pk), test_id (UUID z domyślnym gen_random_uuid()), wynik (liczba całkowita nie null) i treść (TEKST). Żadne z pozostałych pól nie wymaga wyraźnych ograniczeń poza typem.
Pokaż wskazówkę
Napisz CREATE TABLE user_reviews (...), a następnie różne pola. Pamiętaj o przecinkach.
Rozwiązanie dostępne po 3 próbach
Przejrzyj ćwiczenie
Najpierw utwórz typ ENUM „user_role” z wartościami „admin” i „user”. Następnie utwórz tabelę „enum_users” z identyfikatorem (SERIAL pk) i rolą (właśnie utworzony typ, NIE NULL).
Pokaż wskazówkę
Nie zapomnij o ; aby oddzielić dwie instrukcje (CREATE TYPE i CREATE TABLE).
Rozwiązanie dostępne po 3 próbach