2-bo‘lim

ER model va mavjudliklar

Mavjudlik, atribut va bog'lanish tushunchalari, ER diagramma o'qish va chizish, matndan model tuzish.

🕑 11 daqiqa o‘qish 📄 843 so‘z 👁 1 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Uch asosiy tushuncha
  2. Matndan modelga
  3. Modelni jadvalga aylantirish
  4. Bog'lanishlar orqali savol berish
  5. Kardinallik - nechtaga necha
  6. Ixtiyoriy va majburiy ishtirok
  7. Zaif mavjudlik
  8. Modelni tekshirish savollari
  9. Xulosa

Jadval yozishdan oldin qog'ozda chizish kerak. ER model - shu chizmaning standart tili.

Uch asosiy tushuncha #

ER modelning uch qurilish bloki Mavjudlik (entity) TALABA Haqiqiy dunyodagi narsa yoki tushuncha -> jadvalga aylanadi Atribut ism, yosh Mavjudlikning xususiyati -> ustunga aylanadi Bog'lanish o'qiydi Mavjudliklar orasidagi aloqa -> kalitga aylanadi Matndagi otlar - mavjudlik, fe'llar - bog'lanish
ER model - jadvalga aylantirilishdan oldingi bosqich

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:

OtMavjudlikmi?Izoh
O'qituvchiHaO'z xususiyatlari bor
O'quvchiHaO'z xususiyatlari bor
FanHaAlohida ro'yxat
SinfHaAlohida ro'yxat
BahoHaO'quvchi va fanni bog'laydi
MaktabYo'qBitta - 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 #

SQL
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');
SQL
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;
Natija
+----------+----------+------+
| ism      | familiya | sinf |
+----------+----------+------+
| Husanboy | Qodirov  | 9-A  |
| Malika   | Yusupova | 9-A  |
| Kamola   | Rasulova | 9-B  |
+----------+----------+------+

Bog'lanishlar orqali savol berish #

SQL
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;
Natija
+----------+-------------+------+-----------------+
| 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 #

Uch xil bog'lanish 1 : 1 Foydalanuvchi Profil Har birida bittadan 1 : N Sinf O'quvchi O'quvchi Eng ko'p uchraydigan N : M O'quvchi O'quvchi Fan Fan Bog'lovchi jadval kerak Har birini 4 va 5-bo'limlarda batafsil ko'ramiz
Kardinallikni to'g'ri aniqlash sxemaning yarmini hal qiladi
Kardinallikni aniqlash uchun ikki savol

Har bog'lanish uchun ikki tomondan so'rang:

  1. "Bitta sinfda nechta o'quvchi bo'lishi mumkin?" → ko'p
  2. "Bitta o'quvchi nechta sinfda bo'ladi?" → bitta

Demak: sinf 1 : N o'quvchi.

Yana bir misol:

  1. "Bitta o'quvchi nechta fandan baho oladi?" → ko'p
  2. "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 #

SQL
-- 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;
Natija
+-------------+---------------+
| nom         | oqituvchi     |
+-------------+---------------+
| Matematika  | 1             |
| Fizika      | 1             |
| Ingliz tili | 2             |
| Tarix       | tayinlanmagan |
+-------------+---------------+
NOT NULL - bu biznes qarori

NULL ruxsat berish yoki bermaslik - texnik emas, biznes masalasi:

UstunNULL mumkinmiNima uchun
oquvchilar.sinf_idYo'qSinfsiz o'quvchi bo'lmaydi
fanlar.oqituvchi_idHaFan hali tayinlanmagan bo'lishi mumkin
oquvchilar.ismYo'qIsmsiz o'quvchi bo'lmaydi
oquvchilar.telefonHaHammada 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 #

SQL
-- 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;
Natija
+--------------+
| baholar_soni |
+--------------+
|            4 |
+--------------+

Baholari bor o'quvchini o'chirib bo'lmaydi:

SQL
DELETE FROM oquvchilar WHERE id = 1;
Natija
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:

SQL
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;
Zaif mavjudlik (weak entity)

Kuchli mavjudlik o'z-o'zicha mavjud bo'la oladi: o'quvchi, fan, o'qituvchi.

Zaif mavjudlik esa boshqasiz ma'nosini yo'qotadi:

Zaif mavjudlikKimga bog'liq
BahoO'quvchi + fan
Buyurtma qatoriBuyurtma
IzohMaqola
To'lovShartnoma

Ular odatda:

  • NOT NULL tashqi 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 #

Sxemani topshirishdan oldin
SavolNima 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.

Amaliy topshiriq
  1. Matndan otlarni ajratib, mavjudlik nomzodlarini toping.
  2. Fe'llarni ajratib, bog'lanishlarni aniqlang.
  3. Qaysi ot mavjudlik emasligini tushuntiring.
  4. Beshta jadvalni yaratib, bog'lang.
  5. Uch jadvalni birlashtirib so'rov yozing.
  6. Har bog'lanish uchun ikki savol bering va kardinallikni toping.
  7. Qaysi ustun NULL bo'lishi mumkinligini asoslang.
  8. NOT NULL ni keyin qo'shish nima uchun qiyinligini ayting.
  9. Zaif mavjudlikka uch misol keltiring.
  10. 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 NULL qo'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.

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.