1-bo‘lim
Nima uchun loyihalash kerak
Yomon sxemaning haqiqiy narxi, anomaliyalar, bitta jadvaldagi muammolar va loyihalash bosqichlari.
Ushbu bo‘lim mundarijasi
SQL yozishni bilish - bu yarim ish. Jadvallarni qanday tuzish kerakligini bilish undan ham muhimroq.
Yomon sxema qanday ko'rinadi #
Ko'p yangi loyiha shunday boshlanadi - hamma narsa bitta jadvalda:
CREATE TABLE buyurtmalar_yomon (
id INT PRIMARY KEY,
mijoz_ismi VARCHAR(100),
mijoz_telefoni VARCHAR(20),
mijoz_shahri VARCHAR(50),
mahsulot_nomi VARCHAR(100),
mahsulot_narxi DECIMAL(10, 2),
soni INT,
sana DATE
);
INSERT INTO buyurtmalar_yomon VALUES
(1, 'Husanboy Qodirov', '901234567', 'Namangan', 'Noutbuk', 8000000, 1, '2026-01-10'),
(2, 'Husanboy Qodirov', '901234567', 'Namangan', 'Sichqoncha', 150000, 2, '2026-01-10'),
(3, 'Malika Yusupova', '911112233', 'Farg''ona', 'Noutbuk', 8000000, 1, '2026-02-05'),
(4, 'Husanboy Qodirov', '901234567', 'Namangan', 'Klaviatura', 300000, 1, '2026-03-01');
SELECT mijoz_ismi, mijoz_telefoni, mahsulot_nomi
FROM buyurtmalar_yomon
ORDER BY id;
+------------------+----------------+---------------+
| mijoz_ismi | mijoz_telefoni | mahsulot_nomi |
+------------------+----------------+---------------+
| Husanboy Qodirov | 901234567 | Noutbuk |
| Husanboy Qodirov | 901234567 | Sichqoncha |
| Malika Yusupova | 911112233 | Noutbuk |
| Husanboy Qodirov | 901234567 | Klaviatura |
+------------------+----------------+---------------+
Ishlayapti. Muammo nimada?
Uch turdagi anomaliya #
Yangilash anomaliyasi amalda #
-- Husanboy telefon raqamini o'zgartirdi.
-- Dasturchi shoshib, faqat bitta qatorni yangiladi:
UPDATE buyurtmalar_yomon
SET mijoz_telefoni = '999999999'
WHERE id = 1;
SELECT DISTINCT mijoz_ismi, mijoz_telefoni
FROM buyurtmalar_yomon
WHERE mijoz_ismi = 'Husanboy Qodirov';
+------------------+----------------+
| mijoz_ismi | mijoz_telefoni |
+------------------+----------------+
| Husanboy Qodirov | 999999999 |
| Husanboy Qodirov | 901234567 |
+------------------+----------------+
Ma'lumotlar bazasi ikki xil haqiqatni saqlayapti. Dastur qaysi birini ko'rsatadi - so'rov tartibiga bog'liq.
Bu shunchaki nazariy muammo emas:
- Buyurtma yetkazib berish uchun noto'g'ri raqamga qo'ng'iroq;
- Hisobotda ikkita mijoz ko'rinadi, aslida bitta;
WHERE telefon = '901234567'bo'yicha qidiruv to'liq bo'lmagan natija beradi.
Va eng yomoni - buni hech kim sezmaydi, toki mijoz shikoyat qilmaguncha.
To'g'ri sxemada telefon raqami bitta joyda saqlanadi va bunday holat jismonan mumkin emas.
To'g'ri sxema #
Ma'lumotni to'rt jadvalga ajratamiz:
CREATE TABLE mijozlar (
id INT PRIMARY KEY AUTO_INCREMENT,
ism VARCHAR(100) NOT NULL,
telefon VARCHAR(20) NOT NULL,
shahar VARCHAR(50)
);
CREATE TABLE mahsulotlar (
id INT PRIMARY KEY AUTO_INCREMENT,
nom VARCHAR(100) NOT NULL,
narx DECIMAL(10, 2) NOT NULL
);
CREATE TABLE buyurtmalar (
id INT PRIMARY KEY AUTO_INCREMENT,
mijoz_id INT NOT NULL,
sana DATE NOT NULL,
FOREIGN KEY (mijoz_id) REFERENCES mijozlar(id)
);
CREATE TABLE buyurtma_qatorlari (
buyurtma_id INT NOT NULL,
mahsulot_id INT NOT NULL,
soni INT NOT NULL,
PRIMARY KEY (buyurtma_id, mahsulot_id),
FOREIGN KEY (buyurtma_id) REFERENCES buyurtmalar(id),
FOREIGN KEY (mahsulot_id) REFERENCES mahsulotlar(id)
);
Hosil bo'lgan jadvallar:
SELECT TABLE_NAME AS jadval
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME <> 'buyurtmalar_yomon'
ORDER BY BINARY TABLE_NAME;
+--------------------+
| jadval |
+--------------------+
| buyurtma_qatorlari |
| buyurtmalar |
| mahsulotlar |
| mijozlar |
+--------------------+
Endi telefon raqami faqat mijozlar jadvalida turadi. Uni
o'zgartirish - bitta qatorni yangilash.
Bir fakt - bir joy #
INSERT INTO mijozlar (ism, telefon, shahar) VALUES
('Husanboy Qodirov', '901234567', 'Namangan'),
('Malika Yusupova', '911112233', 'Farg''ona');
INSERT INTO mahsulotlar (nom, narx) VALUES
('Noutbuk', 8000000), ('Sichqoncha', 150000), ('Klaviatura', 300000);
-- Telefon raqamini o'zgartirish - BITTA qator
UPDATE mijozlar SET telefon = '999999999' WHERE ism = 'Husanboy Qodirov';
SELECT ism, telefon FROM mijozlar ORDER BY id;
+------------------+-----------+
| ism | telefon |
+------------------+-----------+
| Husanboy Qodirov | 999999999 |
| Malika Yusupova | 911112233 |
+------------------+-----------+
Ziddiyat mumkin emas - raqam bitta joyda.
Har bir fakt aynan bitta joyda saqlanishi kerak.
Ingliz tilida bu SSOT (Single Source of Truth) deb ataladi.
Agar bir ma'lumot ikki joyda bo'lsa, ertami-kechmi ular bir-biriga mos kelmay qoladi. Bu vaqt masalasi.
Normalizatsiya (6-8 bo'limlar) - aynan shu qoidani tizimli qo'llash usuli.
Diqqat: bu qoidaning ataylab buziladigan holatlari ham bor - 9-bo'limdagi denormalizatsiya. Lekin uni ongli ravishda, aniq sabab bilan qilish kerak.
Loyihalash bosqichlari #
Sxemani keyin o'zgartirish qimmat #
Boshida noto'g'ri tuzilgan jadvalni keyinchalik tuzatish uchun:
| Ish | Murakkabligi |
|---|---|
| Yangi jadvallar yaratish | Oson |
| Mavjud ma'lumotni ko'chirish | Qiyin va xavfli |
| Barcha so'rovlarni yangilash | Uzoq |
| Ilova kodini o'zgartirish | Uzoq |
| Migratsiya paytida ishlashni ta'minlash | Juda qiyin |
| Xatolarni tuzatish | Bashorat qilib bo'lmaydi |
Millionlab qatorli jadvalda ALTER TABLE soatlab ishlashi
va shu vaqt davomida jadvalni qulflab qo'yishi mumkin.
Shuning uchun boshida bir necha soat loyihalashga sarflash - keyinchalik bir necha haftani tejaydi.
Bu "oldindan hamma narsani rejalash kerak" degani emas. Ma'lumotlar bazasi sxemasi kodga qaraganda ancha qiyin o'zgaradi, shuning uchun unga ko'proq e'tibor beriladi.
Yaxshi sxemaning belgilari #
| Belgi | Ma'nosi |
|---|---|
| Takrorlanish yo'q | Har fakt bitta joyda |
| Nomlar tushunarli | mijoz_id, t1_col3 emas |
| Cheklovlar bor | NOT NULL, UNIQUE, CHECK |
| Tashqi kalitlar bor | Yetim qator paydo bo'lmaydi |
| Turlar aniq | DATE, VARCHAR(255) emas |
| Indekslar mos | So'rovlarga qarab qo'yilgan |
| Kengaytiriladigan | Yangi talab sxemani buzmaydi |
-- Sxema haqidagi ma'lumotni ko'rish
SELECT COLUMN_NAME AS ustun, DATA_TYPE AS turi, IS_NULLABLE AS null_mumkinmi
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'mijozlar'
ORDER BY ORDINAL_POSITION;
+---------+---------+---------------+
| ustun | turi | null_mumkinmi |
+---------+---------+---------------+
| id | int | NO |
| ism | varchar | NO |
| telefon | varchar | NO |
| shahar | varchar | YES |
+---------+---------+---------------+
SQL va MySQL darsligi so'rov yozishni o'rgatadi: SELECT,
JOIN, GROUP BY, funksiyalar.
Bu darslik esa jadvallarni qanday tuzishni o'rgatadi: qaysi ustun qayerda bo'lishi, qanday bog'lanish, qanday cheklov va indeks kerakligini.
Ikkalasi bir-birini to'ldiradi:
| Savol | Qaysi darslik |
|---|---|
| "Ikki jadvalni qanday birlashtirish?" | SQL |
| "Bu ikki jadval umuman kerakmi?" | Shu darslik |
| "Eng qimmat mahsulotni qanday topish?" | SQL |
| "Narxni qaysi jadvalda saqlash kerak?" | Shu darslik |
Agar SELECT va JOIN bilan tanish bo'lmasangiz, avval SQL
darsligini ko'rib chiqing.
- Bitta jadvalda mijoz va buyurtmani saqlab, takrorlanishni ko'ring.
- Faqat bitta qatorni yangilab, ziddiyat hosil qiling.
- Yangilash anomaliyasi nima ekanini o'z so'zingiz bilan ayting.
- Sotilmagan mahsulotni bitta jadvalga qo'shishga urinib ko'ring.
- Yagona buyurtmani o'chirib, mijoz ma'lumoti yo'qolishini kuzating.
- Ma'lumotni to'rt jadvalga ajrating.
- Telefon raqamini bitta
UPDATEbilan o'zgartiring. - "Bir fakt - bir joy" qoidasini tushuntiring.
- Loyihalashning to'rt bosqichini sanang.
information_schemaorqali jadval tuzilmasini ko'ring.
Xulosa #
- Hamma narsani bitta jadvalga joylash - eng ko'p uchraydigan xato.
- Takrorlanish uch anomaliya keltirib chiqaradi: yangilash, qo'shish, o'chirish.
- Yangilash anomaliyasi ma'lumotlar bazasida ikki xil haqiqat hosil qiladi.
- Asosiy qoida: har bir fakt aynan bitta joyda.
- Loyihalash bosqichlari: talablar → konseptual → mantiqiy → fizik.
- Ishlab turgan tizimda sxemani o'zgartirish juda qimmat.
- Yaxshi sxemada cheklovlar va tashqi kalitlar bo'ladi.
- Bu darslik sxema tuzishni, SQL darsligi so'rov yozishni o'rgatadi.
Keyingi bo'limda ER modellashtirish bilan tanishamiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.