🇺🇿 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.
❓ 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.
- Superkey
- Candidate Key
- Primary Key
- Alternate Key
- Unique Key
- Surrogate Key
- Natural Key
- Composite Key & Compound Key
- 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.
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}
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:
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.
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.
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:
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.
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)