VERİTABANINDA TABLO YAPMAK

Beş satır dört sütunlu veritabanı tablosu yapısı başlık satırı ve veri hücreleri ile temel iskelet

Pazartesi sabahı dosyayı açıyorsunuz: musteriler_son_v3_FINAL.xlsx. 14 binin üzerinde satır, 47 sütun ve üç farklı arkadaşın elle eklediği "Aktif/aktif/AKTİF" değerleri. Bir filtre kuruyorsunuz, Excel bir dakika düşünüyor; bir formül yazıyorsunuz, dosya kilitleniyor. Bu noktada sorun Excel değil — sorun, ilişkisel bir veriyi tek bir düz tabloya sıkıştırmaya çalışmanız. Veritabanında tablo yapmak, bu kaosu disiplinli bir yapıya çevirmenin ilk ve en önemli adımıdır.

Excel Neden 1000 Satır Sonrası Çöker?

Excel bir hesap tablosudur, veri yönetim sistemi değil. Tek bir sayfada müşteri bilgisini, siparişlerini, ödemelerini ve notlarını yan yana tutmaya başladığınızda şu sorunlar üst üste birikir.

  • Aynı müşterinin adı 30 farklı satırda 30 farklı yazımla geçer ("Ahmet Yılmaz", "ahmet yilmaz", "A.Yılmaz").
  • Bir adres değiştiğinde, o müşteriye ait tüm satırları elle güncellemeniz gerekir.
  • Bir kişi dosyayı açıkken diğeri yazamaz; eş zamanlı çalışma yok.
  • Filtre ve pivot, 10 binin üzerinde satırda gözle görülür biçimde yavaşlar.
  • Yanlışlıkla silinen bir satırı geri almak Ctrl+Z hızına bağlıdır; iz kalmaz.

İlişkisel veritabanı bu sorunları, veriyi tek tablo yerine birbiriyle konuşan birden çok tabloya bölerek çözer.

Tablo Nedir, Satır ve Kolon Ne Demek?

Bir veritabanı tablosu, dışarıdan bakıldığında Excel sayfasına benzer ama altında çok farklı kurallar çalışır. Her tablonun sabit kolonları, her kolonun sabit bir veri tipi vardır. Bir kolona sayı tanımladıysanız oraya "yok" yazamazsınız; bu, veriyi temiz tutar. kapsamlı dokümanları konuya derinlemesine bir bakış sağlar.

Bir musteriler tablosu şöyle görünür

  • musteri_id — INT, birincil anahtar, otomatik artar
  • ad_soyad — VARCHAR(120), boş olamaz
  • eposta — VARCHAR(150), tekil olmalı
  • kayit_tarihi — DATETIME, varsayılan şimdi
  • aktif_mi — BOOLEAN, varsayılan true

Burada kritik nokta şudur: musteri_id her müşteri için tek ve değişmez bir kimliktir. Excel'de "satır numarası" kalıcı değildir — sıralayınca değişir. Veritabanında birincil anahtar, müşteriyi sonsuza dek aynı sayıyla tanımlar.

Müşteri ve sipariş iki tablo foreign key bağı ile bağlanmış crow-foot çizgili ilişki diyagramı

Tek Tabloyu İkiye Bölmek: İlişkinin Doğuşu

Diyelim ki her müşterinin birden çok siparişi var. Excel mantığıyla bunu yan yana sütunlar olarak (siparis_1, siparis_2, siparis_3...) ya da müşteri bilgisini her siparişle tekrar tekrar yazarak tutarsınız. İlişkisel modelde ikinci bir tablo açarsınız.

siparisler tablosu

  1. siparis_id — birincil anahtar
  2. musteri_id — yabancı anahtar, musteriler.musteri_id'ye bağlanır
  3. tutar — DECIMAL(10,2)
  4. siparis_tarihi — DATETIME
  5. durum — VARCHAR(20)

Artık müşteri adresi değişince tek bir satırı güncellersiniz; 30 siparişe dokunmanız gerekmez. Yabancı anahtar (foreign key), iki tablo arasında "bu siparişin sahibi bu müşteridir" bağını veritabanı motoruna ezberletir. Olmayan bir musteri_id'yi siparişe yazamazsınız; motor reddeder.

Doğru Kolon Tipini Seçmek

Excel'de her şey "hücre"dir. Veritabanında bir kolonu yanlış tipte tanımlamak, ileride saatler kaybettirir. Pratik birkaç kural

  • Tarih için DATE veya DATETIME — asla VARCHAR. "01/05/2024" ve "2024-05-01" karışmasın.
  • Para için DECIMAL — FLOAT yuvarlama hatası üretir; muhasebede kabul edilmez.
  • Kısa metin için VARCHAR(n) — n'i ihtiyacın biraz üstünde tutun.
  • Uzun metin (yorum, açıklama) için TEXT.
  • Sayma için INT; çok büyük değerler için BIGINT.
  • Evet/Hayır için BOOLEAN — "Evet"/"E"/"1"/"true" karmaşası yaşamazsınız.

Normalizasyon: Tekrarı Bitirmek

İlişkisel modelin omurgası normalizasyondur. Kısaca: aynı bilgiyi iki yerde tutmayın. Şehirleri her müşteri satırında "İstanbul" diye yazmak yerine bir sehirler tablosu yapıp musteriler tablosuna sadece sehir_id koyarsınız. Avantajları

  • Bir şehrin adı değişirse (örn. "Afyon" → "Afyonkarahisar") tek satır günceller, iş biter.
  • Yazım tutarsızlığı imkansız hale gelir — listede ne varsa o.
  • Disk kullanımı düşer; sorgular hızlanır.

Aşırıya kaçmamak gerekir. Her şeyi tabloya bölmek sorguları okunmaz hale getirir. Pratikte 3NF (üçüncü normal form) çoğu uygulama için yeterlidir.

İndeks: Sorguyu Hızlandıran Sessiz Kahraman

1000 satırlık bir tabloyu eposta'ya göre aramak hızlıdır; 5 milyon satırlık tabloda aynı arama sunucuyu dakikalarca düşündürür. Çözüm: sık aranan kolonlara indeks koymak. İndeks, kitabın arkasındaki "dizin" gibi çalışır — motor her satıra bakmak yerine doğrudan ilgili adrese gider.

Hangi kolonlara indeks?

  1. Birincil anahtarlar (otomatik gelir)
  2. Yabancı anahtarlar (musteri_id gibi)
  3. WHERE cümlesinde sık geçen kolonlar (eposta, telefon)
  4. JOIN'lerde kullanılan kolonlar

Her kolona indeks koymayın — yazma işlemlerini yavaşlatır, disk şişirir.

Tablo başında PK anahtar simgesi FK ok bağı ve yan tarafta sıralı indeks ağacı üç anahtar yapısı

Pratikte Nereden Başlamalı?

İlk veritabanını kurarken kağıt kalemle başlayın. Hangi varlıklar var (müşteri, ürün, sipariş, fatura)? Aralarındaki ilişki ne (bir müşterinin çok siparişi, bir siparişin çok kalemi)? Bu sorulara cevap verdikten sonra MySQL, PostgreSQL veya SQLite üzerinde tabloyu CREATE TABLE komutuyla kurmak 10 dakikalık iştir.

SQL komutlarının mantığını ve tablo tasarımını adım adım öğrenmek için SQL eğitim içeriği üzerinden ilerleyebilirsiniz. Özellikle JOIN, GROUP BY ve indeks konuları, Excel'den geliyorsanız zihninizdeki "tek sayfa" alışkanlığını kırmanıza yardımcı olur.

Veritabanında tablo yapmak, satırları depolamaktan ibaret değildir; veriyi anlamlı, tutarlı ve aranabilir tutmaktır. Excel'in 1000. satırından sonra kaybettiğiniz huzuru geri kazanmanın yolu, doğru tasarlanmış üç beş tablodan geçer.