Modulelessen (1/4)
Geavanceerde gegevenstypen en ENUM's
In de vorige les hebben we het basiscommando CREATE TABLE gezien. Laten we nu enkele geavanceerde gegevenstypen verkennen die PostgreSQL biedt om onze domeinen op een nauwkeurigere en veiligere manier te modelleren.
Numerieke en teksttypen
PostgreSQL heeft verschillende typen voor getallen en tekst. Het kiezen van de juiste helpt zowel bij de validatie als bij de opslagruimte.
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
);TEXTversusVARCHAR(n): in Postgres zijn de prestaties identiek. U gebruiktVARCHAR(n)alleen als u de ingevoegde lengte op databaseniveau expliciet wilt beperken.NUMERIC(10, 2): Perfect voor geld of rekenkundige precisie. Hier zijn maximaal 8 gehele cijfers en 2 decimalen toegestaan (10 in totaal). Als je10.555invoegt, rondt Postgres dit af naar10.56.
Het UUID-type
Voor veilige ID's die op internet worden weergegeven (zoals openbare ID's in URL's), wordt vaak de voorkeur gegeven aan UUID boven de klassieke verhoging van SERIAL.
CREATE TABLE public_orders (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
customer TEXT NOT NULL,
total NUMERIC(10, 2)
);ENUM (opsommingen)
Vaak moet een kolom slechts één van een paar vooraf gedefinieerde waarden bevatten (bijvoorbeeld bestelstatus: "nieuw", "betaald", "verzonden"). Eén benadering is het gebruik van het trefwoord CHECK, maar PostgreSQL biedt aangepaste ENUM-typen.
-- 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'
);Dit garandeert dat niemand ooit een ongeldige status kan invoeren, waardoor de gegevensconsistentie wordt beschermd.
Probeer het
Maak een 'user_reviews'-tabel met: id (SERIAL pk), test_id (UUID met standaard gen_random_uuid()), score (geheel getal, niet nul) en inhoud (TEXT). Voor geen van de andere velden zijn expliciete beperkingen nodig die verder gaan dan het type.
Toon hint
Schrijf CREATE TABLE user_reviews (...) en vervolgens de verschillende velden. Onthoud de komma's.
Oplossing beschikbaar na 3 pogingen
Oefening beoordelen
Maak eerst het ENUM-type 'user_role' aan met de waarden 'admin' en 'user'. Maak vervolgens de tabel 'enum_users' met id (SERIAL pk) en rol (het type dat u zojuist hebt gemaakt, NIET NULL).
Toon hint
Vergeet de ; om de twee instructies (het CREATE TYPE en de CREATE TABLE) van elkaar te scheiden.
Oplossing beschikbaar na 3 pogingen