Bazani to‘g‘ri loyihalash
219 daq
Yaxshi loyihalangan bazada har bir ma’lumot bir joyda saqlanadi. Yomon loyihalangan bazada esa bir narsa o‘nlab joyda takrorlanadi va vaqt o‘tib o‘ziga zid bo‘lib qoladi. Bu darsda bazani qanday to‘g‘ri bo‘lishni o‘rganamiz.
Yomon misol
Do‘kon hamma narsani bitta jadvalda yuritadi:
| order_id | customer | customer_phone | products | total |
|---|---|---|---|---|
| 1 | Aziz Karimov | 901112233 | iPhone 15, AirPods 3 | 13 880 000 |
| 2 | Aziz Karimov | 901112233 | Quvvatlagich 20W | 190 000 |
| 3 | Malika Yusupova | 935556677 | iPhone 15 | 11 490 000 |
Muammolar:
- Takrorlanish — Azizning telefoni har bir buyurtmada qayta yozilgan. Telefon o‘zgarsa, hamma joyda o‘zgartirish kerak; bittasi esdan chiqsa — baza ikki xil telefonni «biladi».
- Bir katakda ro‘yxat —
productsda bir nechta mahsulot. «Nechta iPhone sotildi?» degan savolga SQL bilan javob berib bo‘lmaydi. - Hisoblangan qiymat —
totalmahsulot narxlaridan kelib chiqadi; ular mos kelmay qolishi mumkin.
Normal shakllar
Bazani to‘g‘ri qurish qoidalari normal shakllar deyiladi. Amalda dastlabki uchtasi yetarli.
1NF — har bir katakda bitta qiymat. Ro‘yxat bo‘lmaydi, takrorlanuvchi ustunlar (phone1, phone2, phone3) bo‘lmaydi. Mahsulotlar alohida qatorlarga ajratiladi.
2NF — har bir ustun butun kalitga bog‘liq. Agar kalit ikki ustundan iborat bo‘lsa (masalan, order_id + product_id), mahsulot nomi faqat product_id ga bog‘liq — demak u boshqa jadvalda (products) turishi kerak.
3NF — ustunlar bir-biriga bog‘liq emas. Buyurtmada customer_phone turmaydi — u buyurtmaga emas, mijozga tegishli. Mijoz haqidagi hamma narsa customers jadvalida.
To‘g‘ri tuzilma
Xuddi bizning shop bazamizdagidek:
customers— mijozlar (ism, telefon — bir marta);products— mahsulotlar (nom, narx);orders— buyurtma: kim va qachon (customer_id);order_items— buyurtma tarkibi: qaysi mahsulotdan nechta (order_id,product_id,quantity).
Endi «Azizning telefoni» bitta joyda, «nechta iPhone sotildi» esa oddiy so‘rov:
Narx nega order_items da ham bor?
products.price — hozirgi narx, order_items.unit_price — sotilgan paytdagi narx. Bu takrorlanish emas: narx ertaga o‘zgarsa ham, o‘tgan buyurtmaning summasi o‘zgarmasligi kerak. Normallashtirish — «hech narsani takrorlama» emas, «bir ma’noni bir joyda saqla».
Denormalizatsiya
Ba’zan tezlik uchun ataylab takrorlashadi: masalan, users.xp — har safar xp_events ni yig‘ish o‘rniga tayyor son. Bu ongli qaror bo‘lishi va qiymatni yangilab turish yo‘li aniq bo‘lishi kerak.
Loyihalash bo‘yicha amaliy maslahatlar
- Avval narsalarni (entity) aniqlang: talaba, guruh, fan, baho.
- Har biri — alohida jadval, har birida
id. - «Birga-ko‘p» — tashqi kalit «ko‘p» tomonda.
- «Ko‘pga-ko‘p» — oraliq jadval.
- Ustun nomlari aniq va bir xil uslubda:
created_at,student_id.
order_items dan buyurtma raqami 1 bo‘lgan buyurtmaning tarkibini chiqaring: mahsulot nomi (products.name), quantity va unit_price.
Esda qoldiring
- Bir ma’no — bir joy: takrorlanish xatolarga olib keladi.
- 1NF — katakda bitta qiymat; 2NF — butun kalitga bog‘liqlik; 3NF — ustunlar faqat kalitga bog‘liq.
- Tarixiy qiymat (sotilgan paytdagi narx) — takrorlanish emas.