İçeriğe geç
academia.sh

Ders 01 / 14

Veritabanı Nedir

Verinin dosyada tutulmasının yarattığı arama, eşzamanlılık ve bütünlük sorunları; veritabanı yönetim sisteminin bunlardan hangilerini hangi güvencelerle karşıladığı.

İçindekiler

Veri Yapıları kursu, verinin bellekte nasıl düzenlendiğini ve bu düzenin işlem maliyetini nasıl belirlediğini kurdu: dizi, karma tablosu, ikili arama ağacı. Linux’a Giriş ve Kabuk Programlama kursları, aynı veri diskte bir metin dosyasında dururken onu süzmeyi, kesmeyi ve saymayı öğretti. Node.js kursunda bir dosya okundu, ayrıştırıldı ve program içinde kullanıldı. Üç kursun ortak varsayımı şuydu: veri ya bellektedir ya da tek bir dosyadadır, ve ona erişen tek bir program vardır.

Bu müfredat o varsayımı kaldırır. Sorusu şudur: veri bir dosyada tutulduğunda hangi sorunlar çıkar, ve veritabanı bunların hangisini çözer? Kurs boyunca tek bir alan kullanılacak — bir kütüphanenin ödünç kayıtları: kitaplar, üyeler, şubeler ve ödünç işlemleri. Bir kütüphane kataloğunun arayüzü ne kadar iyi tasarlanırsa tasarlansın, arkasındaki veri yanlış modellenmişse arayüz de yanlış yanıt verir.

Dosyadaki Kayıt

Kütüphane, ödünç işlemlerini virgülle ayrılmış bir metin dosyasında tutuyor olsun. Kabuk araçları bu dosyayla iş görmeye yeter:

cat > odunc.csv <<'CSV'
odunc_no,uye_ad,uye_eposta,kitap_baslik,kitap_yazar,sube,alis_tarihi,iade_tarihi
1001,Ayse Demir,[email protected],Kayip Zaman,Elif Toprak,Merkez,2025-03-02,2025-03-16
1002,Mert Kaya,[email protected],Kayip Zaman,Elif Toprak,Merkez,2025-03-04,
1003,Ayse Demir,[email protected],Deniz Fenerleri,Kemal Aras,Bahcelievler,2025-03-05,2025-03-19
1004,Ayse Demir,[email protected],Kayip Zaman,Elif Toprak,merkez,2025-03-20,
1005,Selin Ozturk,[email protected],Deniz Fenerleri,Kemal Aras,Merkez,2025-03-21,
1006,Mert Kaya,[email protected],Sessiz Bahce,Elif Toprak,Bahcelievler,2025-03-22,2025-04-01
CSV

awk -F, 'NR > 1 && $8 == "" { print $2, $4 }' odunc.csv
Mert Kaya Kayip Zaman
Ayse Demir Kayip Zaman
Selin Ozturk Deniz Fenerleri

İade edilmemiş kitapların listesi çıktı. Dosya küçükken bu yeterlidir. Sorunlar dosya büyüdüğünde değil, soru değiştiğinde ve dosyaya erişen ikinci bir program belirdiğinde başlar.

Sorunun Yazılması

“Hangi kitap kaç kez ödünç verildi ve kaç farklı üye aldı?” sorusunu düşünelim. Kabuk araçlarıyla bu, birden çok geçiş, bir sıralama ve elle tutulan bir sayaç demektir. Aynı veri bir veritabanına konduğunda soru, çözümün nasıl hesaplanacağını söylemeden yazılır:

cat > odunc.csv <<'CSV'
odunc_no,uye_ad,uye_eposta,kitap_baslik,kitap_yazar,sube,alis_tarihi,iade_tarihi
1001,Ayse Demir,[email protected],Kayip Zaman,Elif Toprak,Merkez,2025-03-02,2025-03-16
1002,Mert Kaya,[email protected],Kayip Zaman,Elif Toprak,Merkez,2025-03-04,
1003,Ayse Demir,[email protected],Deniz Fenerleri,Kemal Aras,Bahcelievler,2025-03-05,2025-03-19
1004,Ayse Demir,[email protected],Kayip Zaman,Elif Toprak,merkez,2025-03-20,
1005,Selin Ozturk,[email protected],Deniz Fenerleri,Kemal Aras,Merkez,2025-03-21,
1006,Mert Kaya,[email protected],Sessiz Bahce,Elif Toprak,Bahcelievler,2025-03-22,2025-04-01
CSV

sqlite3 :memory: <<'SQL'
.mode csv
.import odunc.csv odunc_ham
.headers on
.mode box
SELECT kitap_baslik,
       COUNT(*)                    AS odunc_sayisi,
       COUNT(DISTINCT uye_eposta)  AS uye_sayisi
FROM odunc_ham
GROUP BY kitap_baslik
ORDER BY odunc_sayisi DESC;
SQL
┌─────────────────┬──────────────┬────────────┐
│  kitap_baslik   │ odunc_sayisi │ uye_sayisi │
├─────────────────┼──────────────┼────────────┤
│ Kayip Zaman     │ 3            │ 2          │
│ Deniz Fenerleri │ 2            │ 2          │
│ Sessiz Bahce    │ 1            │ 1          │
└─────────────────┴──────────────┴────────────┘

Aradaki fark söz diziminden ibaret değildir. Kabuk çözümünde nasıl hesaplanacağı yazılır; ikincisinde ne istendiği yazılır. Buna bildirimsel sorgulama (declarative querying) denir: istenen sonuç tanımlanır, sonuca hangi sırayla ve hangi yöntemle varılacağına sistem karar verir. Aynı soru bin kayıtta da on milyon kayıtta da aynı biçimde yazılır; değişen, sistemin seçtiği yürütme planıdır.

Aynı Anda İki Yazan

Asıl kırılma, dosyaya iki program aynı anda yazdığında görülür. Ödünç verme işlemi üç adımdır: durumu oku, nüshanın boşta olduğunu doğrula, kaydı ekle. İki gişe aynı nüshayı aynı anda verirse ne olur?

cat > odunc_ver.mjs <<'JS'
import { readFile, writeFile } from "node:fs/promises";
import { setTimeout as bekle } from "node:timers/promises";

const dosya = "durum.json";
const uye = process.argv[2];

const metin = await readFile(dosya, "utf8");
const durum = JSON.parse(metin);

if (durum.oduncte.includes(7)) {
  console.log(`${uye}: 7 numarali nusha zaten oduncte`);
} else {
  await bekle(50);                       // disk ve ag gecikmesinin yerine
  durum.oduncte.push(7);
  durum.kayit.push({ nusha_no: 7, uye });
  await writeFile(dosya, JSON.stringify(durum));
  console.log(`${uye}: 7 numarali nusha verildi`);
}
JS

echo '{"oduncte": [], "kayit": []}' > durum.json
node odunc_ver.mjs ayse & node odunc_ver.mjs mert & wait
cat durum.json
mert: 7 numarali nusha verildi
ayse: 7 numarali nusha verildi
{"oduncte":[7],"kayit":[{"nusha_no":7,"uye":"mert"}]}

İki satırın sırası ve dosyada kalan kaydın hangisi olduğu çalıştırmadan çalıştırmaya değişir; sabit olan iki şey vardır. Birincisi: her iki süreç de işlemi başarıyla tamamladığını bildirir, yani tek nüsha iki üyeye verilmiştir. İkincisi: dosyada tek bir kayıt kalmıştır — sonra yazan, öncekinin eklediği kaydı da silmiştir. Buna kayıp güncelleme (lost update) denir.

Okuma ile yazma arasındaki bekleme, gecikmeyi belirlenimci kılmak için konmuştur. Gerçek bir sistemde o gecikmeyi disk erişimi, ağ turu veya işletim sisteminin süreç değiştirmesi üretir; kaldırıldığında sorun ortadan kalkmaz, yalnızca daha seyrek görünür hâle gelir.

Kısıtın Yazılmamış Olması

Dosyanın söylemediği başka şeyler de vardır. 1004 numaralı kayıtta şube adı merkez, diğerlerinde Merkez yazılmıştır; kabuk araçları bunları iki ayrı şube sayar. Aynı üye adı üç satırda tekrar eder — üyenin e-posta adresi değişirse üç satırın da düzeltilmesi gerekir, biri unutulursa dosya kendi içinde çelişir. Hiçbir satır, “bir nüsha aynı anda yalnız bir üyede olabilir” kuralını taşımaz; bu kural yalnızca ona yazan programların kafasındadır.

Veritabanı yönetim sisteminde kural, veriyle birlikte saklanır ve ihlali motor reddeder:

sqlite3 :memory: <<'SQL'
CREATE TABLE odunc (
  odunc_no    INTEGER PRIMARY KEY,
  nusha_no    INTEGER NOT NULL,
  uye_no      INTEGER NOT NULL,
  alis_tarihi TEXT NOT NULL,
  iade_tarihi TEXT
);
CREATE UNIQUE INDEX odunc_acik ON odunc (nusha_no) WHERE iade_tarihi IS NULL;
INSERT INTO odunc VALUES (1001, 7, 41, '2025-03-02', NULL);
INSERT INTO odunc VALUES (1002, 7, 52, '2025-03-04', NULL);
SQL
Runtime error near line 10: UNIQUE constraint failed: odunc.nusha_no (19)

Hata iletisinin biçimi motora göre değişir; değişmeyen, ikinci eklemenin gerçekleşmemesidir. Kuralı uygulayan artık uygulama kodu değil, veriyi saklayan sistemin kendisidir. Bu ayrım kursun ekseni olacak: bir kuralı şemada ifade etmek ile onu her yazan programda tekrar etmek arasındaki fark.

Veritabanı Yönetim Sisteminin Verdikleri

Veritabanı yönetim sistemi (database management system), veriyi saklayan ve ona erişimi düzenleyen yazılımdır. Verdiği güvenceler dört başlıkta toplanır:

  • Bildirimsel erişim. Sorgu ne istendiğini söyler; erişim yolunu, dizin kullanımını ve birleştirme sırasını sistem seçer.
  • Bütünlük. Şemaya yazılan kısıtlar her yazma girişiminde denetlenir; hangi programın yazdığı fark etmez.
  • Eşzamanlılık denetimi. Aynı anda çalışan işlemler birbirinin ortasını görmez; kayıp güncelleme motorun sorumluluğundadır.
  • Kalıcılık. Tamamlandığı bildirilen bir iş, sistem o anda çökse bile veride kalır; yarım kalan iş hiç yapılmamış gibi geri alınır.

Son iki madde birlikte, kursun son konusunda tanımlanacak olan işlem kavramını verir. Bütünlük ise hemen sıradaki derslerin konusudur.

Dosyanın Doğru Seçim Olduğu Yerler

Veritabanı her sorunun karşılığı değildir. Yapılandırma dosyaları, tek yazanı olan kütükler, bir kereye mahsus çözümleme için indirilen ham veri, sürüm denetimine girmesi gereken metin — bunların dosyada durması yerindedir. Ayırt edici ölçüt boyut değil, şu üç sorudur: veriye aynı anda birden çok yazan var mı, veri üzerinde uygulanması gereken kurallar var mı, ve verinin yarım yazılması kabul edilebilir mi? Üçüne de “hayır” yanıtı veriliyorsa dosya yeterlidir.

Özet

  • Dosya tabanlı saklama, veri büyüdüğünde değil, soru çeşitlendiğinde ve ikinci bir yazan belirdiğinde yetersiz kalır.
  • Bildirimsel sorgulama, istenen sonucu hesaplama yönteminden ayırır; yürütme kararını sistem verir.
  • Aynı dosyaya eşzamanlı okuma–değiştirme–yazma yapan iki süreç kayıp güncelleme üretir ve ikisi de başarı bildirir.
  • Şemaya yazılan bir kısıt, veriye erişen bütün programlar için geçerlidir; uygulama kodunda tekrarlanan bir denetim yalnızca onu yazan program için geçerlidir.
  • Veritabanı yönetim sisteminin dört güvencesi bildirimsel erişim, bütünlük, eşzamanlılık denetimi ve kalıcılıktır.

Sonraki Adım

Bu ders, kuralların veriyle birlikte saklanması gerektiğini gösterdi ama kuralların neyin üzerine yazıldığını tanımlamadı. odunc.csv dosyasındaki satırlar ile veritabanındaki satırlar arasında, virgül kullanımından daha derin bir fark vardır: birinin altında matematiksel bir yapı durur, diğerinin altında yalnızca bir biçimlendirme sözleşmesi. Sıradaki ders o yapıyı — bağıntı, satır, sütun ve alan kavramlarını — tanımlar ve tablonun neden sıralı bir liste olmadığını gösterir.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat