← Database Management System Ana Sayfa
CENG208 — Veritabanı Yönetim Sistemleri
CENG208 · Ders Notları

Veritabanı Yönetim
Sistemleri

Database Management Systems — Kapsamlı Konu Anlatımı & Ders Notları

İçindekiler
01
Ders Bilgisi

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.

02
Temel Kavram

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.

Tanım

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.

Tanım

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.

03
Tasarım İlkeleri

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.
04
Fiziksel Katman

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:

TEXT FILE — student.txt
1[TAB]joe[TAB]2004[TAB]10[RET]2[TAB]amy[TAB]2004[TAB]20[RET]...
✅ Avantajlar
  • Veritabanı sistemi çok az iş yapar
  • Kullanıcı dosyaları metin editörüyle inceleyip değiştirebilir
  • Kurulum gerektirmez
❌ Dezavantajlar
  • 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.

05
Mimari

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.

Tanım

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.

Tanım

Ş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:

Dosya Sistemi Modeli (Fiziksel)
  • 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
İlişkisel Model (Kavramsal)
  • 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:

Java — Dosya Sistemi Modeli (Uzun yol)
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;
}
SQL — İlişkisel Model (Kısa yol)
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.

06
Bağımsızlık

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.

Tanım

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.

Tanım

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.
07
Bağımsızlık

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_INFO (SId, SName, GPA, NumCoursesPassed, NumCoursesFailed)
STUDENT_COURSES (SId, YearOffered, CourseTitle, Prof, Grade)
Tanım

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.

Tanım

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.
08
Mimari

Üç Ş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:

Harici Şema
(External)
Kullanıcıya Özel Tablolar Farklı kullanıcı grupları (dekanlık, öğretim üyesi, öğrenci işleri) kendi ihtiyaçlarına göre özelleştirilmiş "sanal tablo" görünümleri alır.
STUDENT_INFO · CLASS_LIST · CURRENT_SCHEDULE
Kavramsal Şema
(Conceptual)
Kullanıcıdan Bağımsız Tablolar Tüm uygulamaların ortak kullandığı, uygulamadan bağımsız tablo yapılarıdır. SQL sorguları bu düzeyde çalışır.
STUDENT · DEPT · COURSE · SECTION · ENROLL
Fiziksel Şema
(Physical)
Veri Dosyaları ve İndeksler Verinin disktte nasıl saklandığını, hangi indekslerin kullanıldığını tanımlar. Kullanıcı bu katmanla doğrudan etkileşime girmez.
student.dat · gradyear.idx · sname.idx · enroll.dat

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.

09
İlişkisel Model

İ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:

STUDENT(SId, SName, GradYear, MajorId)
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.

10
Özel Değer

Null Değerler

Tanım

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.

11
Kimlik Belirleme

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.

Tanım

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.

Tanım

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.

12
Anahtar Türleri

Birincil Anahtar ve Yabancı Anahtar

Tanım — Primary Key

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.
Tanım — Foreign Key

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
Tanım — Referential Integrity

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.

13
Veri Bütünlüğü

Kısıtlamalar, Bütünlük Kısıtları ve SQL

Tanım

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:

SQL — STUDENT Tablosunun Tam Tanı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.