# SQL normalizatsiya — ma'lumotni tartibli bo'lish

> Ma'lumotlar bazasida normalizatsiya nima? Takroriy ma'lumotni jadvallarga bo'lib, xatolar oldini olish. 1NF, 2NF va 3NF tamoyillari sodda misolda.

Manba: https://learncode.uz/sql/normalizatsiya/
Sana: 2026-06-19

Nega namuna bazamiz uch jadvalga bo'lingan — `mahsulotlar`, `mijozlar`,
`buyurtmalar`? Nega hammasi bitta katta jadval emas? Javob —
**normalizatsiya**: ma'lumotni takrorsiz va tartibli saqlash tamoyili.

## Muammo: bitta katta jadval

Aytaylik, hamma narsani bitta jadvalda saqlaymiz:

| buyurtma | mijoz_ism | mijoz_shahar | mahsulot | narx |
|---|---|---|---|---|
| 1 | Aziz | Toshkent | Non | 3000 |
| 2 | Aziz | Toshkent | Choy | 15000 |
| 6 | Aziz | Toshkent | Suv | 4000 |

Aziz uch marta buyurtma bergani uchun ismi va shahri **uch marta** takrorlandi.
Bu ikki muammo tug'diradi:

- **Joy isrofi** — bir xil ma'lumot qayta-qayta saqlanadi.
- **Yangilash xatosi** — Aziz Samarqandga ko'chsa, shaharni **hamma** qatorda
  tuzatish kerak. Bittasi unutilsa — ma'lumot ziddiyatli bo'ladi.

## Yechim: jadvallarga bo'lish

Normalizatsiya bu takrorni yo'qotadi. Mijoz ma'lumoti bir marta `mijozlar` da
saqlanadi, buyurtma esa faqat uning [raqamiga ishora](https://learncode.uz/sql/primary-foreign-key)
qiladi. Endi Azizning shahrini o'zgartirish — **bitta** joyda tuzatish.
Jadvallar [`JOIN`](https://learncode.uz/sql/join) bilan qayta birlashtiriladi.

> **Atama**
>
> **Normalizatsiya** — ma'lumotni takror qilmaslik uchun uni bog'liq jadvallarga
> bo'lish jarayoni. Maqsadi: har fakt bazada **faqat bir marta** saqlansin.
> Shunda yangilash bitta joyda bajariladi va ziddiyat kelib chiqmaydi.

## Uch asosiy shakl (qisqacha)

Normalizatsiya bosqichlari **normal shakllar** deyiladi:

- **1NF** — har katakda **bitta** qiymat bo'lsin (bir katakka "Non, Choy" deb
  ikki narsa yozilmasin).
- **2NF** — har ustun butun kalitga bog'liq bo'lsin (qisman bog'liqlik yo'q).
- **3NF** — ustunlar bir-biriga emas, faqat kalitga bog'liq bo'lsin.

Amalda ko'p loyiha uchun **3NF gacha** yetarli. Namuna bazamiz aynan shu
tamoyilga ko'ra tuzilgan: har fakt (mijoz, mahsulot, buyurtma) o'z jadvalida.

> **Yodda tuting**
>
> Normalizatsiya foydali, lekin haddan oshirmang. Ba'zan tezlik uchun ataylab
> bir oz takror qoldiriladi (denormalizatsiya) — masalan hisobotlarda `JOIN`
> ni kamaytirish uchun. Qoida: avval toza normalizatsiya, keyin zarur bo'lsagina
> tezlik uchun murosaga borish.

## Jonli namuna

O'zingiz ishga tushirib ko'ring — so'rovni tahrirlashingiz ham mumkin:

```sql
SELECT m.ism, p.nom, b.soni
FROM buyurtmalar AS b
JOIN mijozlar    AS m ON b.mijoz_id    = m.id
JOIN mahsulotlar AS p ON b.mahsulot_id = p.id;
```

## Amaliy mashq

Tuzilmani tahlil qiling:

1. Uch jadvalni `JOIN` bilan bitta natijaga birlashtiring;
2. natijadagi takrorlanishlarni toping — qaysi qiymat ko'p marta chiqdi?
3. tasavvur qiling: hammasi bitta jadvalda bo'lsa, mijoz ismini
   o'zgartirish uchun nechta qator yangilanardi?
4. `mijozlar` jadvalida esa nechta qator?
5. qog'ozda yozing: normalizatsiya qanday muammoni hal qildi?
6. bitta katakka "Non, Choy" deb ikki qiymat yozilgan jadvalni tasavvur
   qiling va u qaysi normal shaklni buzishini aniqlang.

2 va 3-qadam normalizatsiyaning asosiy sababini ko'rsatadi.

## Qisqacha xulosa

- **Normalizatsiya** — ma'lumotni takrorsiz, bog'liq jadvallarga bo'lish.
- Takror ma'lumot joy isrof qiladi va **yangilash xatolari**ga olib keladi.
- Har fakt bazada bir marta saqlanadi, jadvallar `JOIN` bilan bog'lanadi.
- Asosiy shakllar: 1NF (bitta qiymat), 2NF, 3NF; ko'pincha 3NF yetarli.
- Namuna baza (3 jadval) shu tamoyilga ko'ra tuzilgan.

Keyingi darsda [so'rov optimizatsiyasi](https://learncode.uz/sql/optimizatsiya) — so'rovlarni
qanday tezlashtirishni ko'ramiz.
