ER Diagram — jadvallar va munosabatlarni chizish
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