Foreign key — bir jadvaldagi ustun yoki ustunlar qiymatini boshqa jadvalning primary key yoki unique key qiymati bilan bog‘laydigan constraintdir. U relatsion ma’lumotlar bazasida referential integrityni saqlaydi: bog‘lanayotgan ota yozuv mavjud bo‘lmasa, bola jadvalga noto‘g‘ri havola kiritilishiga yo‘l qo‘ymaydi.
Bog‘lanish tuzilishi
Maqola muallifga tegishli bo‘lgan sxema quyidagicha ifodalanishi mumkin:
CREATE TABLE articles (
id BIGINT PRIMARY KEY,
author_id BIGINT NOT NULL,
title VARCHAR(200) NOT NULL,
CONSTRAINT fk_article_author
FOREIGN KEY (author_id) REFERENCES users(id)
);
articles.author_id bola tomondagi foreign key, users.id esa referenced keydir. NOT NULL har maqolada muallif bo‘lishini talab qiladi. NULL ruxsat etilsa, bog‘lanish ixtiyoriy bo‘lishi mumkin; NULL hech qanday ota yozuvga murojaat qilmaydi.
O‘chirish va yangilash siyosati
Ota qator o‘chirilganda foreign key action natijani belgilaydi. RESTRICT yoki NO ACTION bog‘liq bola yozuvlar mavjud bo‘lsa o‘chirishni rad etadi. CASCADE bolalarni ham o‘chiradi. SET NULL havolani NULLga, SET DEFAULT esa default qiymatga o‘tkazadi, agar schema bunga ruxsat bersa.
Cascade qulay, lekin bir qatorni o‘chirish katta daraxt bo‘ylab ko‘p ma’lumotni yo‘qotishi mumkin. Siyosat texnik qulaylik emas, domen hayot sikliga mos tanlanadi. Audit ma’lumotlari ota obyekt o‘chirilganda ham saqlanishi kerak bo‘lsa, hard delete o‘rniga status yoki soft delete ishlatilishi mumkin.
Composite foreign key
Referenced key bir nechta ustundan iborat bo‘lsa, foreign key ham ayni ustunlar soni va mos turlarga ega bo‘ladi. Ustunlar tartibi muhim. Masalan, tenant bilan ajratilgan tizimda (tenant_id, object_id) kombinatsiyasi boshqa tenant obyektiga tasodifiy havolani cheklaydi.
Indeks va ishlash
Database referenced primary yoki unique keyni indekslaydi. Bola tomondagi foreign key ustuni esa barcha tizimda avtomatik indekslanmasligi mumkin. Ota qatorni o‘chirish yoki update qilishda database bog‘liq bolalarni topishi kerak; indeks bo‘lmasa katta jadval to‘liq skan qilinadi.
Foreign key yozish vaqtida qo‘shimcha tekshiruv va lock talab qiladi, ammo ma’lumot buzilishini database darajasida oldini oladi. Constraintni faqat “tezlik uchun” olib tashlash barcha ilova, script va import yo‘llariga integrity vazifasini yuklaydi.
Tranzaksiya va kechiktirilgan tekshiruv
Ayrim database tizimlari deferrable constraintni tranzaksiya oxirida tekshirishi mumkin. Bu o‘zaro bog‘liq yozuvlarni vaqtincha oraliq holatda kiritishga imkon beradi. Immediate constraint esa har statementdan keyin tekshiriladi. Aniq xatti-harakat database engine va constraint sozlamasiga bog‘liq.
Mavjud iflos ma’lumotga foreign key qo‘shishdan oldin orphan yozuvlar topiladi va tuzatiladi. Katta jadvalda constraint validation uzoq ishlashi yoki lock olishi mumkin; migration jarayoni ishlab chiqarish yukiga mos rejalashtiriladi.
Orphan yozuvlar
Foreign key mavjud bo‘lmagan yoki vaqtincha o‘chirilgan tizimda ota yozuvi yo‘q bola qator orphan deb ataladi. Bunday holat join natijasida ma’lumotning yo‘qolishi, hisobning noto‘g‘ri chiqishi va delete jarayonining buzilishiga olib keladi. Audit query left join orqali mos parent topilmagan keylarni aniqlaydi. Taqsimlangan xizmatlar orasida database foreign key qo‘yib bo‘lmasa, referential integrity application workflow, event reconciliation va periodic checker bilan boshqariladi. Bu tekshiruv transaction ichidagi constraintdek darhol kafolat bermaydi; eventual consistency oynasi va tuzatish siyosati hujjatlashtiriladi.
Bog‘liq tushunchalar
primary key, referential integrity, constraint, cascade delete, composite key, index, transaction