Constraint — ma’lumotlar bazasida table yoki column qiymatlariga qo‘yiladigan va ma’lumot yaxlitligini himoya qiladigan qoida. Constraint noto‘g‘ri row yozilishini database darajasida rad etadi.
Application validation foydalanuvchiga qulay xabar beradi. Database constraint esa parallel request, import script, administrator va boshqa clientlardan keladigan barcha yozuvlarga bir xil invariantni qo‘llaydi.
NOT NULL
NOT NULL column qiymati bo‘sh bo‘lishini taqiqlaydi.
name VARCHAR(200) NOT NULL
Bu empty stringni taqiqlamaydi.
Agar business qoida bo‘yicha bo‘sh matn ham yaroqsiz bo‘lsa qo‘shimcha check yoki application validation kerak.
UNIQUE
Unique constraint bir yoki bir nechta column kombinatsiyasining takrorlanishini taqiqlaydi.
UNIQUE (email)
Composite misol:
UNIQUE (user_id, role_id)
Bu ayni role bir userga ikki marta biriktirilishini to‘xtatadi.
NULL qiymatining unique semantikasi database’ga bog‘liq.
PRIMARY KEY
Primary key har rowni yagona aniqlaydi.
U odatda:
- unique;
- not null;
- reference target;
- row identity
vazifalarini birlashtiradi.
Table’da bitta primary key bo‘ladi, ammo u bir nechta columndan tashkil topishi mumkin.
FOREIGN KEY
Foreign key child table qiymati parent table’dagi mavjud keyga tegishli bo‘lishini talab qiladi.
FOREIGN KEY (user_id)
REFERENCES users(id)
Bu orphan recordlarni kamaytiradi.
Parent row update yoki delete bo‘lganda action belgilanadi.
Referential action
Parent row o‘zgarganda foreign key quyidagi siyosatlardan foydalanishi mumkin:
CASCADE qulay, ammo katta relationship tree’da ko‘p rowni tasodifan o‘chirishi mumkin.
Business lifecycle bilan mos policy tanlanadi.
CHECK
Check constraint row qiymati mantiqiy ifodaga mos bo‘lishini talab qiladi.
CHECK (price >= 0)
Yoki:
CHECK (end_at IS NULL OR end_at >= start_at)
Check ko‘pincha ayni row fieldlari bilan ishlaydi.
Cross-table invariant uchun boshqa mexanizm kerak bo‘lishi mumkin.
DEFAULT constraint
Default qiymat column berilmagan holatda ishlatiladi.
status VARCHAR(20) DEFAULT 'pending'
Explicit NULL yuborilsa default ishlashi yoki ishlamasligi database semantikasiga bog‘liq.
Vaqt defaulti server timezone va transaction timestamp qoidalariga ega.
Exclusion constraint
Ayrim database’lar ikki row ma’lum operatorlar bo‘yicha bir vaqtda mos kelishini taqiqlaydigan constraint beradi.
Masalan, bir xona uchun vaqt intervali ustma-ust kelmasligi.
Bu oddiy unique constraintdan kuchliroq.
Index access method bilan ishlashi mumkin.
Candidate key
Primary keydan tashqari rowni yagona aniqlaydigan fieldlar candidate key hisoblanadi.
Masalan:
Primary key bitta tanlov, qolganlari unique constraint bilan saqlanadi.
Natural va surrogate key
Natural key business ma’noga ega:
country_code
email
product_sku
Surrogate key sun’iy ID:
BIGINT
UUID
Surrogate key relationshipni soddalashtiradi, ammo natural business uniqueness uchun alohida constraint baribir kerak.
Deferrable constraint
Constraint statement oxirida emas, transaction commitida tekshirilishi mumkin.
Bu deferred constraint.
Masalan, ikki row o‘rtasida unique qiymatlarni almashtirishda transaction ichida vaqtinchalik conflict bo‘lishi mumkin.
Commit oldidan yakuniy holat valid bo‘lishi kerak.
Validation vaqtini boshqarish
Katta existing table’ga yangi constraint qo‘shish barcha rowlarni tekshirishi va uzoq lock yaratishi mumkin.
Ayrim database’larda constraint avval yangi yozuvlar uchun qo‘shilib, tarixiy data keyin alohida validate qilinadi.
Bu online migrationni yengillashtiradi.
Constraint nomi
Constraintga aniq nom beriladi:
uq_users_email
fk_orders_user
ck_products_price_nonnegative
Xato message va migrationlarda qaysi qoida buzilgani tushunarli bo‘ladi.
Avtomatik nomlar environmentlar orasida farq qilishi mumkin.
Constraint va index
Primary key va unique constraint ko‘pincha unique index orqali amalga oshiriladi.
Lekin index va constraint semantik jihatdan bir xil emas.
Constraint data invariantni ifodalaydi.
Index query performance va access structure’ni ifodalaydi.
Parallel request
Application avval:
email mavjudmi
deb tekshirib, keyin insert qilsa ikki parallel request ikkalasi ham “mavjud emas” natijasini olishi mumkin.
Unique constraint ikkinchi insertni database darajasida rad etadi.
Application constraint xatosini domain conflictga aylantiradi.
Constraint xatosi
Clientga raw database error yoki ichki table nomi chiqarilmaydi.
Application constraint nomi yoki error code orqali:
- duplicate email;
- parent topilmadi;
- invalid range;
- required field
kabi tushunarli javob beradi.
Migration
Constraint qo‘shishdan oldin existing data tekshiriladi.
Jarayon:
- invalid rowlarni topish;
- data’ni tuzatish;
- constraint qo‘shish;
- validation;
- application kodini soddalashtirish.
Constraintni olib tashlash barcha consumer va business invariantga ta’sir qiladi.
Domain type
Bir xil qoida ko‘p table’da takrorlansa custom domain yoki reusable type orqali markazlashtirilishi mumkin.
Masalan, musbat pul qiymati yoki standartlashtirilgan kod.
Aniq imkoniyat database’ga bog‘liq.
Constraint va import
Bulk importda constraintlarni o‘chirib yuborish tezlikni oshirishi mumkin, ammo noto‘g‘ri data kirish xavfi tug‘iladi.
Xavfsizroq jarayon staging table, validation va keyin targetga transactionli load qilishdan iborat.
Bog‘liq tushunchalar
Data integrity, Primary key, Foreign key, Unique constraint, Check constraint, NOT NULL, Referential integrity, Candidate key, Database schema