Modül dersleri (2/4)
Çoklu ve tablo düzeyinde kısıtlamalar
Veritabanındaki verilerin en temel katmanda ("veri bütünlüğü") doğru olmasını sağlamak esastır. Güvenliği yalnızca Node.js uygulamasına yazarsanız hatalar veritabanında tutarsız verilere neden olabilir. DDL seviyesindeki kısıtlamalar, aşılamaz son savunma hattıdır.
Ana kısıtlamalar
PRIMARY KEY (bir sütunu benzersiz kılar ve NULL DEĞİLDİR) ve klasik NOT NULL ve UNIQUE'ye ek olarak, verilerin mantıksal tutarlılığı için iki temel kategori vardır:
1. YABANCI ANAHTAR (Referans Bütünlüğü)
Bir REFERENCES kısıtlaması, işaret ettiği "ana" tabloda bir bağlantı kimliğinin gerçekten var olmasını sağlar.
Örneğin, bir siparişin mevcut bir müşteriye bağlanması gerekir.
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
customer_id INTEGER REFERENCES customers(id)
);Yabancı Anahtar ne işe yarar?
customersiçinde bulunmayan bircustomer_ideklemenizi engeller.- Bir müşteriyi
customers'den kendisine yönlendiren siparişler varsaDELETE(silmenizi) engeller ("yetim" kayıtlara karşı korur).
Ayrıca "ebeveyn" silindiğinde ne olacağına da karar verebiliriz:
customer_id INTEGER REFERENCES customers(id) ON DELETE CASCADEON DELETE CASCADE ile müşteriyi silersek, Postgres otomatik olarak tüm bağlantılı orders'ları kaldıracaktır! (Çok dikkatli kullanın; normalde işlemi engelleyen varsayılan ayar tercih edilir.)
2. Kısıtlamaları Kontrol Edin
Bir CHECK kısıtlaması, kaydetmeye devam etmeden önce bir boole ifadesini test ederek satırı doğrular.
CREATE TABLE contratti (
id SERIAL PRIMARY KEY,
stipendio NUMERIC(10,2) CHECK (stipendio > 0),
data_inizio DATE,
data_fine DATE,
CHECK (data_fine > data_inizio)
);İlk CHECK bir sütun kısıtlamasıdır (yalnızca stipendio anlamına gelir).
Alttaki ikinci CHECK bir tablo kısıtlamasıdır (birden fazla sütundaki değerleri çaprazlayabilir ve altta bildirilmelidir).
Bir INSERT veya UPDATE başlangıçtan önce sonu kaydetmeye çalışırsa Postgres bunu bir hatayla reddedecektir!
Kısıtlamaları Adlandırma
Kısıtlamalara açık bir ad vermek (CONSTRAINT anahtar sözcüğünü kullanarak) genellikle iyi bir uygulamadır. Bu şekilde, Postgres bir kaydı engellediğinde, hata size örneğin "kısıtlama 'stipendio_positivo' ihlal edildi" bilgisini verecektir; bu, hata ayıklama için çok daha açıktır!
CREATE TABLE prodotti (
id SERIAL PRIMARY KEY,
nome VARCHAR(50),
CONSTRAINT nome_univoco UNIQUE(nome)
);Deneyin
Kimliği (SERIAL PRIMARY KEY) ve 'customer_id' (INTEGER) ile bir 'prenotazioni' tablosu oluşturun. Yabancı Anahtar kısıtlamasına açık bir ad vermek için CONSTRAINT fk_cliente FOREIGN KEY (customer_id) REFERENCES customer(id) öğesini kullanın. Bunu bir tablo kısıtlaması olarak altta yapın.
İpucu göster
CONSTRAINT fk_cliente YABANCI ANAHTAR (local_column) REFERANSLAR external_table(external_colum) yazın
3 denemeden sonra çözüm mevcut
Özel mantıkla kısıtlamalar
Kimliği (SERIAL PRIMARY KEY), posti_totali (INTEGER) ve biglietti_venduti (INTEGER) ile bir 'eventi' tablosu oluşturun. 'check_capienza' adında bir tablo kısıtlaması ekleyin; burada biglietti_venduti asla posti_totali'den büyük olmamalıdır.
İpucu göster
CONSTRAINT check_capienza CHECK (ifade) kullanarak kısıtlamayı aşağıya ekleyin
3 denemeden sonra çözüm mevcut