Bosh sahifa Wiki Constraint

Constraint

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:

  • restrict;
  • no action;
  • cascade;
  • set null;
  • set default.

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:

  1. invalid rowlarni topish;
  2. data’ni tuzatish;
  3. constraint qo‘shish;
  4. validation;
  5. 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