1-bo‘lim

Nima uchun loyihalash kerak

Yomon sxemaning haqiqiy narxi, anomaliyalar, bitta jadvaldagi muammolar va loyihalash bosqichlari.

🕑 10 daqiqa o‘qish 📄 792 so‘z 👁 1 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Yomon sxema qanday ko'rinadi
  2. Uch turdagi anomaliya
  3. Yangilash anomaliyasi amalda
  4. To'g'ri sxema
  5. Bir fakt - bir joy
  6. Loyihalash bosqichlari
  7. Sxemani keyin o'zgartirish qimmat
  8. Yaxshi sxemaning belgilari
  9. Xulosa

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:

SQL
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');
SQL
SELECT mijoz_ismi, mijoz_telefoni, mahsulot_nomi
FROM buyurtmalar_yomon
ORDER BY id;
Natija
+------------------+----------------+---------------+
| 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 #

Takrorlanish keltirib chiqaradigan uch muammo Yangilash anomaliyasi Husanboy telefonini o'zgartirdi 3 ta qatorni yangilash kerak Bittasi unutilsa - ziddiyat Qo'shish anomaliyasi Yangi mahsulot keldi, lekin hali sotilmadi Uni qayerga yozamiz? Mijozsiz qator bo'lmaydi O'chirish anomaliyasi Malikaning yagona buyurtmasi o'chirildi Uning telefoni ham yo'qoldi Kerakli ma'lumot ketdi Uchala muammoning sababi bitta: TAKRORLANISH Bir fakt bir necha joyda saqlanmoqda
Normalizatsiya aynan shu uch anomaliyani yo'q qiladi

Yangilash anomaliyasi amalda #

SQL
-- 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';
Natija
+------------------+----------------+
| mijoz_ismi       | mijoz_telefoni |
+------------------+----------------+
| Husanboy Qodirov | 999999999      |
| Husanboy Qodirov | 901234567      |
+------------------+----------------+
Endi qaysi raqam to'g'ri?

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:

SQL
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:

SQL
SELECT TABLE_NAME AS jadval
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME <> 'buyurtmalar_yomon'
ORDER BY BINARY TABLE_NAME;
Natija
+--------------------+
| jadval             |
+--------------------+
| buyurtma_qatorlari |
| buyurtmalar        |
| mahsulotlar        |
| mijozlar           |
+--------------------+

Endi telefon raqami faqat mijozlar jadvalida turadi. Uni o'zgartirish - bitta qatorni yangilash.

Bir fakt - bir joy #

SQL
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;
Natija
+------------------+-----------+
| ism              | telefon   |
+------------------+-----------+
| Husanboy Qodirov | 999999999 |
| Malika Yusupova  | 911112233 |
+------------------+-----------+

Ziddiyat mumkin emas - raqam bitta joyda.

Loyihalashning asosiy qoidasi

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 loyihalash yo'li 1. Talablarni yig'ish Tizim nima qiladi? Qanday savollarga javob kerak? 2. Konseptual model Mavjudliklar va bog'lanishlar - ER diagramma 3. Mantiqiy model Jadvallar, kalitlar, normalizatsiya 4. Fizik model Turlar, indekslar, bo'lish, optimallashtirish Har bosqichda oldingisiga qaytish normal - loyihalash takrorlanuvchi jarayon
Kod yozishdan oldin qog'ozda chizish vaqtni tejaydi

Sxemani keyin o'zgartirish qimmat #

Ishlab turgan tizimda sxema o'zgarishi

Boshida noto'g'ri tuzilgan jadvalni keyinchalik tuzatish uchun:

IshMurakkabligi
Yangi jadvallar yaratishOson
Mavjud ma'lumotni ko'chirishQiyin va xavfli
Barcha so'rovlarni yangilashUzoq
Ilova kodini o'zgartirishUzoq
Migratsiya paytida ishlashni ta'minlashJuda qiyin
Xatolarni tuzatishBashorat 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 #

BelgiMa'nosi
Takrorlanish yo'qHar fakt bitta joyda
Nomlar tushunarlimijoz_id, t1_col3 emas
Cheklovlar borNOT NULL, UNIQUE, CHECK
Tashqi kalitlar borYetim qator paydo bo'lmaydi
Turlar aniqDATE, VARCHAR(255) emas
Indekslar mosSo'rovlarga qarab qo'yilgan
KengaytiriladiganYangi talab sxemani buzmaydi
SQL
-- 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;
Natija
+---------+---------+---------------+
| ustun   | turi    | null_mumkinmi |
+---------+---------+---------------+
| id      | int     | NO            |
| ism     | varchar | NO            |
| telefon | varchar | NO            |
| shahar  | varchar | YES           |
+---------+---------+---------------+
Bu darslik SQL darsligidan nimasi bilan farq qiladi?

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:

SavolQaysi 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.

Amaliy topshiriq
  1. Bitta jadvalda mijoz va buyurtmani saqlab, takrorlanishni ko'ring.
  2. Faqat bitta qatorni yangilab, ziddiyat hosil qiling.
  3. Yangilash anomaliyasi nima ekanini o'z so'zingiz bilan ayting.
  4. Sotilmagan mahsulotni bitta jadvalga qo'shishga urinib ko'ring.
  5. Yagona buyurtmani o'chirib, mijoz ma'lumoti yo'qolishini kuzating.
  6. Ma'lumotni to'rt jadvalga ajrating.
  7. Telefon raqamini bitta UPDATE bilan o'zgartiring.
  8. "Bir fakt - bir joy" qoidasini tushuntiring.
  9. Loyihalashning to'rt bosqichini sanang.
  10. information_schema orqali 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.

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.