---
title: 'Veritabanı Nedir'
source: 'https://academia.sh/tr/kurslar/iliskisel-kuram/veritabani-nedir'
course: 'Veri Modelleme ve İlişkisel Kuram'
language: tr
updated: '2026-08-17T18:09:00+00:00'
license: 'CC BY-SA 4.0'
---

# 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ığı.

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:

```sh
cat > odunc.csv <<'CSV'
odunc_no,uye_ad,uye_eposta,kitap_baslik,kitap_yazar,sube,alis_tarihi,iade_tarihi
1001,Ayse Demir,ayse.demir@ornek.org,Kayip Zaman,Elif Toprak,Merkez,2025-03-02,2025-03-16
1002,Mert Kaya,mert.kaya@ornek.org,Kayip Zaman,Elif Toprak,Merkez,2025-03-04,
1003,Ayse Demir,ayse.demir@ornek.org,Deniz Fenerleri,Kemal Aras,Bahcelievler,2025-03-05,2025-03-19
1004,Ayse Demir,ayse.demir@ornek.org,Kayip Zaman,Elif Toprak,merkez,2025-03-20,
1005,Selin Ozturk,selin.ozturk@ornek.org,Deniz Fenerleri,Kemal Aras,Merkez,2025-03-21,
1006,Mert Kaya,mert.kaya@ornek.org,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:

```sh
cat > odunc.csv <<'CSV'
odunc_no,uye_ad,uye_eposta,kitap_baslik,kitap_yazar,sube,alis_tarihi,iade_tarihi
1001,Ayse Demir,ayse.demir@ornek.org,Kayip Zaman,Elif Toprak,Merkez,2025-03-02,2025-03-16
1002,Mert Kaya,mert.kaya@ornek.org,Kayip Zaman,Elif Toprak,Merkez,2025-03-04,
1003,Ayse Demir,ayse.demir@ornek.org,Deniz Fenerleri,Kemal Aras,Bahcelievler,2025-03-05,2025-03-19
1004,Ayse Demir,ayse.demir@ornek.org,Kayip Zaman,Elif Toprak,merkez,2025-03-20,
1005,Selin Ozturk,selin.ozturk@ornek.org,Deniz Fenerleri,Kemal Aras,Merkez,2025-03-21,
1006,Mert Kaya,mert.kaya@ornek.org,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?

```sh
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:

```sh
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.
