ER Diagram — jadvallar va munosabatlarni chizish

~20 daq · MySQL · Ma'lumotlar Bazasini Loyihalash

Muammodan boshlaylik

Siz jamoaga yangi qo'shildingiz. Bazada 47 ta jadval. Qaysi jadval qaysi biriga bog'liq? Buyurtma qanday qilib omborga ta'sir qiladi? SHOW TABLES va 47 ta DESCRIBE — bu tushunish emas, adashish.

Yoki teskari holat: yangi loyiha boshlanyapti. Buyurtmachi bilan "kurs platformasi" ni muhokama qilyapsiz — talabalar, kurslar, darslar, to'lovlar, sertifikatlar. SQL yozishdan oldin hamma bir xil tushunishi kerak.

Ikkala holatda ham kerak — rasm. Ma'lumotlar bazasining rasmi — ER diagramma (Entity-Relationship).


ER diagramma elementlari

Entity (ob'ekt) — jadval

To'rtburchak: yuqorida nom, ichida ustunlar.

┌─────────────────────────┐
│ mijozlar                │
├─────────────────────────┤
│ PK  id          INT     │
│     ism         VARCHAR │
│ UK  email       VARCHAR │
│     telefon     VARCHAR │
└─────────────────────────┘

PK — primary key, FK — foreign key, UK — unique.

Relationship (munosabat) — chiziq

Jadvallar orasidagi chiziq, uchlarida kardinallik belgilari.


Crow's foot notatsiyasi

Eng keng tarqalgan belgilash — "qarg'a oyog'i":

──┼──   bitta (va faqat bitta)
──○┼─   nol yoki bitta
──<     ko'p
──┼<    bitta yoki ko'p
──○<    nol yoki ko'p

Har bir uchda ikkita belgi: ichkaridagi — eng kam, tashqaridagi — eng ko'p.

mijozlar ──┼┼──────────○<── buyurtmalar

O'qilishi:

  • Chapdan o'ngga: "Bitta mijozda nol yoki ko'p buyurtma bor"
  • O'ngdan chapga: "Har bir buyurtma aynan bitta mijozga tegishli"
Munosabat Diagrammada
One-to-One ──┼┼────○┼──
One-to-Many ──┼┼────○<──
Many-to-Many ──>○────○<── (amalda oraliq jadval orqali)

Dokon bazasining diagrammasi

┌──────────────┐          ┌─────────────────┐          ┌──────────────┐
│ toifalar     │          │ mahsulotlar     │          │ mahsulot_    │
├──────────────┤          ├─────────────────┤          │ teglar       │
│ PK id        │┼○────○<  │ PK id           │┼┼───○<   ├──────────────┤
│    nom       │          │ FK toifa_id     │          │ PK,FK mahs_id│
└──────────────┘          │    nom          │          │ PK,FK teg_id │
                          │    narx         │          └──────┬───────┘
                          │    soni         │                 ○
                          └────────┬────────┘                 ^
                                   ┼                   ┌──────┴───────┐
                                   ┼                   │ teglar       │
                                   │                   ├──────────────┤
                                   ○                   │ PK id        │
                                   ^                   │ UK nom       │
┌──────────────┐          ┌────────┴────────┐          └──────────────┘
│ mijozlar     │          │ buyurtma_       │
├──────────────┤          │ qatorlari       │
│ PK id        │          ├─────────────────┤
│    ism       │          │ PK id           │
│ UK email     │          │ FK buyurtma_id  │
│    telefon   │          │ FK mahsulot_id  │
│    shahar    │          │    soni         │
└──────┬───────┘          │    narx         │
       ┼                  └────────┬────────┘
       ┼                           ^
       │                           ○
       ○                           ┼
       ^                           ┼
┌──────┴───────────────────────────┴──┐
│ buyurtmalar                          │
├──────────────────────────────────────┤
│ PK id                                │
│ FK mijoz_id                          │
│    holat, yaratilgan                 │
└──────────────────────────────────────┘

Bir qarashda ko'rinadi:

  • toifa_id — ixtiyoriy (○): toifasiz mahsulot bo'lishi mumkin
  • Buyurtma — albatta mijozga tegishli (┼┼)
  • mahsulot_teglar — mahsulotlar va teglar orasidagi Many-to-Many (19-dars)
  • buyurtma_qatorlari — buyurtmalar va mahsulotlar orasidagi Many-to-Many, o'z ma'lumoti bilan

Mermaid — diagrammani matn sifatida

Qo'lda chizish o'rniga — diagrammani kod bilan yozish. GitHub, GitLab, Notion, VS Code ularni avtomatik chizadi:

erDiagram
    TOIFALAR    |o--o{ MAHSULOTLAR        : "o'z ichiga oladi"
    MIJOZLAR    ||--o{ BUYURTMALAR        : beradi
    BUYURTMALAR ||--|{ BUYURTMA_QATORLARI : "tarkibi"
    MAHSULOTLAR ||--o{ BUYURTMA_QATORLARI : "sotiladi"
    MAHSULOTLAR ||--o{ MAHSULOT_TEGLAR    : ""
    TEGLAR      ||--o{ MAHSULOT_TEGLAR    : ""

    MIJOZLAR {
        int id PK
        varchar ism
        varchar email UK
        varchar telefon
    }
    BUYURTMALAR {
        int id PK
        int mijoz_id FK
        enum holat
        datetime yaratilgan
    }

Buni loyihaning README.md siga ```mermaid bloki ichida qo'ying — GitHub chiroyli diagramma ko'rsatadi. Diagramma kod bilan birga Git da yashaydi va yangilanadi.

Mermaid Ma'nosi
|| Aynan bitta
|o Nol yoki bitta
}| Bitta yoki ko'p
}o Nol yoki ko'p

Vositalar

Mavjud bazadan diagramma (reverse engineering)

Vosita Qanday
MySQL Workbench Database → Reverse Engineer → bazani tanlang → avtomatik diagramma
DBeaver Bazadagi jadvallarni tanlang → ER Diagram tab
DataGrip Jadvallar → o'ng tugma → Diagrams → Show Diagram

Yangi loyihaga qo'shilganda — birinchi ish. Foreign key lar to'g'ri belgilangan bo'lsa (7-dars), barcha bog'lanishlar avtomatik chiziladi.

Yangi loyihani loyihalash

Vosita Xususiyati
dbdiagram.io Matnli DSL dan diagramma, SQL eksport; bepul
drawSQL Vizual, jamoa bilan
MySQL Workbench Diagrammadan CREATE TABLE SQL ni yaratish (Forward Engineer)
draw.io / Excalidraw Erkin chizish — dastlabki muhokama uchun

dbdiagram.io misoli:

Table mijozlar {
  id int [pk, increment]
  ism varchar(100) [not null]
  email varchar(255) [unique, not null]
}

Table buyurtmalar {
  id int [pk, increment]
  mijoz_id int [ref: > mijozlar.id]
  holat varchar(20)
}

ref: > — "ko'p-ga-bitta" bog'lanish. Bir necha qatorda — diagramma ham, MySQL CREATE TABLE skripti ham.


Loyihalash jarayoni

Yangi loyiha uchun:

1. Ob'ektlarni toping — talablardagi otlar:

"Talaba kursga yoziladi. Kurs darslardan iborat. Talaba to'lov qiladi va kursni tugatgach sertifikat oladi."

→ talabalar, kurslar, darslar, to'lovlar, sertifikatlar

2. Munosabatlarni aniqlang — har bir juftlik uchun ikki savol (20-dars):

  • Talaba ↔ kurs: bitta talaba — ko'p kurs, bitta kurs — ko'p talaba → Many-to-Many → talaba_kurslar
  • Kurs → dars: bitta kurs — ko'p dars, dars — bitta kursda → One-to-Many
  • Talaba_kurs → sertifikat: bitta yozilishga — ko'pi bilan bitta sertifikat → One-to-One

3. Atributlarni qo'shing — har bir ob'ektning ustunlari va turlari (4-dars)

4. Normallashtiring — har bir ustunga "o'zgarsa nechta qator?" savoli (46-dars)

5. Chizing va muhokama qiling — buyurtmachi va jamoa bilan. Diagrammada xatoni tuzatish — SQL da tuzatishdan yuz barobar arzon

6. SQL ga aylantiring — migratsiyalar (8-dars)


Nima uchun shunday?

Nima uchun SQL kodini o'qish yetmaydi — diagramma nima beradi?

Chunki SQL — chiziqli matn, ma'lumotlar bazasi esa graf: jadvallar — tugunlar, foreign key lar — qirralar. Inson miyasi grafni matndan tiklashda yomon, rasmdan esa bir zumda o'qiydi. "Buyurtmadan toifaga qanday yetib boraman?" — diagrammada barmoq bilan yo'lni kuzatasiz, SQL da esa 5 ta faylni ochasiz. Bundan tashqari, diagramma — dasturchi bo'lmaganlar bilan umumiy til: buyurtmachi FOREIGN KEY ni bilmaydi, lekin "har bir buyurtma bitta mijozga tegishli" chizig'ini tushunadi.


Xulosa

Eslab qoling:

  • ER diagramma: entity (jadval) — to'rtburchak, relationship — chiziq
  • Crow's foot: ┼ bitta, ○ nol, < ko'p; ichkaridagi — minimum, tashqaridagi — maksimum
  • Mermaid erDiagram — diagramma kod sifatida, README da, Git da
  • Mavjud baza: Workbench / DBeaver — Reverse Engineer
  • Yangi loyiha: dbdiagram.io, drawSQL
  • Jarayon: otlar → munosabatlar → atributlar → normallashtirish → muhokama → SQL

Keyingi dars

49-dars: Naming Convention va Schema Design best practices