Asosiy kontentga o‘tish
Innovialabs

Ma’lumotlar bazasini normallashtirish: 1NF, 2NF, 3NF misollarda

Asoslar4 daq

Qisqacha

Normallashtirish — ma’lumotlarni har bir fakt bir marta saqlanadigan qilib jadvallarga bo‘lish: 1NF katakdagi ro‘yxatlarni, 2NF tarkibli kalitning bir qismiga bog‘liq ustunlarni, 3NF boshqa kalit bo‘lmagan ustunlarga bog‘liq ustunlarni yo‘qotadi; denormallashtirishni faqat ongli ravishda, o‘lchangan o‘qish tezligi yoki hisobotlar uchun qiling.

Qisqacha javob

Normallashtirish — jadvallarni har bir fakt aynan bitta joyda saqlanadigan qilib loyihalash usuli. U uchta klassik muammodan — anomaliyalardan himoya qiladi:

  • Yangilash anomaliyasi: mijoz telefonini o‘zgartirdi va uni o‘nlab qatorlarda tuzatish kerak — bittasini albatta unutasiz.
  • Qo‘shish anomaliyasi: kimdir buyurtma qilmaguncha yangi mahsulotni qo‘sha olmaysiz.
  • O‘chirish anomaliyasi: mijozning oxirgi buyurtmasini o‘chirdingiz — u haqidagi barcha ma’lumot yo‘qoldi.

Dastlabki uchta normal shakl (1NF, 2NF, 3NF) ilova bazasiga kerak bo‘ladigan deyarli hamma narsani qamrab oladi.

Boshlang‘ich nuqta: Excel’dan olingan jadval

Elektron jadvaldan ko‘chirilgan buyurtmalar jadvali ko‘pincha shunday ko‘rinadi:

order_iddatecustomerphonecityproducts
1012026-03-01Aziz+998 90 111ToshkentRuchka x2, Daftar x1
1022026-03-02Malika+998 91 222SamarqandDaftar x3
1032026-03-05Aziz+998 90 111ToshkentRuchka x1

Ixcham ko‘rinadi, lekin nechta ruchka sotilganini hisoblash noqulay, Azizning telefoni esa ikki marta saqlangan.

Birinchi normal shakl (1NF)

Qoida: har bir katakda bitta atomar qiymat, ro‘yxatlar va takrorlanuvchi guruhlar yo‘q, har bir qator kalit orqali aniqlanadi.

products ustunida ro‘yxat bor — har bir mahsulotga alohida qator beramiz:

order_idproductqtypricedatecustomerphonecity
101Ruchka252026-03-01Aziz+998 90 111Toshkent
101Daftar1122026-03-01Aziz+998 90 111Toshkent
102Daftar3122026-03-02Malika+998 91 222Samarqand
103Ruchka152026-03-05Aziz+998 90 111Toshkent

Endi kalit — (order_id, product) jufti. «Nechta ruchka sotildi» kabi so‘rovlar oson bo‘ldi, lekin takrorlanish ko‘paydi.

Ikkinchi normal shakl (2NF)

Qoida: jadval 1NF’da va har bir kalit bo‘lmagan ustun kalitning bir qismiga emas, butun kalitga bog‘liq. Bu faqat tarkibli kalitlar uchun muhim.

Ustunlarni (order_id, product) bo‘yicha tekshiramiz:

  • qty ikkalasiga bog‘liq: shu buyurtmada shu mahsulotdan nechta. Qoladi.
  • date, customer, phone, city faqat order_idga bog‘liq. Chiqaramiz.
  • price (katalog narxi) faqat productga bog‘liq. Chiqaramiz.

Natija:

  • orders (order_id, date, customer, phone, city)
  • products (product_id, name, price)
  • order_items (order_id, product_id, qty)

Uchinchi normal shakl (3NF)

Qoida: jadval 2NF’da va hech bir kalit bo‘lmagan ustun boshqa kalit bo‘lmagan ustunga bog‘liq emas (tranzitiv bog‘liqlik yo‘q).

ordersda kalit — order_id, lekin phone va city buyurtmani emas, mijozni tavsiflaydi. Ular order_idga faqat customer orqali bog‘liq. Mijozni alohida jadvalga chiqaramiz:

  • customers (customer_id, name, phone, city)
  • orders (order_id, customer_id, date)
  • products (product_id, name, price)
  • order_items (order_id, product_id, qty)
CREATE TABLE customers (
  customer_id SERIAL PRIMARY KEY,
  name  TEXT NOT NULL,
  phone TEXT,
  city  TEXT
);

CREATE TABLE orders (
  order_id    SERIAL PRIMARY KEY,
  customer_id INT NOT NULL REFERENCES customers,
  created_at  DATE NOT NULL
);

Endi Azizning telefoni bir marta saqlanadi, mahsulotlar birinchi buyurtmagacha ham mavjud, buyurtmani o‘chirish esa mijozni o‘chirmaydi.

Qulay formula: har bir kalit bo‘lmagan ustun kalitga, butun kalitga va faqat kalitga bog‘liq bo‘lishi kerak.

Ko‘p uchraydigan xatolar

  • ID yoki teglarni bog‘lovchi jadval o‘rniga bitta matnli ustunda vergul bilan saqlash.
  • Mijoz ismini «qulaylik uchun» har bir buyurtmaga nusxalash.
  • phone1, phone2, phone3 ustunlarini ochish — bu ham takrorlanuvchi guruh.
  • Haddan tashqari normallashtirish: barqaror va doim birga ishlatiladigan ma’lumotlarni foydasiz ko‘plab mayda jadvallarga bo‘lish.

Denormallashtirish qachon o‘rinli

Denormallashtirish — ma’lumotlarning bir qismini ongli ravishda ortiqcha saqlash. Bu xato emas, quyidagi hollarda vosita:

  • Hisobot va tahlil alohida omborda ishlaydi, u yerda keng tekis jadvallar yoki «yulduz» sxemasi so‘rovlarni soddalashtiradi va tezlashtiradi.
  • O‘lchangan sekin so‘rov har bir sahifa ko‘rilganda og‘ir JOIN yoki sanashni bajaradi; comments_count kabi keshlangan hisoblagich yordam beradi.
  • Tarixiy surat kerak: buyurtma paytidagi narx va yetkazish manzili katalog yoki profil o‘zgarganda o‘zgarmasligi kerak. Aslida bu boshqa fakt («xarid narxi»), shuning uchun order_items.price — to‘g‘ri dizayn.

Xavfsiz denormallashtirish qoidalari: normallashtirilgan sxemadan boshlang, faqat o‘lchovlardan keyin denormallashtiring va nusxalarni tranzaksiyalar, triggerlar yoki aniq yangilash yo‘li bilan mos holatda saqlang.

Ko‘p beriladigan savollar

Ko‘pchilik ilovalar uchun 3NF yetarli. BCNF va 4NF kabi yuqoriroq shakllar kesishuvchi kalitlar yoki mustaqil ko‘p qiymatli faktlar bilan bog‘liq kamdan-kam holatlarni hal qiladi; ular haqida bilish foydali, ammo ularni ataylab loyihalash kam uchraydi.

Bunda yordam beramiz

O‘zingiz shug‘ullanmasdan natija olishni istasangiz — biz har kuni shu bilan shug‘ullanamiz.

Loyihani muhokama qilish

Yana o‘qing

G‘oya yoki vazifangiz bormi? Bizga aytib bering

Ish kuni davomida javob beramiz va yechim taklif qilamiz. Konsultatsiya bepul.