মডিউল পাঠ (2/4)
একাধিক এবং টেবিল-স্তরের সীমাবদ্ধতা
ডাটাবেসের ডেটা সবচেয়ে মৌলিক স্তরে ("ডেটা ইন্টিগ্রিটি") সঠিক কিনা তা নিশ্চিত করা মৌলিক। আপনি যদি শুধুমাত্র Node.js অ্যাপ্লিকেশনে নিরাপত্তা লেখেন, বাগগুলি DB-তে অসামঞ্জস্যপূর্ণ ডেটা সৃষ্টি করতে পারে। ডিডিএল স্তরে সীমাবদ্ধতা হল প্রতিরক্ষার শেষ, দুর্ভেদ্য লাইন।
প্রধান সীমাবদ্ধতা
PRIMARY KEY (যা একটি কলামকে অনন্য করে তোলে এবং NULL নয়) এবং ক্লাসিক NOT NULL এবং UNIQUE ছাড়াও, ডেটার যৌক্তিক সামঞ্জস্যের জন্য দুটি মৌলিক বিভাগ রয়েছে:
1. ফরেন কী (রেফারেন্সিয়াল ইন্টিগ্রিটি)
একটি REFERENCES সীমাবদ্ধতা নিশ্চিত করে যে একটি লিঙ্কিং আইডি সত্যিই "অভিভাবক" টেবিলে বিদ্যমান রয়েছে যা এটি নির্দেশ করে৷
উদাহরণস্বরূপ, একটি অর্ডার অবশ্যই একটি বিদ্যমান গ্রাহকের সাথে লিঙ্ক করা উচিত।
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
customer_id INTEGER REFERENCES customers(id)
);বিদেশী কী কী করে?
- এটি আপনাকে একটি
customer_idসন্নিবেশ করাতে বাধা দেয় যাcustomersএ বিদ্যমান নেই৷ - এটি আপনাকে
customersথেকে একজন গ্রাহককেDELETE(মুছে ফেলা) থেকে বাধা দেয় যদি তাদের নির্দেশ করে আদেশ থাকে (এটি "অনাথ" রেকর্ড থেকে রক্ষা করে)।
"অভিভাবক" মুছে ফেলা হলে কী ঘটবে তাও আমরা সিদ্ধান্ত নিতে পারি:
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 কীওয়ার্ড ব্যবহার করে)। এইভাবে, যখন Postgres একটি রেকর্ড ব্লক করে, ত্রুটিটি আপনাকে বলবে উদাহরণস্বরূপ "সীমাবদ্ধতা 'stipendio_positivo' লঙ্ঘন করা হয়েছে", যা ডিবাগিংয়ের জন্য অনেক বেশি পরিষ্কার!
CREATE TABLE prodotti (
id SERIAL PRIMARY KEY,
nome VARCHAR(50),
CONSTRAINT nome_univoco UNIQUE(nome)
);চেষ্টা করে দেখুন
আইডি (সিরিয়াল প্রাইমারি কী) এবং একটি 'গ্রাহক_আইডি' (INTEGER) সহ একটি 'প্রিনোটাজিওনি' টেবিল তৈরি করুন। বিদেশী কী সীমাবদ্ধতার একটি সুস্পষ্ট নাম দিতে CONSTTRAINT fk_cliente FOREIGN KEY (customer_id) রেফারেন্স গ্রাহকদের(id) ব্যবহার করুন। টেবিলের সীমাবদ্ধতা হিসাবে নীচে এটি করুন।
ইঙ্গিত দেখান
সীমাবদ্ধতা লিখুন fk_cliente FOREIGN KEY (local_column) রেফারেন্স external_table(external_col)
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
কাস্টম যুক্তি সঙ্গে সীমাবদ্ধতা
আইডি (সিরিয়াল প্রাইমারি কী), পোস্টি_টোটালি (ইন্টেগার) এবং বিগলিটি_ভেন্দুটি (ইন্টেগার) সহ একটি 'ইভেন্ট' টেবিল তৈরি করুন। 'check_capienza' নামের একটি টেবিল সীমাবদ্ধতা যোগ করুন যেখানে biglietti_venduti কখনই posti_totali এর চেয়ে বড় হতে হবে না।
ইঙ্গিত দেখান
CONSTRAINT check_capienza চেক ( অভিব্যক্তি ) ব্যবহার করে নীচে সীমাবদ্ধতা যোগ করুন
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ