Ana içeriğe geç
Modül 9 · Ders 1 ders 4Kurstaki 33/57~10 min
Modül dersleri (1/4)

Gelişmiş veri türleri ve ENUM'lar

Önceki derste temel CREATE TABLE komutunu gördük. Şimdi PostgreSQL'in etki alanlarımızı daha kesin ve güvenli bir şekilde modellemek için sunduğu bazı gelişmiş veri türlerini inceleyelim.

Sayısal ve metin türleri

PostgreSQL'in sayı ve metin için çeşitli türleri vardır. Doğru olanı seçmek hem doğrulama hem de depolama alanı açısından yardımcı olur.

SQL
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
);
  • TEXT vs VARCHAR(n): Postgres'te performans aynıdır. VARCHAR(n) yalnızca eklenen uzunluğu veritabanı düzeyinde açıkça sınırlamak istediğinizde kullanırsınız.
  • NUMERIC(10, 2): Para veya aritmetik hassasiyet için mükemmeldir. Burada en fazla 8 tam sayı rakamına ve 2 ondalık rakama (toplamda 10) izin verilir. 10.555 eklerseniz Postgres bunu 10.56 değerine yuvarlar.

UUID türü

Web'de gösterilen güvenli tanımlayıcılar için (URL'lerdeki genel kimlikler gibi), klasik SERIAL artışına göre genellikle UUID tercih edilir.

SQL
CREATE TABLE public_orders (
  id          UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  customer    TEXT NOT NULL,
  total       NUMERIC(10, 2)
);

ENUM (Numaralandırmalar)

Genellikle bir sütunun önceden tanımlanmış birkaç değerden yalnızca birini içermesi gerekir (ör. sipariş durumu: "yeni", "ödedi", "gönderildi"). Bir yaklaşım CHECK anahtar sözcüğünü kullanmaktır, ancak PostgreSQL özel ENUM türleri sunar.

SQL
-- 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'
);

Bu, hiç kimsenin geçersiz bir durum ekleyememesini garanti ederek veri tutarlılığını korur.

Deneyin

Egzersiz#sql.m9.l1.e1
Denemeler: 0Yükleniyor…

Şunları içeren bir 'user_reviews' tablosu oluşturun: id (SERIAL pk), test_id (varsayılan gen_random_uuid() ile UUID), puan (tamsayı boş değil) ve içerik (TEXT). Diğer alanların hiçbiri türün ötesinde açık kısıtlamalara ihtiyaç duymaz.

Düzenleyici yükleniyor…
İpucu göster

CREATE TABLE user_reviews (...) ve ardından çeşitli alanları yazın. Virgülleri hatırla.

3 denemeden sonra çözüm mevcut

Alıştırmayı gözden geçirin

Egzersiz#sql.m9.l1.e2
Denemeler: 0Yükleniyor…

İlk önce 'admin' ve 'user' değerlerine sahip 'user_role' ENUM tipini oluşturun. Ardından kimliği (SERIAL pk) ve rolü (az önce oluşturduğunuz tür, NOT NULL) içeren 'enum_users' tablosunu oluşturun.

Düzenleyici yükleniyor…
İpucu göster

Şunu unutmayın; iki ifadeyi (CREATE TYPE ve CREATE TABLE) ayırmak için.

3 denemeden sonra çözüm mevcut