DEV Community

Samandar Komilov
Samandar Komilov

Posted on

Database Dizaynda Kalitlar: Hamma Joyda Kalit! 🗝

🇺🇿 Database Dizayn desa miyaga eng birinchi nima keladi? Diagrammalar, bog'lamlar, jadvallar va hokazo shundaymi? Lekin menimcha kalitlar tasavvur qilinishi ham noto'g'ri bo'lmaydi. Chunki aynan kalitlar orqali biz database'da ma'lumotlarning yagonaligini ta'minlay olamiz.

Kalitlar

O'zi aslida Database Design nima va u bizga nimaga kerak?

Database dizayn bizga o'zi nimani xohlayotganini o'zi ham bilmagan klientning noaniq va o'ta abstrakt g'oyalarini bir qolipga solib, tartiblab, maqsadli va ishlatsa bo'ladigan bir model ko'rinishiga olib kelishga yordam beradi. Uning yordamida ma'lumotlar takrorlanishi, jadvallar o'rtasidagi ortiqcha bog'liqliklar, noaniqliklardan xalos bo'lish mumkin. Shuningdek to'g'ri dizayn qilingan database keyinchalik kengaytirilishi ham osonroq va muammosi kamroq bo'ladi.

🤔 Xo'sh yaxshi, xalq tushundi. Unda kalitlarni nima aloqasi bor?

Yaxshi savol. Yuqorida aytdik, database dizayn ma'lumotlar tartibli bo'lishi, yagonaligi, ortiqcha bog'liqliklar bo'lmasligi va hokazolarni ta'minlaydi dedik. Albatta database design bu general atama, demak bu ishlarni ichkarida kimlardir qilishi kerak. Va shu "ishchi"lardan biri bu kalitlardir.

Kalitlarning bir qancha turlari bor. Nomlari ingliz tilida "takoy" bo'lsa ham, o'zi uncha vahimali emas. Ba'zilarini o'zingiz bilmagan holda ishlatgansiz. Hozir shulardan 10 tasini (agar hammasi shu bo'lsa) ko'rib chiqamiz.

  1. Superkey
  2. Candidate Key
  3. Primary Key
  4. Alternate Key
  5. Unique Key
  6. Surrogate Key
  7. Natural Key
  8. Composite Key & Compound Key
  9. Foreign Key

⏳ Nega bunaqa g'alati tartib? Birinchi Primary va Foreignkeylar emasmi, eng osonlari shularku? Wait for it...)

1️⃣ Superkey

Super kalit kalitlar ichidagi eng katta to'plam. Ma'lumotlar jadvalidagi bitta qatorni bir to'plam deb hisoblasak, superkey uning barcha qism to'plamlaridan iborat to'plam, faqat bitta sharti bor. Har bir qism to'plam ushbu qatorni yagonaligini ta'minlashi kerak.

Superkey example 1

Bu jadvalda qaysi ustun qatorlarning yagonaligini ta'minlaydi? Albatta id ustuni. Qiziq, faqat shu ustunmikin..?

Superkey 1: {id}
Superkey 2: {id, email}
Superkey 3: {id, Phone}
Superkey 4: {id, email, name}
Superkey 5: {id, email, phone, name}
Superkey 6: {email, phone}
Enter fullscreen mode Exit fullscreen mode

Yo'q! Qatorni yagonaligini ta'minlay oladigan barcha to'plamlar superkey bo'lishi mumkin. Xususan, id qatnashgan barcha to'plamlar aniq superkey bo'la oladi, chunki id ni o'zi bir superkey.

Shuningdek, email va phone juftligi ham uniqueness berishi mumkin (O'ylab ko'ringchi nega?). Lekin e'tibor beraylik, masalan {email, name} qism to'plami superkey bo'la olmaydi, sababi xuddi shu email va name bilan boshqa odam bo'lishi mumkin (aslida yemay qoldi example, juda bo'lmasa email o'rniga country deb tasavvur qiling).

2️⃣ Candidate Key

Nomzod kalit - sodda aytganda eng minimal superkey. Superkeylar to'plamlari ichidagi eng kichik qism to'plam. Bizning yuqoridagi holatda {id} bir vaqtda superkey hamda candidate key, chunki u eng minimal superkey. Lekin {id, email} candidate key emas, sababi unda bitta redundant ustun mavjud. Ammo agar {email} ustuni yagonaligi ta'minlansa, rostdan ham emaillar takrorlanmas bo'lsa, bu qism to'plam ham candidate key bo'lishi mumkin.

3️⃣ Primary Key

Database dizayner bir vaqtning o'zida superkey va candidate key bo'lgan qism to'plamlar (ustunlar) orasidan eng mos va qulay birini tanlaydi va u asosiy kalit bo'ladi. Asosiy kalit bo'lish shartlari:

  • qatorning yagonaligini ta'minlay olishi
  • NOT NULL bo'lishi
  • har bir jadvalda faqatgina bitta Primary Key bo'lishi

Asosiy kalit sifatida auto-incremented integerlar, yoki UUID kabi maxsus generatsiya qilingan idlar ishlatilishi mumkin. Ularning ham turlari bor (surrogat va tabiiy) va birozdan keyin bunga to'xtalamiz.

4️⃣ Alternate Key

Muqobil Kalit - Primary Key sifatida tanlanmagan barcha kandidat kalitlar muqobil kalit bo'ladi.

Aytaylik, jadvalimizda bir nechta Unique ustunlar bor:

Image description

U holda ularning faqat bittasi Primary Key bo'la oladi, va tabiiyki qolgani unique=True bo'lsa-da, muqobil darajasida qoladi.

5️⃣ Unique Key

Unique Key - deyarli Primary Key, faqat bitta sharti bor: NULL qiymatlarni ham qabul qila oladi. Ya'ni, qatorning shu ustunida ma'lumot bo'sh bo'lishi mumkin.

Rostdan ham-da, masalan email ustunini biz Unique Key desak bo'ladi, sababi hamma user ham birdan emailini kiritmasligi mumkin. Natijada o'sha katakda bo'sh ma'lumot, NULL turadi.

Primary Key bir vaqtda Unique Key bo'lishi mumkin, lekin Unique Key bir vaqtda Primary Key bo'la olmaydi.

6️⃣ Surrogate Key

Sun'iy Kalit - default holatda har bir jadval uchun avtomatik yaratiladigan kalit bo'lib, har bir ustunni yagonaligini ta'minlaydi. Lekin u o'z nomi bilan surrogat, ya'ni haqiqiy hayotda hech nimani anglatmaydi.
Masalan,

IDsi 329 bo'lgan foydalanuvchi layk bosdi.

Bu yerda 329 nima ma'noni anglatadi? Hech nimani! U shunchaki 329-user 328-, 330- va boshqa barcha userlardan boshqa user ekanini bildiradi xolos.

Image description

Mazkur rasmda ham ko'rish mumkinki, order_id surrogat kalit, sababi u faqat uniqueness ta'minlash uchun va SERIAL tipida turibdi.

7️⃣ Natural Key

Tabiiy Kalit - jadvaldagi haqiqiy hayotda nimadir ma'no bildiradigan ustun kalit sifatida tanlanishi. Ya'ni bu holatda kalit qandaydir muhim ma'lumotni o'zida saqlaydi, yuqoridagi sun'iy kalitdan farqli ravishda. Masalan,

Emaili mematibash@gmail.com bo'lgan foydalanuvchi layk bosdi.

Bu yerda biz foydalanuvchi emailini bilyapmiz va agar istasak unga xabar yuborishimiz ham mumkin.

Image description

Bu rasmda esa Primary Key sifatida auto-increment integer emas, balki 17 talik char tanlangan va u ma'lum ma'noni anglatadi. Aniqki, bu tabiiy kalit deb atalishi mumkin.

8️⃣ Composite Key & Compound Key

Ko'pincha bu ikki atama bir xil ma'noda ishlatiladi. Sodda tushunsak, jadvaldagi bir necha ustunni birlashtirib, bitta kalit sifatida olish. Xususiy holatlarda bu atamalar boshqa-boshqa ma'no anglatishi mumkin, masalan biri ManyToMany jadvallarda ishlatilsa boshqasi ForeignKey qatnashmagan ustunlardan iborat paytlarda ishlatiladi. Lekin biz uncha chuqur kirmay turamiz.

Quyidagi StudentCourse jadvali misolida ko'raylik:

Composite example 1: StudentCourse table

Bu holatda {StudentID, CourseID} qism to'plami Composite Key bo'lishi mumkin, chunki u har bir student qaysi kursga qatnashganini yagona tartibda aniqlab bera oladi. Shuningdek, e'tibor beraylikki, bu jadval ManyToMany bog'lami uchun ochilgan "o'rtakash" jadvaldir. Ya'ni, Student va Course jadvallari o'rtasidagi ManyToMany bog'lamni mazkur jadval ta'minlab turibdi.

9️⃣ Foreign Key

Tashqi Kalit - bir jadvalni boshqasi bilan bog'laydigan kalit. Bu ustunda boshqa bir jadvalning asosiy kaliti joylashadi va shu orqali ikki jadvalning o'zaro bog'lami ta'minlanadi.

Image description

Rasmda ko'rish mumkinki, customer_id ustuni integer tipida bo'lsa-da, boshqa customer nomli jadvalning shu nomdagi Primary Key ustuniga reference qilib turibdi. Va aynan shu narsa jadvallar o'rtasida virtual relationship, ko'rinmas ip hosil qiladi.


🏁 Shunday qilib bugun database dizaynda doim ishlatiladigan, qayerga qarasa ham topsa bo'ladigan kalitlar mavzusi haqida gaplashdik. Umid qilamanki, bu o'zimga ham o'qiganlarga ham foydali bo'ldi. E'tiboringiz uchun rahmat!

Top comments (0)