CENG208 — Ders Genel Bilgisi
CENG208 Veritabanı Yönetim Sistemleri dersi, öğrencilere veritabanı dünyasının temellerini kapsamlı biçimde öğretmeyi hedefler. Ders boyunca ilişkisel veri modeli, SQL, sorgulama teknikleri, normalizasyon, işlem yönetimi ve güvenlik gibi kritik konular ele alınır.
| Değerlendirme | Ağırlık | Görsel |
|---|---|---|
| Vize (Midterm) | 40% | Yazılı sınav |
| Final | 50% | Yazılı sınav |
| Proje | 10% | 5 kişilik gruplar |
Öğrenme Hedefleri: Veritabanı temelleri, ilişkisel veri modeli ve SQL; ilişkisel cebir, sorgular, join'ler ve normalizasyon; transaction işleme, eş zamanlılık ve kurtarma; RDBMS'te güvenlik ve gizlilik; sorgu optimizasyon yöntemleri; ilişkisel veritabanı tasarımı ve uygulamasında pratik deneyim.
Veritabanı ve Veritabanı Sistemi Nedir?
Bir veritabanı (database), bir bilgisayarda depolanan veri koleksiyonudur. Bu veriler birbirinden bağımsız değil; mantıksal olarak ilişkili ve anlamlı biçimde organize edilmiş kayıtlardır.
Veritabanı: Bir bilgisayarda saklanan, tipik olarak kayıtlar (records) halinde düzenlenmiş veri koleksiyonudur. Örnek: bir üniversitenin öğrenci bilgileri ve aldıkları dersler.
Gerçek hayatta veritabanları çok farklı alanlar için kullanılır. Bunların başlıcaları şunlardır:
- Çalışan kayıtları (Employee records) — insan kaynakları sistemleri
- Tıbbi kayıtlar (Medical records) — hastane bilgi sistemleri
- Satış kayıtları (Sales records) — e-ticaret ve perakende sistemleri
Bir üniversite veritabanı örneğinde beş tür kayıt bulunur: STUDENT (öğrenci), DEPT (bölüm), COURSE (ders), SECTION (ders şubesi) ve ENROLL (kayıt/not). Bu kayıtlar veritabanının kavramsal resmini oluşturur; ancak bu resim, kayıtların nasıl depolandığını ya da nasıl erişildiğini göstermez.
Veritabanı Sistemi (Database System): Bir veritabanındaki kayıtları yöneten yazılımdır. Veriyi depolama, arama, güncelleme ve silme işlemlerini organize eden ve yöneten katmandır.
Bir Veritabanı Sisteminin Gereksinimleri
İyi tasarlanmış bir veritabanı sisteminin yerine getirmesi gereken beş temel gereksinim vardır. Bu gereksinimler, gerçek dünyadaki uygulamaların ihtiyaçlarından doğmuştur:
- Kalıcı olmalı (Must be persistent): Veriler, program kapandıktan sonra da kaybolmamalıdır. Elektrik kesilse bile veri bütünlüğü korunmalıdır.
- Çok büyük olabilir (Can be very large): Gerçek dünya veritabanları milyarlarca kayıt içerebilir. Sistem bu ölçekte de verimli çalışmalıdır.
- Paylaşımlıdır (Get shared): Birden fazla kullanıcı ya da uygulama aynı anda aynı veriye erişebilir. Bu erişimler güvenli ve tutarlı olmalıdır.
- Doğru tutulmalıdır (Must be kept accurate): Veritabanı yanlış ya da tutarsız veri içermemelidir. Kısıtlamalar ve denetimler bu doğruluğu sağlar.
- Kullanılabilir olmalıdır (Must be usable): Veri kolayca sorgulanabilir, güncellenebilir ve yönetilebilir olmalıdır. Kullanıcılar karmaşık altyapı detaylarıyla uğraşmak zorunda kalmamalıdır.
Kayıt Depolama — Metin Dosyaları
Veritabanlarının kalıcı olması gerektiğinden, kayıtların bir yerde fiziksel olarak tutulması şarttır. En basit yaklaşım, kayıtları düz metin dosyalarında (text files) saklamaktır.
Bu yöntemde her kayıt türü için ayrı bir dosya oluşturulur. Her kayıt bir metin satırı olarak yazılır ve değerler sekmelerle (TAB) ayrılır. Örneğin STUDENT tablosunun metin dosyasındaki bir satır şu şekilde görünür:
1[TAB]joe[TAB]2004[TAB]10[RET]2[TAB]amy[TAB]2004[TAB]20[RET]...
- Veritabanı sistemi çok az iş yapar
- Kullanıcı dosyaları metin editörüyle inceleyip değiştirebilir
- Kurulum gerektirmez
- Dosyayı güncellemek çok zaman alır
- Dosyada arama yapmak çok zaman alır
- Eş zamanlı erişimde sorun çıkar
- Veri bütünlüğü sağlanamaz
Bu dezavantajlar, özellikle büyük ölçekli ve paylaşımlı veritabanlarında kabul edilemez düzeye ulaşır. Bu nedenle günümüzde gerçek bir Veritabanı Yönetim Sistemi (DBMS) kullanmak kaçınılmazdır.
Veri Modelleri ve Şemalar
Bir veritabanı birden fazla şekilde ifade edilebilir; bu farklı ifade biçimleri veri modelleri ve şemalar kavramlarını ortaya çıkarır.
Veri Modeli (Data Model): Veritabanlarının yapısını tanımlamak için kullanılan bir çerçevedir. Verinin nasıl organize edileceğini, nasıl temsil edileceğini ve nasıl manipüle edileceğini belirleyen kurallar ve kavramlar kümesidir.
Şema (Schema): Belirli bir veritabanının yapısıdır. Hangi tablolar, hangi alanlar, hangi tipler ve hangi ilişkiler bulunduğunu tanımlar.
İki temel veri modeli karşılaştırıldığında aralarındaki fark netleşir:
- Kayıtlar "student.txt" dosyasında tutulur
- Satır başına bir kayıt
- Her kayıtta 4 değer, sekmeyle ayrılmış
- Dosyayı okuyan program kodlamanın tümünü çözmek zorundadır
- Kayıtlar STUDENT adlı tabloda tutulur
- Her kayıtta SId, SName, GradYear, MajorId alanları
- Kullanıcı tablo üzerinde kayıt ekler, sorgular, siler, değiştirir
- Uygulama detaylarından bağımsızdır
Bu iki model, farklı soyutlama düzeylerinde çalışır. Aynı sorgu için yazılması gereken kod miktarına bakıldığında fark çarpıcı biçimde ortaya çıkar:
public static List<String> getStudents1997() { List<String> result = new ArrayList<>(); FileReader rdr = new FileReader("students.txt"); BufferedReader br = new BufferedReader(rdr); String line = br.readLine(); while (line != null) { String[] vals = line.split("\t"); String gradyear = vals[2]; if (gradyear.equals("1997")) result.add(vals[1]); line = br.readLine(); } return result; }
SELECT SName FROM STUDENT WHERE GradYear = 1997
SQL kodu yalnızca ne istediğini belirtir; veriyi nasıl getireceğini söylemez. Bu, ilişkisel modelin en güçlü özelliklerinden biridir.
Kavramsal Model vs Fiziksel Model: İlişkisel model bir kavramsal modeldir — şeması, nasıl uygulandığına dair herhangi bir bilgi gerektirmeksizin tanımlanır ve kullanılır. Dosya sistemi ise bir fiziksel modeldir — şeması, belirli bir uygulamayı açıklar ve ona bağımlıdır.
Kavramsal şema verinin "ne" olduğunu tanımlarken, fiziksel şema veritabanının "nasıl" uygulandığını tanımlar. Kavramsal şemalar, tüm uygulama detaylarını dışarıda bıraktıkları için fiziksel şemalardan çok daha kolay anlaşılır ve manipüle edilir.
Fiziksel Veri Bağımsızlığı
Kavramsal şemalar elbette fiziksel şemalardan daha kullanışlıdır. Peki kavramsal düzeyde yazılan bir SQL sorgusu nasıl çalıştırılır? Bu noktada veritabanı kataloğu (database catalog) devreye girer.
Veritabanı Kataloğu: Fiziksel ve kavramsal şemaların tanımlarını içeren dahili depolama alanıdır. Sistem bir SQL sorgusuyla karşılaştığında, bu kataloğu kullanarak sorguyu dosya tabanlı koda dönüştürür.
Fiziksel Veri Bağımsızlığı (Physical Data Independence): Kullanıcıların veritabanı sistemiyle fiziksel düzeyde etkileşime girmek zorunda kalmadığı özelliktir. Kullanıcı yalnızca kavramsal şema üzerinde çalışır; fiziksel detaylar sistem tarafından yönetilir.
Bu bağımsızlığın sağladığı üç temel fayda vardır:
- Kullanım kolaylığı: Uygulama detaylarıyla uğraşmaya gerek yoktur. SQL ile istediğinizi ifade edersiniz, sistem nasıl getireceğini bilir.
- Sorgu optimizasyonu: Sistem, sorguyu otomatik olarak en verimli şekilde çalıştırır. Programcı performans optimizasyonu yapmak zorunda kalmaz.
- Fiziksel şema değişikliklerinden izolasyon: Diskteki dosya yapısı değişse bile kullanıcı bunu fark etmez; uygulamaları etkilenmez.
Mantıksal Veri Bağımsızlığı
Fiziksel bağımsızlık, kullanıcıları fiziksel detaylardan ayırır. Mantıksal bağımsızlık ise bir adım ileri giderek her kullanıcıya kendi özelleştirilmiş "bakış açısını" sunar.
Örneğin dekanlık ofisi sürekli öğrenci transkriptleriyle ilgileniyor olabilir. Kavramsal şemadaki tablolara erişmek yerine, onlara daha uygun olan şu iki tablo sunulabilir:
STUDENT_COURSES (SId, YearOffered, CourseTitle, Prof, Grade)
Harici Şema (External Schema): Belirli bir kullanıcı veya kullanıcı grubu için kişiselleştirilmiş tablo kümesidir. Gerçek tablolar üzerinden hesaplanan ya da birleştirilen bu "sanal tablolar" kullanıcıya özel bir görünüm sunar.
Mantıksal Veri Bağımsızlığı (Logical Data Independence): Kullanıcıların kendi harici şemalarına sahip olabildiği özelliktir. Böylece kullanıcı kavramsal şemadaki değişikliklerden izole edilir.
Mantıksal veri bağımsızlığının faydaları:
- Her kullanıcı kişiselleştirilmiş bir harici şema alır; ihtiyacı olan veriyi ihtiyacı olan biçimde görür.
- İhtiyacı olmayan veriyi görmez — bu hem kullanım kolaylığı hem de güvenlik sağlar.
- Kavramsal şema değişse bile kullanıcı etkilenmez.
- Kullanıcılar yalnızca kendi şemalarına yönelik ayrıcalıklar alır; bu daha güçlü bir güvenlik modeli sunar.
- Harici şemalar hassas verileri yetkisiz kullanıcılardan gizlemek için kullanılabilir.
Üç Şema Düzeyi
Bir veritabanı sistemi üç farklı soyutlama düzeyinde çalışır. Bu mimari ANSI/SPARC üç şema mimarisi olarak bilinir ve günümüz tüm DBMS sistemlerinin temelini oluşturur:
(External)
(Conceptual)
(Physical)
Bu üç düzey arasındaki dönüşümü (mapping) veritabanı sistemi otomatik olarak yönetir. Kullanıcı harici şemasında bir sorgu yazar → sistem bunu kavramsal şemaya çevirir → oradan da fiziksel şemada gerçekleştirir.
İlişkisel Veritabanları ve Tablolar
İlişkisel bir veritabanı sisteminde tüm veriler tablolar (tables) halinde düzenlenir. Tablolar, ilişkisel modelin temel yapı taşlarıdır.
- Her tablo sıfır ya da daha fazla kayıt (record / tuple / row) ve bir ya da daha fazla alan (field / attribute / column) içerir.
- Her kayıt, her alan için bir değere sahiptir.
- Her alanın belirli bir tipi (type) vardır: sayısal, metin, tarih/saat vb.
- Ticari veritabanı sistemleri INTEGER, VARCHAR, DATE, FLOAT gibi pek çok türü destekler.
Üniversite veritabanının şeması (tip bilgileri göz ardı edilirse) şu şekilde yazılır:
DEPT(DId, DName)
COURSE(CId, Title, DeptId)
SECTION(SectId, CourseId, Prof, YearOffered)
ENROLL(EId, StudentId, SectionId, Grade)
Altı çizili = Primary Key · İtalik = Foreign Key
Bu gösterim, tip bilgilerini atlayarak yalnızca yapıyı özetler. Veritabanını tartışırken sıkça kullanılan pratik bir notasyondur.
Null Değerler
Null Değer: Var olmayan ya da bilinmeyen bir değeri temsil eder. Null, boş string veya 0 ile aynı şey değildir; gerçek anlamda "bilgi yok" demektir.
Null değerlerin ortaya çıkmasının iki temel nedeni vardır:
- Veri toplama tamamlanmamış olabilir: Bir öğrencinin mezuniyet yılı henüz belirlenmemişse bu alan null olarak kalır.
- Veri geç gelebilir: Bir sınav notu henüz girilmemişse not alanı geçici olarak null olacaktır.
Önemli Not: Primary key alanları hiçbir zaman null olamaz. Bir kaydın birincil anahtarı her zaman bilinen ve benzersiz bir değer taşımalıdır. Bu kural, null değer kısıtlamalarının (NOT NULL) en kritik uygulama alanlarından biridir.
Süperanahtar ve Anahtar
Veritabanında bir kaydı bulmak için o kaydı benzersiz biçimde tanımlayan alan değerleri belirtilmelidir. Ancak her alan kombinasyonu bu benzersizliği garanti etmez. Bu nedenle anahtar (key) kavramı geliştirilmiştir.
Süperanahtar (Superkey): Bir tablonun kayıtlarını benzersiz biçimde tanımlayan alan veya alanlar kümesidir. Bir süperanahtara yeni bir alan eklendiğinde elde edilen küme yine bir süperanahtardır.
Anahtar (Key): Hiçbir alt kümesi süperanahtar olmayan minimal süperanahtardır. Yani bir anahtardan herhangi bir alan çıkarıldığında benzersizlik özelliği kaybolur.
Örnekler üzerinden açıklayalım:
STUDENT(SId, SName, GradYear, MajorId) için:
• Her öğrencinin farklı bir ID'si olduğundan SId bir süperanahtardır.
• SId'nin hiçbir alt kümesi (boş küme) kayıtları benzersiz tanımlamaz → SId aynı zamanda bir anahtardır.
• {SId, GradYear} da bir süperanahtardır, ancak SId zaten yeterli olduğundan minimal değildir, dolayısıyla key değildir.
SECTION(SectId, CourseId, Prof, YearOffered) için:
• Bir profesörün yılda en fazla bir şube öğrettiği kuralı geçerliyse {Prof, YearOffered} bir anahtardır.
• Bir dersin yılda en fazla bir şubesi olduğu kuralı geçerliyse {CourseId, YearOffered} da bir anahtardır.
• Bu tablonun birden fazla anahtarı olabilir.
Birincil Anahtar ve Yabancı Anahtar
Birincil Anahtar (Primary Key): Bir tabloda birden fazla anahtar bulunabilir; bunlardan biri birincil anahtar olarak seçilir. Kayıtlar bu anahtar üzerinden referans alınır. Her birincil anahtar alanı null olamaz.
Birincil anahtar seçiminde dikkat edilmesi gerekenler:
- Olabildiğince doğal ve anlaşılması kolay olmalıdır.
- ID numaraları sıklıkla birincil anahtar olarak kullanılır, çünkü basit ve sezgiseldir.
- Birincil anahtar alanları asla null değer içeremez.
Yabancı Anahtar (Foreign Key): Bir tablonun alanı, başka bir tablonun birincil anahtarına karşılık geliyorsa buna yabancı anahtar denir. Tablolar arasındaki ilişkiyi kuran mekanizmadır.
Üniversite veritabanındaki yabancı anahtar ilişkileri:
| Alan | Bulunduğu Tablo | Referans Aldığı Tablo |
|---|---|---|
| MajorId | STUDENT | →DEPT |
| DeptId | COURSE | →DEPT |
| CourseId | SECTION | →COURSE |
| StudentId | ENROLL | →STUDENT |
| SectionId | ENROLL | →SECTION |
Referans Bütünlüğü (Referential Integrity): Yabancı anahtar belirtilmesi, her null olmayan yabancı anahtar değerinin, referans aldığı tabloda gerçekten var olan bir kaydın birincil anahtar değerine eşit olmasını zorunlu kılar.
Örneğin: STUDENT tablosundaki MajorId = 20 ise, DEPT tablosunda DId = 20 olan bir kayıt mutlaka var olmalıdır. Aksi hâlde veritabanı geçersiz bir duruma düşer ve referans bütünlüğü ihlal edilmiş olur.
Kısıtlamalar, Bütünlük Kısıtları ve SQL
Kısıtlama (Constraint): Veritabanındaki tabloların hangi durumda olabileceğini tanımlayan kuraldır. Geçersiz verilerin sisteme girmesini engeller.
Dört önemli kısıtlama türü vardır:
Null Değer Kısıtlaması
Belirli bir alanın null değer içermemesini zorunlu kılar. Örneğin birincil anahtar alanları her zaman NOT NULL olmalıdır.
Anahtar Kısıtlaması
İki kaydın anahtar alanları için aynı değerleri taşıyamayacağını belirtir. Benzersizlik garantisidir.
Referans Bütünlüğü Kısıtlaması
Bir kaydın yabancı anahtar değerinin, referans aldığı tablodaki bir kaydın birincil anahtar değerine eşit olmasını zorunlu kılar.
Bütünlük Kısıtlaması
Organizasyonun iş kurallarını kodlar. Tek bir kayda, tüm tabloya ya da veritabanının tamamına uygulanabilir.
Bütünlük kısıtlamaları (integrity constraints), organizasyonun "iş kurallarını" veritabanı düzeyinde kodlar. İki temel amaca hizmet eder:
- Hatalı veri girişini tespit etmek: Örneğin mezuniyet yılı 1800 girilirse sistem reddeder.
- Organizasyonun kurallarını uygulamak: Örneğin bir öğrenci aynı dersi iki kez alamaz.
Bütünlük kısıtlaması kapsamı bakımından üç farklı düzeyde tanımlanabilir:
- Tek bir kayıt düzeyinde: "Bir öğrencinin mezuniyet yılı en az 1863 olmalıdır."
- Tablo düzeyinde: "Bir profesör yılda en fazla iki şube öğretebilir."
- Veritabanı düzeyinde: "Bir öğrenci bir dersi birden fazla kez alamaz."
Şimdi tüm bu kısıtlamaların SQL'deki gerçek karşılığına bakalım:
CREATE TABLE STUDENT ( SId INT NOT NULL, -- null değer kısıtı SName VARCHAR(10) NOT NULL, -- null değer kısıtı MajorId INT, -- null olabilir GradYear INT, -- null olabilir PRIMARY KEY (SId), -- anahtar kısıtı FOREIGN KEY (MajorId) REFERENCES DEPT -- referans bütünlüğü ON UPDATE CASCADE -- DEPT güncellenince cascade ON DELETE SET NULL, -- DEPT silinince null yap CHECK (SId > 0), -- bütünlük kısıtı CHECK (GradYear >= 1863) -- bütünlük kısıtı );
Yabancı anahtar bildiriminde ON DELETE ve ON UPDATE ile belirtilen dört aksiyon türü:
- CASCADE: Referans alınan kayıt silindiğinde/güncellendiğinde, aynı işlemi yabancı anahtar içeren tüm kayıtlara da uygular.
- SET NULL: Yabancı anahtar değerlerini null yapar.
- SET DEFAULT: Yabancı anahtar değerlerini varsayılan değere (DEFAULT) çeker.
- NO ACTION: Etkilenen yabancı anahtar kaydı varsa işlemi reddeder (hata döndürür).
Özet: Kısıtlamalar, veritabanının veri kalitesini ve tutarlılığını otomatik olarak koruyan mekanizmalardır. İş kurallarını veritabanı düzeyine taşıyarak her uygulamanın ayrı ayrı bu kuralları kontrol etmesi zorunluluğunu ortadan kaldırır.