मॉड्यूल पाठ (2/4)
एकाधिक और तालिका-स्तरीय बाधाएँ
यह सुनिश्चित करना कि डेटाबेस में डेटा सबसे बुनियादी स्तर ("डेटा अखंडता") पर सही है, मौलिक है। यदि आप केवल Node.js एप्लिकेशन में सुरक्षा लिखते हैं, तो बग DB में असंगत डेटा का कारण बन सकते हैं। डीडीएल स्तर पर बाधाएं रक्षा की अंतिम, अभेद्य रेखा हैं।
मुख्य बाधाएँ
PRIMARY KEY (जो एक कॉलम को अद्वितीय बनाता है और शून्य नहीं) और क्लासिक NOT NULL और UNIQUE के अलावा, डेटा की तार्किक स्थिरता के लिए दो मूलभूत श्रेणियां हैं:
1. विदेशी कुंजी (संदर्भात्मक अखंडता)
एक REFERENCES बाधा यह सुनिश्चित करती है कि एक लिंकिंग आईडी वास्तव में "मूल" तालिका में मौजूद है जिसे वह इंगित करता है।
उदाहरण के लिए, एक ऑर्डर किसी मौजूदा ग्राहक से जुड़ा होना चाहिए।
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
customer_id INTEGER REFERENCES customers(id)
);विदेशी कुंजी क्या करती है?
- यह आपको
customer_idडालने से रोकता है जोcustomersमें मौजूद नहीं है। - यह आपको
DELETEसे किसी ग्राहक कोcustomersसे हटाने (हटाने) से रोकता है यदि उन्हें इंगित करने वाले आदेश हैं (यह "अनाथ" रिकॉर्ड से बचाता है)।
हम यह भी तय कर सकते हैं कि "पैरेंट" हटा दिए जाने पर क्या होना चाहिए:
customer_id INTEGER REFERENCES customers(id) ON DELETE CASCADEON DELETE CASCADE के साथ, यदि हम ग्राहक को हटाते हैं, तो Postgres स्वचालित रूप से सभी लिंक किए गए orders को हटा देगा! (बहुत सावधानी से उपयोग करें; आम तौर पर ऑपरेशन को अवरुद्ध करने वाली डिफ़ॉल्ट सेटिंग बेहतर होती है।)
2. बाधाओं की जाँच करें
एक CHECK बाधा सहेजने के लिए आगे बढ़ने से पहले एक बूलियन अभिव्यक्ति का परीक्षण करके पंक्ति को मान्य करती है।
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)
);पहला CHECK एक कॉलम बाधा है (यह केवल stipendio को संदर्भित करता है)।
नीचे दूसरा CHECK एक टेबल बाधा है (यह एकाधिक कॉलम से मानों को पार कर सकता है, और इसे नीचे घोषित किया जाना चाहिए)।
यदि कोई INSERT या UPDATE प्रारंभ से पहले अंत को सहेजने का प्रयास करता है, तो पोस्टग्रेज़ इसे एक त्रुटि के साथ अस्वीकार कर देगा!
नामकरण बाधाएँ
बाधाओं को एक स्पष्ट नाम देना अक्सर अच्छा अभ्यास होता है (CONSTRAINT कीवर्ड का उपयोग करके)। इस तरह, जब पोस्टग्रेज़ किसी रिकॉर्ड को ब्लॉक करता है, तो त्रुटि आपको बताएगी उदाहरण के लिए "बाधा 'stipendio_positivo' का उल्लंघन हुआ", जो डिबगिंग के लिए बहुत स्पष्ट है!
CREATE TABLE prodotti (
id SERIAL PRIMARY KEY,
nome VARCHAR(50),
CONSTRAINT nome_univoco UNIQUE(nome)
);इसे अजमाएं
आईडी (सीरियल प्राइमरी कुंजी) और एक 'कस्टमर_आईडी' (इंटेगर) के साथ एक 'प्रीनोटाजियोनी' तालिका बनाएं। विदेशी कुंजी बाधा को स्पष्ट नाम देने के लिए CONSTRAINT fk_cliente FOREIGN KEY (ग्राहक_आईडी) संदर्भ ग्राहक (आईडी) का उपयोग करें। इसे टेबल बाधा के रूप में सबसे नीचे करें।
संकेत दिखाएँ
CONSTRAINT fk_cliente FOREIGN KEY (स्थानीय_कॉलम) संदर्भ बाहरी_टेबल (बाहरी_कॉल) लिखें
3 प्रयासों के बाद समाधान उपलब्ध है
कस्टम तर्क के साथ बाधाएँ
आईडी (सीरियल प्राथमिक कुंजी), पोस्टी_टोटाली (इंटेगर) और बिगलीटी_वेंडुटी (इंटेगर) के साथ एक 'इवेंटी' तालिका बनाएं। 'check_capienza' नामक एक तालिका बाधा जोड़ें जहां biglietti_venduti कभी भी posti_totali से बड़ी नहीं होनी चाहिए।
संकेत दिखाएँ
CONSTRAINT check_capienza CHECK (अभिव्यक्ति) का उपयोग करके नीचे बाधा जोड़ें
3 प्रयासों के बाद समाधान उपलब्ध है