İçeriğe geç

Database ve Schema Oluşturma: Başlangıç Rehberi (Senin Tarzınla!)

Selam millet! Bugünlerde yine bir database işine giriştim de aklıma geldi, bu işler bazen ilk başta biraz göz korkutucu olabiliyor, ne kadar basit olsa bile. Hani böyle ilk bilgisayar aldığın zamanlar gibi, içinde ne var ne yok anlamak biraz zaman alıyor ya, işte database’ler de öyle. Ama merak etme, benim gibi tecrübeli birinden dinleyince her şey daha anlaşılır hale gelecek. Hatta öyle ki, bu işin temellerini anlatırken sana sanki yanındaymışım gibi hissettireceğim.

Şimdi hepimiz biliyoruz ki, modern uygulamaların olmazsa olmazı veri yönetimi. İşte bu noktada database ve schema dediğimiz kavramlar devreye giriyor. Ama durun, hemen teknik terimlere boğulmayalım. Önce bir olayı basitleştirelim.

Database’i şöyle düşün: Kocaman bir kütüphane gibi. İçinde binlerce, milyonlarca kitap var. Her kitabın bir yeri, bir raf numarası var, değil mi? İşte database de bu kütüphanenin kendisi. İçinde senin bilgilerin, müşteri verilerin, ürünlerin, her şeyin duruyor. Ama bu kütüphanenin de bir düzeni olmalı, yoksa aradığını bulamazsın. İşte tam burada schema devreye giriyor.

Schema ise bu kütüphanenin planı, mimarisi diyebiliriz. Hangi raf nerede olacak, hangi kitap hangi rafın hangi bölümüne konulacak, bunları belirleyen bir nevi harita. Yani database’deki verilerin nasıl organize edileceğini, hangi tabloların olacağını, bu tabloların birbirleriyle nasıl ilişkileneceğini schema belirliyor. Bana göre bu işin en önemli kısmı, çünkü baştan iyi bir schema planlaması yaparsan, ileride işler çok daha kolay olur. Yoksa sonra veriler birbirine girer, aradığını bulamazsın, programın yavaşlar, başın ağrır. Neyse efendim, bu işin ne kadar önemli olduğunu anladık sanırım.

Öncelikle, bir database oluştururken ilk adım, hangi database sistemini kullanacağına karar vermek. Popüler olanlardan PostgreSQL ve MySQL var mesela. Ben genelde PostgreSQL kullanmayı seviyorum, hem açık kaynaklı hem de çok güçlü. Ama MySQL de gayet iş görür, hatta birçok yerde karşımıza çıkar. İkisi de kendi içinde harika özelliklere sahip.

Şimdi diyelim ki PostgreSQL kurduk. İlk yapacağımız şey, yeni bir database oluşturmak olacak. Bu komutlar genelde basit olur, hani böyle ‘CREATE DATABASE veritabanı_adi;’ gibi. Sonra bu veritabanının içine girip, tablolarımızı oluşturacağımız schema’yı tanımlayacağız. Schema’yı da ‘CREATE SCHEMA schema_adi;’ gibi basit bir komutla yapıyoruz. Tabii bunun için yetkin olman lazım, yani o database’e erişim iznin olmalı.

Sonra bu schema’nın içine istediğin kadar tablo oluşturabilirsin. Tabloları oluştururken de dikkatli olmak lazım tabii. Hangi veriyi ne türde saklayacaksın? Sayı mı, metin mi, tarih mi? Bunları doğru seçmek performans açısından çok önemli. Mesela bir tarih bilgisini metin olarak saklamaya kalkarsan, sonra o tarih aralığındaki verileri sorgulaman çok zorlaşır, hatta imkansız hale gelir. Hani o ilk başlarda yaptığım hatalardan biriydi bu benim, şimdi hatırlayınca gülüyorum 🙂

Bu arada, schema’yı oluşturduktan sonra hangi tabloların hangi schema altında olacağını belirlemen gerekiyor. Genelde PostgreSQL’de public adında varsayılan bir schema olur ama sen kendi özel schema’larını oluşturup işleri daha düzenli hale getirebilirsin. Mesela bir uygulamanın farklı modülleri için farklı schema’lar kullanmak mantıklı olabilir. Bu sayede her modülün verisi kendi içinde izole olur, karışıklık azalır.

Geçenlerde bir proje üzerinde çalışırken, bir arkadaşımın database’ini inceleme fırsatım oldu. Adamın her şeyi ‘public’ schema’sına atmış, inanılmaz bir karmasıklık vardı. Sorgular yarım saat sürüyor, hata veriyor, resmen çile çekiyordu. Ona dedim ki, “Kardeşim, gel önce bir schema yapalım, işleri düzene sokalım.” İnanın ki, sadece birkaç schema oluşturup tabloları doğru yerlere taşıyınca, programın performansı uçtu. Ne güzel değil mi?

Peki, basit bir örnekle bunu nasıl yaparız? Diyelim ki bir e-ticaret sitesi için basit bir ürün tablosu oluşturacağız. Önce bir veritabanı ve schema oluşturuyoruz, sonra da tabloyu. Şöyle bir şey oluyor:

-- Önce veritabanını oluştur (eğer yoksa) -- CREATE DATABASE e_ticaret_db;

-- Veritabanına bağlanıp schema oluştur CREATE SCHEMA urunler;

-- Schema içine tabloyu oluştur CREATE TABLE urunler.urunler ( urun_id SERIAL PRIMARY KEY, urun_adi VARCHAR(255) NOT NULL, aciklama TEXT, fiyat DECIMAL(10, 2) NOT NULL, stok_miktari INT DEFAULT 0 );

İşte bu kadar basit! `SERIAL PRIMARY KEY` dediğimiz şey, her yeni ürün eklediğinde `urun_id`’nin otomatik olarak artmasını sağlıyor. `VARCHAR(255)` metin için, `TEXT` daha uzun metinler için, `DECIMAL` para birimi için ve `INT` de tam sayılar için kullanılıyor. `NOT NULL` ise o alanın boş bırakılamayacağını belirtiyor. Bu arada, `DEFAULT 0` ile stok miktarı başlangıçta 0 olarak ayarlanmış oluyor, güzel değil mi?

Şimdi benim aklıma geldi, acaba bu `CREATE TABLE` komutunun farklı varyasyonları var mı diye düşündüm. Mesela bir anahtarı başka bir tablodan referans göstermek gibi. İşte o zaman `FOREIGN KEY` kullanıyoruz. Ama bu konuya başka zaman gireriz, yoksa bu yazı uzar gider.

Neticede, database ve schema oluşturmak ilk başta göz korkutucu görünse de, aslında temel mantığı anladığında oldukça basit bir iş. Önemli olan baştan doğru planlama yapmak ve verilerini mantıklı bir şekilde organize etmek. Bu sayede hem kendi işini kolaylaştırırsın hem de ileride karşılaşabileceğin birçok sorunun önüne geçmiş olursun. Unutma, iyi bir temel her zaman sağlam bir yapı demektir. Yani şey gibi… neyse anladın sen 🙂

Eğer daha fazla detay istersen veya aklına takılan bir şey olursa, çekinmeden sorabilirsin. Bu arada, database’ler hakkında daha fazla bilgi edinmek istersen Google’da küçük bir arama yapabilirsin, bolca kaynak bulursun. Hatta belki YouTube’da da güzel anlatımlar vardır.