Jadval cheklovlari (Constraints), Natural vs Surrogate keys, Composite PK va ON DELETE qoidalari
10-sinf BI va Machine Learning 3-hafta · 7-darsNOT NULL, UNIQUE, CHECK va DEFAULT cheklovlari orqali ma'lumotlar sifatini kafolatlash.
Natural vs Surrogate Key farqlari hamda ko'p ustunli Composite Primary Key `(hudud, yil)`.
Foreign Key, ON DELETE CASCADE/RESTRICT qoidalari va 3 ta relyatsion anomaliyani yengish.
Data Quality kafolati: NOT NULL, UNIQUE, CHECK va DEFAULT
Yosh ustuniga -25 yozish mumkin, talaba ismi bo'sh qolishi mumkin, bir xil pasport 10 kishiga kiritilishi mumkin.
Bunday baza tez orada ifloslanadi va analitika uchun yaroqsiz bo'lib qoladi!
Baza darajasidagi tekshiruvlar noto'g'ri qiymatlarni darhol to'xtatadi va qabul qilmaydi.
Dasturda xato bo'lsa ham, baza ma'lumotlar tozaligini o'zi himoya qiladi!
Ustunda bo'sh (NULL) qiymat bo'lishiga mutlaqo yo'l qo'ymaydi.
Ustundagi barcha qiymatlar takrorlanmas (yagona) bo'lishi shart.
Mantiqiy shartni tekshiradi: masalan, `CHECK (yosh >= 6 AND yosh <= 18)`.
Qiymat berilmasa, avtomatik standart qiymat o'rnatadi (`DEFAULT 'Faol'`).
Natural Key, Surrogate Key va ko'p ustunli birikmalar
Haqiqiy hayotdan olingan unikal xususiyat:
Kamchiligi: Real hayotda tashqi standartlar o'zgarishi mumkin.
Baza tomonidan sun'iy ravishda yaratiladigan son:
Sanoatda DWH va ilovalar uchun standart tanlov hisoblanadi.
Ta'lim statistikasida bitta viloyat (masalan, Toshkent) har yili takrorlanadi. Bitta yil (masalan, 2024) barcha viloyatlarda takrorlanadi.
Ammo (hudud, yil) juftligi har bir satr uchun mutlaqo unikaldir!
CREATE TABLE ta_lim_kpi (
hudud TEXT NOT NULL,
yil INTEGER NOT NULL,
maktablar_soni INTEGER,
PRIMARY KEY (hudud, yil)
);
Ikkita ustun birgalikda yagona birlamchi kalitni tashkil etadi.
Referential Integrity, ON DELETE CASCADE, RESTRICT va SET NULL
Agar bog'langan bola yozuvlar bo'lsa, ota yozuvni o'chirish taqiqlanadi (xato beradi).
Standart qoidaOta yozuv o'chirilishi bilan unga bog'liq barcha bolalar yozuvlari ham avtomatik o'chadi.
Tozalash uchunOta o'chirilganda bola yozuvlar saqlanadi, lekin ularning FK ustuni NULL bo'lib qoladi.
Tarixni saqlashMijoz o'chirilganda uning barcha kredit shartnomalariga CASCADE qo'llash to'g'rimi?
Bankda moliyaviy tarix hech qachon avtomatik o'chirilmasligi shart. Bu yerda RESTRICT ishlatiladi!
Foydalanuvchi akkaunti o'chirilganda uning savatchasidagi vaqtinchalik tovarlariga-chi?
Chunki egasi yo'q bo'lgan savatcha bazada ortiqcha axlat yozuv bo'lib qolmasligi lozim.
Qo'shish, yangilash va o'chirish anomaliyalari hamda Python sqlite3 kodi
Qo'shish muammosi: Yangi o'qituvchini bazaga kiritish uchun albatta sinf yoki dars ochilgan bo'lishi shart bo'lib qoladi.
Yangilash muammosi: Maktab direktori o'zgarganda, bitta ismni 1000 ta qatorda alohida o'zgartirish kerak bo'ladi.
O'chirish muammosi: Maktabdagi oxirgi o'quvchi o'chirilishi bilan birga maktabning o'zi ham bazadan tasodifan o'chib ketadi.
import sqlite3
conn = sqlite3.connect('data/maktab.db')
cursor = conn.cursor()
cursor.execute("PRAGMA foreign_keys = ON;") # Majburiy qator!
cursor.execute("""
CREATE TABLE IF NOT EXISTS maktablar (
maktab_id INTEGER PRIMARY KEY AUTOINCREMENT,
raqam INTEGER NOT NULL,
hudud TEXT NOT NULL,
sigim INTEGER NOT NULL CHECK (sigim > 0),
UNIQUE (raqam, hudud)
);
""")
cursor.execute("""
CREATE TABLE IF NOT EXISTS oquvchilar (
oquvchi_id INTEGER PRIMARY KEY AUTOINCREMENT,
maktab_id INTEGER NOT NULL,
ism TEXT NOT NULL,
sinf INTEGER CHECK (sinf BETWEEN 1 AND 11),
FOREIGN KEY (maktab_id) REFERENCES maktablar(maktab_id) ON DELETE CASCADE
);
""")
conn.commit()
# CHECK xatosi: sig'im manfiy bo'lishi mumkin emas
try:
cursor.execute("INSERT INTO maktablar (raqam, hudud, sigim) VALUES (5, 'Toshkent', -100);")
conn.commit()
except sqlite3.IntegrityError as err:
print("Xato ushlandi (CHECK buzildi):", err)
# UNIQUE xatosi: bir xil hudud va maktab raqami qayta kiritilmaydi
try:
cursor.execute("INSERT INTO maktablar (raqam, hudud, sigim) VALUES (1, 'Toshkent', 800);")
cursor.execute("INSERT INTO maktablar (raqam, hudud, sigim) VALUES (1, 'Toshkent', 900);")
conn.commit()
except sqlite3.IntegrityError as err:
print("Xato ushlandi (UNIQUE buzildi):", err)
Nima uchun ta'lim statistikasida hududiy ko'rsatkichlar uchun `PRIMARY KEY (hudud, yil)` murakkab kaliti ishlatiladi?
Bemorlar jadvalini yaratib, `CHECK` cheklovi orqali qon guruhi (I, II, III, IV) nazoratini o'rnating.
10 daqiqa`ON DELETE CASCADE` orqali o'qituvchi o'chirilganda uning dars soatlari avtomatik tozalanishini sinang.
15 daqiqa`(oquvchi_id, fan_id, chorak)` ustunlaridan Composite Primary Key tuzib, takroriy bahoni bloklang.
20 daqiqa