Pelajaran modul (1/4)
Tipe data tingkat lanjut dan ENUM
Pada pelajaran sebelumnya kita melihat perintah dasar CREATE TABLE. Sekarang mari kita jelajahi beberapa tipe data tingkat lanjut yang ditawarkan PostgreSQL untuk memodelkan domain kita dengan cara yang lebih tepat dan aman.
Tipe numerik dan teks
PostgreSQL memiliki beberapa tipe untuk angka dan teks. Memilih yang tepat membantu validasi dan ruang penyimpanan.
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): Di Postgres, kinerjanya identik. Anda menggunakanVARCHAR(n)hanya ketika Anda ingin membatasi secara eksplisit panjang yang disisipkan di tingkat database.NUMERIC(10, 2): Sempurna untuk uang atau presisi aritmatika. Di sini diperbolehkan paling banyak 8 digit bilangan bulat dan 2 desimal (total 10). Jika Anda memasukkan10.555, Postgres membulatkannya menjadi10.56.
Tipe UUID
Untuk pengidentifikasi aman yang terekspos di web (seperti ID publik di URL), UUID sering kali lebih disukai daripada penambahan SERIAL klasik.
CREATE TABLE public_orders (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
customer TEXT NOT NULL,
total NUMERIC(10, 2)
);ENUM (Enumerasi)
Seringkali kolom harus berisi hanya satu dari beberapa nilai yang telah ditentukan (misalnya status pesanan: "baru", "dibayar", "dikirim"). Salah satu pendekatannya adalah dengan menggunakan kata kunci CHECK, tetapi PostgreSQL menawarkan jenis ENUM khusus.
-- 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'
);Hal ini menjamin bahwa tidak seorang pun dapat memasukkan status yang tidak valid, sehingga melindungi konsistensi data.
Cobalah
Buat tabel 'user_reviews' dengan: id (SERIAL pk), test_id (UUID dengan gen_random_uuid() default), score (integer bukan null), dan content (TEXT). Tidak ada bidang lain yang memerlukan batasan eksplisit di luar tipenya.
Tunjukkan petunjuk
Tulis CREATE TABLE user_reviews (...) dan kemudian berbagai bidang. Ingat koma.
Solusi tersedia setelah 3 upaya
Tinjau latihan
Pertama buat tipe ENUM 'user_role' dengan nilai 'admin' dan 'user'. Kemudian buat tabel 'enum_users' dengan id (SERIAL pk) dan role (tipe yang baru saja Anda buat, BUKAN NULL).
Tunjukkan petunjuk
Jangan lupa; untuk memisahkan dua pernyataan (CREATE TYPE dan CREATE TABLE).
Solusi tersedia setelah 3 upaya