2-bo‘lim
ER model va mavjudliklar
Mavjudlik, atribut va bog'lanish tushunchalari, ER diagramma o'qish va chizish, matndan model tuzish.
Ushbu bo‘lim mundarijasi
Jadval yozishdan oldin qog'ozda chizish kerak. ER model - shu chizmaning standart tili.
Uch asosiy tushuncha #
Matndan modelga #
Talab shunday yozilgan bo'lsin:
Maktabda o'qituvchilar va o'quvchilar bor. Har bir o'qituvchi bir necha fan o'qitadi. O'quvchilar sinflarga bo'lingan. Har bir o'quvchi fandan baho oladi.
Otlarni ajratamiz - bular mavjudlik nomzodlari:
| Ot | Mavjudlikmi? | Izoh |
|---|---|---|
| O'qituvchi | Ha | O'z xususiyatlari bor |
| O'quvchi | Ha | O'z xususiyatlari bor |
| Fan | Ha | Alohida ro'yxat |
| Sinf | Ha | Alohida ro'yxat |
| Baho | Ha | O'quvchi va fanni bog'laydi |
| Maktab | Yo'q | Bitta - saqlashning hojati yo'q |
Fe'llarni ajratamiz - bular bog'lanish:
- o'qituvchi o'qitadi fanni;
- o'quvchi tegishli sinfga;
- o'quvchi oladi bahoni fandan.
Modelni jadvalga aylantirish #
CREATE TABLE sinflar (
id INT PRIMARY KEY AUTO_INCREMENT,
nom VARCHAR(10) NOT NULL UNIQUE
);
CREATE TABLE oqituvchilar (
id INT PRIMARY KEY AUTO_INCREMENT,
ism VARCHAR(100) NOT NULL,
familiya VARCHAR(100) NOT NULL
);
CREATE TABLE fanlar (
id INT PRIMARY KEY AUTO_INCREMENT,
nom VARCHAR(50) NOT NULL UNIQUE,
oqituvchi_id INT,
FOREIGN KEY (oqituvchi_id) REFERENCES oqituvchilar(id)
);
CREATE TABLE oquvchilar (
id INT PRIMARY KEY AUTO_INCREMENT,
ism VARCHAR(100) NOT NULL,
familiya VARCHAR(100) NOT NULL,
sinf_id INT NOT NULL,
FOREIGN KEY (sinf_id) REFERENCES sinflar(id)
);
CREATE TABLE baholar (
id INT PRIMARY KEY AUTO_INCREMENT,
oquvchi_id INT NOT NULL,
fan_id INT NOT NULL,
ball TINYINT NOT NULL,
sana DATE NOT NULL,
FOREIGN KEY (oquvchi_id) REFERENCES oquvchilar(id),
FOREIGN KEY (fan_id) REFERENCES fanlar(id)
);
INSERT INTO sinflar (nom) VALUES ('9-A'), ('9-B');
INSERT INTO oqituvchilar (ism, familiya) VALUES
('Nodira', 'Karimova'), ('Aziza', 'Tosheva');
INSERT INTO fanlar (nom, oqituvchi_id) VALUES
('Matematika', 1), ('Fizika', 1), ('Ingliz tili', 2);
INSERT INTO oquvchilar (ism, familiya, sinf_id) VALUES
('Husanboy', 'Qodirov', 1),
('Malika', 'Yusupova', 1),
('Kamola', 'Rasulova', 2);
INSERT INTO baholar (oquvchi_id, fan_id, ball, sana) VALUES
(1, 1, 5, '2026-03-01'),
(1, 2, 4, '2026-03-02'),
(2, 1, 5, '2026-03-01'),
(3, 3, 3, '2026-03-03');
SELECT o.ism, o.familiya, s.nom AS sinf
FROM oquvchilar o
JOIN sinflar s ON s.id = o.sinf_id
ORDER BY o.id;
+----------+----------+------+
| ism | familiya | sinf |
+----------+----------+------+
| Husanboy | Qodirov | 9-A |
| Malika | Yusupova | 9-A |
| Kamola | Rasulova | 9-B |
+----------+----------+------+
Bog'lanishlar orqali savol berish #
SELECT o.ism AS oquvchi, f.nom AS fan, b.ball,
CONCAT(oq.ism, ' ', oq.familiya) AS oqituvchi
FROM baholar b
JOIN oquvchilar o ON o.id = b.oquvchi_id
JOIN fanlar f ON f.id = b.fan_id
JOIN oqituvchilar oq ON oq.id = f.oqituvchi_id
ORDER BY b.id;
+----------+-------------+------+-----------------+
| oquvchi | fan | ball | oqituvchi |
+----------+-------------+------+-----------------+
| Husanboy | Matematika | 5 | Nodira Karimova |
| Husanboy | Fizika | 4 | Nodira Karimova |
| Malika | Matematika | 5 | Nodira Karimova |
| Kamola | Ingliz tili | 3 | Aziza Tosheva |
+----------+-------------+------+-----------------+
To'g'ri model tuzilgan bo'lsa, murakkab savolga ham bitta so'rov bilan javob olinadi.
Kardinallik - nechtaga necha #
Har bog'lanish uchun ikki tomondan so'rang:
- "Bitta sinfda nechta o'quvchi bo'lishi mumkin?" → ko'p
- "Bitta o'quvchi nechta sinfda bo'ladi?" → bitta
Demak: sinf 1 : N o'quvchi.
Yana bir misol:
- "Bitta o'quvchi nechta fandan baho oladi?" → ko'p
- "Bitta fandan nechta o'quvchi baho oladi?" → ko'p
Demak: N : M - bog'lovchi jadval kerak.
Javob doim aniq bo'lmaydi va biznes qoidasiga bog'liq:
"Bitta buyurtmada nechta mijoz bo'ladi?"
Odatda bitta. Lekin oilaviy hisob bo'lsa - ko'p bo'lishi mumkin. Shuning uchun buyurtmachidan so'rash kerak, o'zingiz taxmin qilmang.
Ixtiyoriy va majburiy ishtirok #
-- oqituvchi_id NULL bo'lishi mumkin - fan o'qituvchisiz bo'lishi mumkin
INSERT INTO fanlar (nom, oqituvchi_id) VALUES ('Tarix', NULL);
-- sinf_id NOT NULL - o'quvchi albatta sinfga tegishli
SELECT nom, IFNULL(CAST(oqituvchi_id AS CHAR), 'tayinlanmagan') AS oqituvchi
FROM fanlar
ORDER BY id;
+-------------+---------------+
| nom | oqituvchi |
+-------------+---------------+
| Matematika | 1 |
| Fizika | 1 |
| Ingliz tili | 2 |
| Tarix | tayinlanmagan |
+-------------+---------------+
NOT NULL - bu biznes qaroriNULL ruxsat berish yoki bermaslik - texnik emas, biznes
masalasi:
| Ustun | NULL mumkinmi | Nima uchun |
|---|---|---|
oquvchilar.sinf_id | Yo'q | Sinfsiz o'quvchi bo'lmaydi |
fanlar.oqituvchi_id | Ha | Fan hali tayinlanmagan bo'lishi mumkin |
oquvchilar.ism | Yo'q | Ismsiz o'quvchi bo'lmaydi |
oquvchilar.telefon | Ha | Hammada bo'lmasligi mumkin |
Bu qarorlarni loyihalash paytida qabul qiling. Keyinchalik
NULL ruxsat etilgan ustunni NOT NULL ga o'tkazish uchun
mavjud barcha NULL larni to'ldirish kerak bo'ladi - bu
ko'pincha imkonsiz.
Aksincha yo'nalish oson: NOT NULL dan NULL ga o'tkazish
har doim mumkin.
Shuning uchun shubha bo'lsa NOT NULL qo'ying - keyin
bo'shatish oson.
Zaif mavjudlik #
-- Baho o'quvchisiz mavjud bo'la olmaydi - u ZAIF mavjudlik
-- Uning o'ziga xos ma'nosi faqat o'quvchi va fan kontekstida bor
SELECT COUNT(*) AS baholar_soni FROM baholar;
+--------------+
| baholar_soni |
+--------------+
| 4 |
+--------------+
Baholari bor o'quvchini o'chirib bo'lmaydi:
DELETE FROM oquvchilar WHERE id = 1;
ERROR 1451 (23000): Cannot delete or update a parent row:
a foreign key constraint fails (`maktab`.`baholar`, CONSTRAINT
`baholar_ibfk_1` FOREIGN KEY (`oquvchi_id`) REFERENCES `oquvchilar` (`id`))
Bu himoyani sxemadan ko'rish mumkin:
SELECT TABLE_NAME AS jadval, COLUMN_NAME AS ustun,
REFERENCED_TABLE_NAME AS kimga
FROM information_schema.KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = DATABASE() AND REFERENCED_TABLE_NAME IS NOT NULL
ORDER BY BINARY TABLE_NAME, ustun;
Kuchli mavjudlik o'z-o'zicha mavjud bo'la oladi: o'quvchi, fan, o'qituvchi.
Zaif mavjudlik esa boshqasiz ma'nosini yo'qotadi:
| Zaif mavjudlik | Kimga bog'liq |
|---|---|
| Baho | O'quvchi + fan |
| Buyurtma qatori | Buyurtma |
| Izoh | Maqola |
| To'lov | Shartnoma |
Ular odatda:
NOT NULLtashqi kalitga ega;- Ota o'chirilganda birga o'chiriladi (
ON DELETE CASCADE); - Ba'zan kompozit birlamchi kalit ishlatadi.
Yuqoridagi xato aynan shuni ko'rsatadi: o'quvchini o'chirish
uchun avval uning baholarini hal qilish kerak. 13-bo'limda buni
ON DELETE qoidalari bilan boshqarishni ko'ramiz.
Modelni tekshirish savollari #
| Savol | Nima uchun |
|---|---|
| Har jadvalda birlamchi kalit bormi? | Qatorni aniqlash uchun |
| Har bog'lanish tashqi kalit bilan mustahkamlanganmi? | Yetim qator bo'lmasin |
| Takrorlanadigan ma'lumot bormi? | Anomaliya manbai |
| Ko'p qiymatli ustun bormi? | 'a,b,c' - 6-bo'lim |
| Har ustun jadval mavzusiga tegishlimi? | 7-8 bo'limlar |
NULL ruxsatlari ongli berilganmi? | 11-bo'lim |
| Kelajakdagi talab sxemani buzmaydimi? | Kengaytiriluvchanlik |
Oxirgisi eng qiyin. Masalan: "har o'quvchining bitta sinfi bor" deb yozdingiz. Keyin maktab guruhlarga bo'linishni boshlasa - sxema o'zgaradi.
Buni oldindan bilib bo'lmaydi. Lekin ehtimoli yuqori o'zgarishlarni buyurtmachidan so'rab aniqlash mumkin.
- Matndan otlarni ajratib, mavjudlik nomzodlarini toping.
- Fe'llarni ajratib, bog'lanishlarni aniqlang.
- Qaysi ot mavjudlik emasligini tushuntiring.
- Beshta jadvalni yaratib, bog'lang.
- Uch jadvalni birlashtirib so'rov yozing.
- Har bog'lanish uchun ikki savol bering va kardinallikni toping.
- Qaysi ustun
NULLbo'lishi mumkinligini asoslang. NOT NULLni keyin qo'shish nima uchun qiyinligini ayting.- Zaif mavjudlikka uch misol keltiring.
- Tashqi kalit o'chirishga to'sqinlik qilishini sinang.
Xulosa #
- Mavjudlik jadvalga, atribut ustunga, bog'lanish kalitga aylanadi.
- Talab matnidagi otlar - mavjudlik, fe'llar - bog'lanish.
- Har bog'lanish uchun ikki tomondan savol bering.
- Kardinallik: 1:1, 1:N, N:M.
- Kardinallik biznes qoidasiga bog'liq - taxmin qilmang, so'rang.
NOT NULL- texnik emas, biznes qarori.- Shubha bo'lsa
NOT NULLqo'ying - keyin bo'shatish oson. - Zaif mavjudlik boshqasiz ma'nosini yo'qotadi.
- Tashqi kalit yetim qatorlarning oldini oladi.
Keyingi bo'limda kalitlarni batafsil ko'rib chiqamiz.
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.