Veritabanı yönetim sistemlerine giriş
Dosya sistemi yerine neden DBMS kullanılır, şema ile örnek farkı, üç seviyeli mimari, veri bağımsızlığı, DDL/DML ve transaction fikri. Dönem boyunca kullanacağımız üniversite veritabanı da burada tanıtılıyor.
Veritabanı dersi, dönemin geri kalanının dilini burada öğrendiğin bir giriş haftasıyla başlar. Sınavda bu hafta genelde tanım, sınıflandırma ve “hangisi?” sorularıyla çıkar: şema mı örnek mi, fiziksel mi mantıksal bağımsızlık mı, DDL mi DML mi, ACID’in hangi harfi. Kısa ama puan kaçırması kolay sorular. Aklında tutman gereken beş şey:
- DBMS = veri + o veriye erişen programlar topluluğu. Amaç veriyi hem kolay hem güvenli tutmak.
- Şema (schema) tasarımdır, örnek (instance) o anki veridir. Şema nadiren, örnek sürekli değişir.
- Üç seviye: dış (external), mantıksal (logical), fiziksel (physical). Aradaki bağımsızlık iki türlüdür.
- DDL yapıyı, DML veriyi değiştirir.
- Transaction ya tamamen olur ya hiç olmaz. ACID bunu dört özellikle anlatır.
Dönem boyunca kullanacağımız veritabanı
Bütün haftalarda aynı küçük üniversite veritabanını kullanacağız. Böylece ER diyagramı, ilişkisel cebir, SQL ve normalizasyon aynı tablolar üzerinde konuşulacak ve her sorgunun sonucunu elle kontrol edebileceksin. Altı tablo var:
department(dept_name, building, budget)instructor(inst_id, name, dept_name, salary)student(stu_id, name, dept_name, tot_cred)course(course_id, title, dept_name, credits)teaches(inst_id, course_id)takes(stu_id, course_id, grade)
Bu hafta sadece student tablosuna bakmamız yeterli:
| stu_id | name | dept_name | tot_cred |
|---|---|---|---|
| S1 | Ada | CS | 60 |
| S2 | Bora | CS | 30 |
| S3 | Cem | EE | 45 |
| S4 | Defne | MATH | 90 |
| S5 | Ece | CS | 15 |
| S6 | Firat | EE | 0 |
| S7 | Gizem | NULL | 10 |
Gizem’in bölümü henüz belli değil, bu yüzden NULL. Bu satır SQL haftasında bize çok iş görecek.
Dosya sistemi yerine neden DBMS?
Veritabanları yaygınlaşmadan önce kurumlar veriyi işletim sisteminin dosyalarında tutardı. Her bölüm kendi dosyasını ve kendi programını yazardı. Buna dosya işleme sistemi (file-processing system) denir. Bu yaklaşımın sınavda sayılması beklenen sorunları şunlar:
| Sorun | Üniversite örneği |
|---|---|
| Veri tekrarı ve tutarsızlık (redundancy, inconsistency) | Bora’nın bölümü hem kayıt ofisinin hem bölümün dosyasında var. Biri EE’ye güncellenir, diğeri CS kalır. |
| Veriye erişim zorluğu | “Kredisi 40’tan fazla öğrenciler” diye yeni bir soru gelince yeni program yazmak gerekir. |
| Veri izolasyonu (data isolation) | Veri farklı formatta, farklı dosyalara dağılmış. Birleştirmek zor. |
| Bütünlük sorunları (integrity problems) | “Ders kredisi 1 ile 6 arası olmalı” kuralı her programın içine gömülü. Yeni kural eklemek tüm programları değiştirmek demek. |
| Atomiklik sorunu (atomicity) | Para transferinin yarısında elektrik kesilirse bir hesaptan para çıkar, diğerine girmez. |
| Eşzamanlı erişim anomalileri (concurrent-access anomalies) | İki kişi aynı anda son kontenjanı alırsa ikisi de kayıt olur. |
| Güvenlik (security) | Muhasebe öğrencinin notlarını görmemeli. Dosyalarda ince ayarlı yetki yok. |
DBMS bu sorunların her birine merkezi bir çözüm getirir. Örneğin bütünlük kısıtları şemada bir kez yazılır ve DBMS her ekleme sırasında kontrol eder:
INSERT INTO course VALUES ('CS999', 'Test', 'CS', 9); -- credits 1..6 olmalı
INSERT INTO student VALUES ('S9', 'Ilke', 'PHYS', 0); -- PHYS bölümü yok
INSERT INTO student VALUES ('S1', 'Kopya', 'CS', 0); -- S1 zaten var
CHECK constraint failed: credits BETWEEN 1 AND 6
FOREIGN KEY constraint failed
UNIQUE constraint failed: student.stu_id
Üç satırın üçü de reddedildi. Hiçbir uygulama programı bu kontrolleri yazmak zorunda kalmadı.
Veri modelleri
Veri modeli (data model), veriyi, veriler arası ilişkileri, anlamı ve kısıtları tarif etmek için kullanılan kavramlar bütünüdür. Derste karşına çıkacak olanlar:
- İlişkisel model (relational model): Veri tablolarda (relation) tutulur. Bugün en yaygın model, dersin merkezi. 3. haftada ayrıntısı var.
- Varlık-ilişki modeli (entity-relationship, ER): Tasarım aşamasında kullanılan, varlıklar ve aralarındaki ilişkilerle düşünen model. 2. hafta.
- Nesne tabanlı model (object-based): Nesne yönelimli programlamadaki kalıtım, kapsülleme gibi fikirleri veriye taşır.
- Yarı yapılandırılmış model (semi-structured): Aynı türdeki kayıtların farklı alanları olabilir. JSON ve XML bunun örneği.
- Tarihsel olarak ağ (network) ve hiyerarşik (hierarchical) modeller de vardı, bugün nadir.
Şema ve örnek
Programlamadan bir benzetme: şema (schema) bir değişkenin tip tanımı, örnek (instance) o değişkenin o anki değeri gibidir.
student(stu_id, name, dept_name, tot_cred)bir şemadır. Kolonların adları, tipleri, anahtarlar, kısıtlar.- Yukarıdaki 7 satırlık tablo, şu anki örnektir.
Bir satır eklediğinde örnek değişir, şema aynı kalır. Doğrulamada INSERT sonrası satır sayısı 7’den 8’e çıktı, kolon sayısı 4 olarak kaldı. Şemayı değiştirmek için ALTER TABLE gibi bir DDL komutu gerekir ve bu nadir yapılan bir iştir.
TUZAK · “schema” iki anlamda kullanılır. Bazen tek bir tablonun yapısı (relation schema), bazen tüm veritabanının tasarımı (database schema) kastedilir. Sınavda bağlamdan anla. Her iki durumda da karşıtı “instance”tır.
Üç seviyeli mimari ve veri bağımsızlığı
DBMS, kullanıcıyı ayrıntılardan korumak için veriyi üç soyutlama seviyesinde tarif eder:
external (view) seviyesi danışman ekranı | muhasebe ekranı | ...
| (her kullanıcı grubu verinin bir parçasını görür)
logical (conceptual) seviyesi tüm tablolar, kolonlar, ilişkiler, kısıtlar
|
physical (internal) seviyesi dosyalar, bloklar, index'ler, kayıt düzeni
- Fiziksel seviye (physical level): Veri diskte nasıl duruyor? Heap dosyası mı, sıralı dosya mı, hangi kolonda B+ ağacı var?
- Mantıksal seviye (logical level): Hangi veri var ve aralarında ne ilişki var?
student,course,takestabloları ve kısıtları. DBA ve tasarımcı bu seviyede çalışır. - Dış seviye (view level): Belirli bir kullanıcının gördüğü kısım. Örneğin danışman sadece öğrencinin adını ve bölümünü görür, notları göremez.
Seviyeler arası eşlemeler (mapping) sayesinde bir seviyedeki değişiklik üsttekini bozmaz. Buna veri bağımsızlığı (data independence) denir.
| Tür | Ne değişiyor? | Kim korunuyor? | Örnek |
|---|---|---|---|
| Fiziksel veri bağımsızlığı | fiziksel şema | mantıksal şema ve uygulamalar | tot_cred üzerine index eklemek |
| Mantıksal veri bağımsızlığı | mantıksal şema | dış şemalar (view’lar) ve uygulamalar | student tablosunu ikiye bölüp eski adla view tanımlamak |
İki örneği de gerçekten çalıştırdık. İndex eklenmeden önce SQLite sorgu planı tüm tabloyu tarıyordu, sonra index kullandı, ama sonuç satırları aynı kaldı:
SELECT name FROM student WHERE tot_cred > 40
plan önce : SCAN student
plan sonra: SEARCH student USING INDEX idx_cred (tot_cred>?)
sonuç (iki durumda da): Ada, Cem, Defne
Mantıksal bağımsızlık için student tablosu student_core ve student_credit diye ikiye bölündü, ardından ikisini birleştiren student adlı bir view tanımlandı. Eski sorgu hiç değiştirilmeden aynı sonucu verdi:
CREATE VIEW student AS
SELECT c.stu_id, c.name, c.dept_name, k.tot_cred
FROM student_core c JOIN student_credit k USING (stu_id);
SELECT name FROM student WHERE dept_name = 'CS';
Ada
Bora
Ece
TUZAK · hangisi daha zor? Mantıksal veri bağımsızlığını sağlamak fiziksel olana göre daha zordur. Çünkü uygulamalar doğrudan tablo ve kolon adlarına bağlıdır. Bir kolonu silersen hiçbir view onu geri getiremez.
Veritabanı dilleri: DDL ve DML
SQL tek bir dildir ama komutları iki gruba ayrılır:
| Grup | Görevi | Komutlar |
|---|---|---|
| DDL (data definition language) | şemayı tanımlar, değiştirir | CREATE TABLE, ALTER TABLE, DROP TABLE, CREATE INDEX, CREATE VIEW |
| DML (data manipulation language) | veriyi sorgular, değiştirir | SELECT, INSERT, UPDATE, DELETE |
DDL’in çıktısı veri sözlüğüne (data dictionary) yazılır. Bu, “veri hakkında veri” (metadata) tutan özel bir tablolar topluluğudur. DBMS her sorgudan önce oraya bakar.
DML iki tarzda olabilir. Prosedürel (procedural) DML’de “veriyi nasıl bulacağını” adım adım sen söylersin. Bildirimsel (declarative) DML’de sadece “ne istediğini” söylersin, nasıl bulunacağına DBMS karar verir. SQL bildirimseldir:
SELECT stu_id, name FROM student WHERE tot_cred > 40;
S1 | Ada
S3 | Cem
S4 | Defne
Bu sorguda hangi index’in kullanılacağını, satırların hangi sırayla okunacağını yazmadık. Bunu sorgu işlemcisi (query processor) seçti. 12. ve 13. haftalar tam olarak bu seçimin nasıl yapıldığını anlatıyor.
Transaction ve ACID
Transaction (işlem), mantıksal olarak tek bir iş sayılan işlemler dizisidir. Klasik örnek para transferi: A’dan çık, B’ye ekle. İkisi birlikte olmalı. DBMS’in her transaction için verdiği dört söz:
| Harf | Özellik | Anlamı |
|---|---|---|
| A | Atomicity (atomiklik) | Ya tüm adımlar olur ya hiçbiri. Yarım kalan iş geri alınır. |
| C | Consistency (tutarlılık) | Tutarlı bir durumdan başlayan transaction, tutarlı bir durumda biter. |
| I | Isolation (yalıtım) | Aynı anda çalışan transaction’lar birbirinin ara hâlini görmez. |
| D | Durability (kalıcılık) | COMMIT edilen değişiklik çökmeden sonra da kalır. |
Atomikliği SQLite’ta denedik. Hesaplar A = 500, B = 200 ve kısıt balance >= 0. Transaction önce B’ye 700 ekliyor, sonra A’dan 700 düşmeye çalışıyor:
BEGIN
UPDATE account SET balance = balance + 700 WHERE acc = 'B' -- başarılı, B = 900
UPDATE account SET balance = balance - 700 WHERE acc = 'A' -- CHECK hatası (A = -200 olurdu)
ROLLBACK
sonuç: A = 500, B = 200
İlk UPDATE başarılı olduğu hâlde ROLLBACK onu da geri aldı. Geçerli bir 300’lük transfer ise COMMIT ile tamamlandı: A = 200, B = 500 ve toplam 700 korundu.
Kullanıcılar ve DBMS’in parçaları
Bir veritabanıyla dört tür insan konuşur:
- Naive kullanıcı: Hazır arayüzleri kullanır. Ders kayıt sayfasından ders seçen öğrenci.
- Uygulama programcısı (application programmer): O arayüzleri yazar. SQL’i program içinden çağırır.
- Sophisticated kullanıcı: Doğrudan sorgu yazar ya da analiz araçları kullanır. Veri analisti.
- Veritabanı yöneticisi (DBA, database administrator): Şemayı tanımlar, fiziksel düzeni ve index’leri seçer, yetki verir, yedek alır, performansı izler.
DBMS’in içinde ise üç ana parça vardır. Depolama yöneticisi (storage manager) veriyi diske yazıp okur, tampon (buffer) yönetimini yapar. Sorgu işlemcisi (query processor) SQL’i ayrıştırır, en ucuz planı seçer ve çalıştırır. Transaction yöneticisi (transaction manager) eşzamanlılık kontrolü ve çökme sonrası kurtarma (recovery) ile ACID’i sağlar.
Sık yapılan hatalar
| Yanlış düşünce | Doğrusu |
|---|---|
| Şema sık değişir, örnek sabittir | Tersi: örnek her INSERT/UPDATE/DELETE ile değişir |
DELETE bir DDL komutudur | DELETE satır siler, DML’dir. Tabloyu DROP TABLE siler (DDL) |
CREATE INDEX DML’dir | Index bir yapıdır, DDL’dir |
| Index eklemek mantıksal veri bağımsızlığıdır | Fiziksel seviyede değişiklik, fiziksel bağımsızlık |
| Mantıksal bağımsızlık daha kolaydır | Daha zordur, uygulamalar tablo ve kolon adlarına bağlı |
| Atomiklik ile kalıcılık aynı şey | Atomiklik yarım işi geri alır, kalıcılık biten işi korur |
| Bütünlük kurallarını uygulama kontrol eder | DBMS şemadaki kısıtlarla kendisi kontrol eder (CHECK, FK, PK) |
| SQL prosedüreldir | SQL bildirimseldir: ne istediğini yazarsın, nasıl yapılacağını DBMS seçer |
Kendini test et
Sınavdaki gibi İngilizce sorular. Önce kâğıt kalemle çöz, sonra cevabı aç.
In a database, which one changes frequently over time: the schema or the instance?
Cevabı göster
Şema (schema) tablonun tasarımıdır: hangi kolonlar, hangi tipler, hangi kısıtlar. Nadiren değişir. Örnek (instance) ise belirli bir andaki satırların tamamıdır. Her INSERT, UPDATE, DELETE örneği değiştirir. Doğrulamada student tablosuna bir satır eklendiğinde satır sayısı 7'den 8'e çıktı, kolon sayısı 4 olarak kaldı.
Classify each statement as DDL or DML: (1) SELECT, (2) ALTER TABLE, (3) DELETE, (4) CREATE INDEX.
Cevabı göster
DDL (data definition language) yapıyı tanımlar: CREATE, ALTER, DROP. Index de bir yapı olduğu için CREATE INDEX DDL'dir. DML (data manipulation language) verinin kendisiyle uğraşır: SELECT, INSERT, UPDATE, DELETE. Tuzak: DELETE satır siler, tabloyu değil. Tabloyu silen DROP TABLE DDL'dir.
Which of the following is not a typical problem of a file-processing system?
- Data redundancy and inconsistency
- Difficulty in accessing data
- Concurrent-access anomalies
- Physical data independence
Cevabı göster
İlk üçü dosya sistemlerinin klasik dertleridir: aynı bilgi birden çok dosyada (redundancy) ve bir kopyası güncellenince tutarsızlık; her yeni soru için yeni program yazma zorunluluğu; iki kullanıcının aynı anda yazmasıyla bozulan veri. Fiziksel veri bağımsızlığı ise bir problem değil, DBMS'in getirdiği bir avantajdır.
The DBA adds a B+ tree index on student(tot_cred). No application code changes, and every query returns the same rows. Which kind of data independence does this illustrate?
Cevabı göster
Değişen şey verinin nasıl saklandığı ve nasıl bulunduğu, yani fiziksel (internal) seviye. Mantıksal şema aynı kaldı, uygulamalar etkilenmedi. Doğrulamada tot_cred > 40 sorgusunun planı SCAN student iken index sonrası SEARCH student USING INDEX idx_cred oldu, sonuç satırları aynı kaldı.
The student table is split into student_core(stu_id, name, dept_name) and student_credit(stu_id, tot_cred). A view named student that joins them is created, so old programs keep working. Which kind of data independence is this?
Cevabı göster
Bu sefer kavramsal (logical) şema değişti: bir tablo ikiye bölündü. Dış seviyedeki programlar ise view sayesinde aynı arayüzü görüyor. Kavramsal şemadaki değişikliğin dış şemaları bozmaması mantıksal veri bağımsızlığıdır. Doğrulamada eski sorgu SELECT name FROM student WHERE dept_name = 'CS' view üzerinden yine Ada, Bora, Ece döndü.
Using the sample student table, write an SQL query that lists the names of students in the CS department, and give the result.
Cevabı göster
WHERE satırları süzer, SELECT istenen kolonu seçer. dept_name değeri 'CS' olan satırlar S1 (Ada), S2 (Bora), S5 (Ece). S7 Gizem'in bölümü NULL olduğu için eşitlik testi onu getirmez. Sorgu SQLite'ta çalıştırıldı.
How many rows does SELECT * FROM student WHERE tot_cred >= 30; return on the sample data?
Cevabı göster
tot_cred değerleri: Ada 60, Bora 30, Cem 45, Defne 90, Ece 15, Firat 0, Gizem 10. 30 ve üstü olanlar Ada, Bora, Cem, Defne. >= olduğu için Bora (tam 30) dahil. Sonuç 4 satır.
The statement INSERT INTO student VALUES ('S9', 'Ilke', 'PHYS', 0); is executed on the sample database. What happens and why?
Cevabı göster
student.dept_name, department(dept_name) tablosuna referans veren bir yabancı anahtardır (foreign key). department tablosunda sadece CS, EE, MATH, BIO var. 'PHYS' olmadığı için DBMS satırı reddeder. Bu, bütünlük kısıtının (integrity constraint) uygulama kodu yerine DBMS tarafından korunmasına bir örnek. SQLite 'FOREIGN KEY constraint failed' hatası verdi.
Accounts: A = 500, B = 200, with constraint balance >= 0. A transaction runs B := B + 700 and then A := A - 700; the second update violates the constraint and the transaction is rolled back. What are the final balances, and which ACID property guarantees this?
Cevabı göster
İlk UPDATE başarılı olsa bile transaction bütün olarak tamamlanamadı. Atomiklik (atomicity) 'ya hepsi ya hiçbiri' der: ROLLBACK ilk güncellemeyi de geri alır. Bakiyeler başlangıçtaki gibi 500 ve 200 kalır. SQLite'ta BEGIN, iki UPDATE, CHECK hatası ve ROLLBACK ile birebir denendi.
A transaction commits, and one second later the server loses power. After restart, the committed changes are still there. Which ACID property is this?
Cevabı göster
Kalıcılık (durability): COMMIT edilmiş değişiklik sistem çökse bile kaybolmaz. DBMS bunu log (günlük) dosyası ve kurtarma (recovery) mekanizmasıyla sağlar. Atomiklik ile karıştırma: atomiklik yarım kalan işin geri alınması, kalıcılık tamamlanan işin korunmasıdır.
In the three-schema architecture, at which level is each described? (a) records of student are stored in a heap file with a B+ tree on stu_id; (b) an advisor's screen shows only name and dept_name of students.
Cevabı göster
(a) Dosya düzeni ve index, verinin diskte nasıl tutulduğunu anlatır: iç (physical/internal) seviye. (b) Belirli bir kullanıcı grubuna verinin bir parçasını gösteren görünüm dış (external/view) seviyedir. Arada kavramsal (logical) seviye var: tüm tablolar, kolonlar, kısıtlar.
Which user type writes no SQL and interacts with the database only through forms such as a course registration web page?
- Database administrator
- Application programmer
- Sophisticated user
- Naive user
Cevabı göster
Naive (son) kullanıcı hazır arayüzü kullanır: ders kayıt sayfasında düğmeye basan öğrenci gibi. Uygulama programcısı o sayfanın kodunu yazar, sophisticated kullanıcı (analist) doğrudan sorgu yazar, DBA ise şemayı, yetkileri ve fiziksel düzeni yönetir.
Doğrulama: Tüm SQL örnekleri ve cevaplar node:sqlite (SQLite 3.53) ile çalıştırıldı: verify/SEN2104/01.mjs. Kısıt ihlalleri (CHECK, FK, PK), ROLLBACK ile atomiklik, view ile mantıksal veri bağımsızlığı ve index ile değişen sorgu planı (EXPLAIN QUERY PLAN) gerçekten denendi.