Faylli tizimlardan relyatsion modelga, Edgar Codd kashfiyoti, ACID tamoyillari va SQL
10-sinf BI va Machine Learning 2-hafta · 6-darsNega CSV va JSON katta tizimlarda yetarli emas? Concurrency, yaxlitlik va xavfsizlik.
Edgar Codd modeli, jadvallar anatomiyasi, Primary Key (PK) va Foreign Key (FK).
Tranzaksiyalarning 4 ta kafolati, ERD tushunchasi va Python `sqlite3` da JOIN so'rovlari.
Fayllar (CSV, JSON) nega yetarli emas va RDBMS tizimlarining tub ustunliklari
1000 kishi bir vaqtda yozganda fayl qulflanadi (file lock) yoki ma'lumotlar butkul buziladi.
Hech qanday cheklov yo'q: yosh ustuniga matn yozish mumkin, tekshiruvlar yo'q!
Parallel foydalanish (Concurrency), qat'iy ma'lumot yaxlitligi, tranzaksiyalar va indeksatsiya.
B-Tree indekslar orqali milliardlab satrlar ichidan qidiruv bir necha millisekundda!
Ko'p foydalanuvchilar bir vaqtda to'siqsiz yoza oladi.
Qat'iy tiplar va relyatsion qoidalar buzilishiga yo'l qo'yilmaydi.
Har bir foydalanuvchiga alohida kirish huquqlari (ACL).
Indekslar orqali tezkor va samarali qidiruv mexanizmi.
Edgar Codd taklif etgan relyatsion tuzilma, jadvallar va kalitlar tizimi
1970-yilda IBM olimi Edgar Codd ma'lumotlarni jadvallar (relations) ko'rinishida tasvirlash va SQL kabi deklarativ til bilan boshqarish modelini yaratdi.
Ushbu kashfiyot uchun Edgar Codd informatika bo'yicha Tyuring mukofotini oldi!
Jadvaldagi har bir qatorni bir-biridan qat'iy va unikal ajratib turuvchi asosiy ustun.
UNIQUE: Hech qachon ikkita satrda bir xil PK qiymati bo'lishi mumkin emas!
NOT NULL: PK ustuni hech qachon bo'sh (bo'shliq / None) qolishi mumkin emas!
Boshqa jadvalning Primary Key ustuniga ishora qiluvchi va jadvallarni o'zaro mantiqiy bog'lovchi kalit.
Masalan, `orders` jadvalidagi `customer_id` ustuni `customers` jadvalidagi `customer_id` ga bog'lanadi.
Baza mavjud bo'lmagan mijoz nomiga buyurtma ochishga yo'l qo'ymaydi!
Yetim yozuvlar (Orphan records) paydo bo'lishining oldi to'liq olinadi.
O'quvchining ismi PK bo'la oladimi?
Chunki maktabda bir xil ismli bir nechta o'quvchi bo'lishi mumkin. PK faqat takrorlanmas (unikal) bo'lishi shart.
FK ustunida takrorlanuvchi qiymatlar bo'lishi mumkinmi?
Chunki bitta mijoz do'kondan bir nechta buyurtma amalga oshirishi mumkin (1:N munosabat).
Tranzaksiyalarning 4 ta oltin kafolati: Atomicity, Consistency, Isolation, Durability
Bo'linmaslik: Tranzaksiya yo 100% to'liq bajariladi, yo zarracha xatoda bekor qilinadi (Rollback).
Muvofiqlik: Baza barcha qoidalar va cheklovlarga qat'iy mos kelgandagina o'zgarishni qabul qiladi.
Izolyatsiya: Bir vaqtda parallel ishlayotgan tranzaksiyalar bir-biriga xalaqit bermaydi.
Bardoshlilik: Tasdiqlangan (COMMIT) ma'lumot elektr o'chsa ham diskda ishonchli saqlanadi.
Alining hisobidan 100 000 so'm balans kamaytiriladi.
Tarmoq yoki elektr to'satdan uzildi. Valiga pul yetib bormadi.
RDBMS tranzaksiyani butunlay bekor qiladi va Alining 100 000 so'mini joyiga qaytaradi!
Entity-Relationship modeli, Python sqlite3 moduli va relyatsion bog'langan so'rovlar
Bitta fuqaro — bitta pasport. Bitta talaba — bitta talabalik guvohnomasi.
Bitta sinfda ko'p o'quvchi. Bitta mijozda ko'p buyurtma. Eng keng tarqalgan tur.
Bitta talaba ko'p kursga qatnaydi, bitta kursda ko'p talaba o'qiydi (oraliq jadval kerak).
import sqlite3
conn = sqlite3.connect('data/maktab.db')
cursor = conn.cursor()
cursor.execute("PRAGMA foreign_keys = ON;")
# 1. Customers jadvali (Ota jadval)
cursor.execute("""
CREATE TABLE IF NOT EXISTS customers (
customer_id INTEGER PRIMARY KEY AUTOINCREMENT,
ism TEXT NOT NULL,
telefon TEXT UNIQUE NOT NULL
);
""")
# 2. Orders jadvali (Bolalar jadvali - FK orqali bog'langan)
cursor.execute("""
CREATE TABLE IF NOT EXISTS orders (
order_id INTEGER PRIMARY KEY AUTOINCREMENT,
customer_id INTEGER NOT NULL,
summa REAL NOT NULL,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
""")
conn.commit()
# Ikkala jadvalni umumiy customer_id bo'yicha birlashtirib o'qish
cursor.execute("""
SELECT
orders.order_id,
customers.ism,
customers.telefon,
orders.summa
FROM orders
INNER JOIN customers ON orders.customer_id = customers.customer_id;
""")
for qator in cursor.fetchall():
print(f"Buyurtma #{qator[0]} | Xaridor: {qator[1]} | Summa: {qator[3]:,} so'm")
Agar bazada customer_id = 99 bo'lgan mijoz bo'lmasa va biz orders ga customer_id = 99 bilan buyurtma qo'shmoqchi bo'lsak, RDBMS qanday munosabat bildiradi?
Python sqlite3 yordamida maktab bazasini oching va 2 ta mijoz qo'shing.
10 daqiqaOrders jadvalini yaratib, mavjud bo'lmagan mijoz ID si bilan xatolikni test qiling.
15 daqiqaCustomers va Orders jadvallarini `INNER JOIN` orqali birlashtirib chiroyli hisobot chiqaring.
20 daqiqa