Database normalization formalari: 1NF, 2NF, 3NF, BCNF (2-qism)
Assalamu Alaykum bugun o'tgan maqoladagi database normalization formalari haqida gaplashib o'tamiz .Qani ketdik ;)
Bugungi maqoladagi mavzular:
1NF
2NF
3NF
BCNF -> Boyce-Codd normal form
4NF
5NF
1 Normal Form
Agarda siz tuzgan database sxemasi 1 normal formda bo'lmasa bu sxema juda yomonligini bildiradi ,database sxemasi kamida 1 normal formda bo'lishi kerak .
1NF — Siz tableni shunday tuzishingiz kerakki oson kengayadigan va databasedan ma'lumotlarni olishi oson bo'lishi zarur.
1NF qoidalari :
Har bir ustun bir dona qiymat qabul qilishi lozim
Ustun bir xil tipdagi ma'lumotlarni saqlashi lozim
Har bir ustun unqiue nomga ega bo'lishi zarur
Saqlangan ma'lumotlar tartibi databaseda rol o'ynamasligi kerak.

1-student table 3 ta qoidani allaqachon qoniqtiradi bular, column namelar unique, saqlangan ma'lumotlar tartibi muhim emas , va bir ustunda bir xil turdagi ma'lumotlar saqlanmoqda ,ammo bir columnda faqat bitta malumot saqlash talabi buzilmoqda **(PHP, Java)**va bularni alohida qatorlar sifatida saqlash lozim xuddi 2-student tabledagidek .
2 Normal Form
2NF ga qanoatlantirish uchun talablar tablelar allaqachon 1NFda bo'lishi lozim va unda partial dependency bo'lmasligi lozim.
Dependency— bu tabledagi ma'lumotni olish uchun ishlatilinadigan unique qiymatga ega column .Masalan Student tableda name ,branch ,studentning kirgan yili va studentId bo'lsa va u unique bo'lsa biz shu student id orqali studentga tegishli xohlagan ma'lumotimizni ola olamiz shu dependency deyiladi.
Xo'sh bizda student table bor va yana bir subject table yaratamiz unda subjectId va subjectName columnlari mavjud.

Bizda hozir student va subject ma'lumotlari uchun table bor. Biz bunga qo'shimcha imtihonlar paytidagi baholarni saqlash uchun score table yaratamiz.Hamda shu tableda baholar bilan birga shu fanni o'qitgan o'qituchi nomi saqlanadi . Bu tableda score_id primary key bo'ladi ammo student_id + subject_id ko'proq primary key uchun mos keladi.Masalan tabledan student_id orqali yoki subject_id ololmaymiz chunki bu yerda many to many bog'lanish mavjud.
1 ta studentdan 1tadan ko'p subject bor
1 ta subjectda bittadan ko'p student bo'lishi mumkin.
Va buni natijasida biz Primary key subject_id va student_id degan xulosaga kelsak tabledagi teacher faqat subjectga bog'langanligi tufayli bu Partial dependencybo'ladi.Ya'ni primary keytabledan ma'lumotni olish uchun ishlatiladi va shu olinadigan malumot primary keyning ikkalasiga ham bir vaqtda bog'liq bo'lmasa partial dependency bo'ladi .
Partial dependency yo'qotish yechimi : Techearni alohida tablega olib chiqish yoki uni subject tablega qo'shishimiz mumkin .
3 Normal Form
3 Normal formaga o'tkazish uchun table 2NFda bo'lishi hamda unda transitive dependencylar bo'lmasligi lozim.
Score tablega imtihon haqida ma'lumotlarni qo'shmoqchi bo'ldik exam_name va total_marks columnlari qo'shildi.
Score tableda primary key bu subject_id va student_id composite keyi exam_name ularga bog'liq total marks esa exam_namega bog'liq.Masalan mexanikda amaliy ishlar imtihoni bo'ladi ammo IT studentda bu bo'lmaydi ,hamda java va php uchun coding exam bo'lishi mumkin ammo matematika uchun bunaqa exam bo'lmaydi. Bu exam_name student va subjectga bog'liqligini bildiradi .total_marks faqatgina examga bog'liq bo'lib u asosiy imtihon yakuniy yoki oraliqligiga qarab ballar har xil taqsimlanadi .Ammo bu holatda exam_name primary keyga kirmaydi bu transitive depdendency deyiladi .

Buni oldini olish uchun exam table yaratib unga exam_name va total_marks olib o'tamiz .

Boyce-Codd Form (BCNF)
Bu formaga o'tish uchun tablelar 3NF da bo'lishi zarur hamda istalgan dependency uchun A->B da A super key bo'lishi kerak.
A — >B— primary key bo'lmagan columnga primary key bog'liqligi

Bu yerda 1 student bir necha subjectga qo'shila oladi va har bir fan uchun o'quvchiga alohida fan biriktiriladi .Bu yerda student_id va subject_id birgalikda primary key bo'ladi va u orqali professorni topishimiz mumkin.Bu holatda 1 professor faqat bitta fandan dars bersa demak ustoz orqali fanni topishimiz mumkin .student_id + subject_id -> professor
Buni to'g'rilash uchun bu tableni 2ga bo'lamiz va quyidagi natijaga erishamiz,

4 Normal Form
Bu formaga keltirish uchun u kamida BCNFda bo'lishi hamda unda multi valuelik dependecy bo'lmasligi zarur va tableda kamida 3 ta column bo'lishi kerak.Agarda 2 ta bo'lsa shunchaki tabledagi qiymatlarni ajratish bu muammoni hal qiladi va bu 1NFda bor.
Agar ABC tableda A qiymatning bir qiymatiga Bning 2ta yoki undan ortiq qiymati to'gri kelsa va B hamda C o'zaro bog'liq bo'lmasligi kerak bu multi valued dependecy deyiladi . Bu B va Cga bir vaqtda bo'lishi ham mumkin.

Tepadagi tableni ko'ramiz xo'sh nima muammo bor hammasi yaxshiku.Lekin 1 idlik student Math va Scienceda o'qiydi hamda Criket va Hockey uning hobbylar to'g'rimi .Ammo bu malumotni to'ldirish uchun table quyidagi ko'rinishga kelishi kerak.Va yangi ma'lumotlar qo'shilganda bu ko'plab muammolarni olib keladi.

Buni bu tableni 2 ta alohida bir biriga bog'liq bo'lmagan tablega bo'lish orqali hal qilishimiz mumkin.

5 Normal Form
Tableni bu formaga olib kelish uchun u **4NF**da bo'lishi zarur hamda unda join dependency bo'lmasligi kerak.

Bizda 3 xil muzqaymoq brandi hamda uning har xil turlari bor .Biz Jason va Suzydan uning yoqtirgan shkalad turlarini so'radim ular Jason vanilla va shkoladlik hamda Frosty va Alphine brandini yoqtirishini aytdi .Suzy esa mint shkoladlik , qulupnaylik va rum raisinlik hamda Alphine va Ice Queen brandini yoqtirishini aytdi . Frosty brand o'z mahsulotlarini yaxshiladi va Suzydan qayta so'ralganda u Frost brandini yoqtirib qolganini aytdi .Bu degani u Frosti brandidan qulupnaylik hamda mint shkoladlikni yoqtirishi zarur edi ammo biz tableni yangilayotganda xatolik bo'ldi va mint shholadlik kiritilmay qoldi bu esa bizda ma'lumotlar mantiqan xatolikka olib keladi .Agar bu yerda Frosty brandi shkaladlik muzqaymoqni chiqarishni to'xtatsa u ma'lumot databasedan o'chirilishi zarur va bu Jason shkoladlik muzqaymoqni yoqtirmaydi degan holatga olib keladi bu esa noto'g'ri .Buni oldini olish uchun ularni maqsadlarga qarab oldini olish kerak masalan.
brandlarda qaysi turdagi muzqaymoqlar bor ?
Ular qaysi brandlarni yoqtiradi ?
Ular qaysi turdagi muzqaymoqlarni yoqtiradi

Va bundan so'ng ma'lumotlar 3ta tablega bo'linadi agarda birgalikdagi ma'lumot kerak bo'lsa joinlar orqali olinadi.
Join dependency— bu bir tableni alohida tablelarga bo'lib uni qayta yig'sa ham ma'lumot ozgarmasligiga aytiladi .
Tepadagi holatda esa ma'lumotlar bo'linishi va qayta yig'ilishi qaysidir ma'lumotlarni yoqotishga olib keladi va 5NFni qoniqtiradi.
Xulosa
Normalizationda 1NF uchun bir xil qiymat bo'lmasligi,2NFda partial dependency, 3NFda transitive dependency, 4NFda multi valued dependency , 5NFda join dependency bo'lmasligi kerak ekan. Xulosa qilib aytadigan bo'lsak databaseda ma'lumot ko'paygan va murakkablashgan sari uni normalizationga bo'lgan talab ortib boraveradi.
E'tiboringiz uchun rahmat !!!
Xato va kamchiliklar uchun uzr.