Cuma, Ağustos 17, 2007

Veritabanı Mantığı

SQL diline geçmeden önce veritabanı sunucu programlarının veriyi nasıl tuttuğu ile ilgili kısa bir gözden geçirme yapalım. Bir veritabanı sunucu programını normal herhangi bir program gibi bilgisayara kurarız. Genellikle sunucu programlar kurulduğu gibi kullanıma hazır olurlar ama ciddi sistemler için bazı güvenlik, ağ konfigürasyonu gibi ayarlar yapmak gerekebilir. Veritabanı programının kurulduğu bilgisayara veritabanı sunucusu deriz. Klasik iki katmanlı yapıda programlar direk olarak veritabanı sunucusuna bağlanarak veri okuma ve yazma işlerini yaparlar. Bu okuma yazma işlerini yapan programların yüklü olduğu bilgisayarlara ise istemci deriz. İstemci bilgiyi ister, sunucu bilgiyi sunar. Bazen sunucuya hizmetçi, server, ana makine gibi isimler de verilir.

Veritabanı sunucusunda birden fazla veritabanı açılabilir. Birden fazla programın veritabanı aynı sunucu içerisinde barınabilir. Her program en az bir tane veritabanına bağlanır. Veritabanı veriyi tablolar halinde tutar. Bir tablo alanlardan (fields) oluşur. Her alanda ne tür bilgi tutulacağı belirlenir. Mesela müşteri bilgilerinin tutulacağı bir tabloda müşteri adı, son alışveriş tarihi, kimlik numarası gibi bilgiler tutulur. Müşteri tablosu oluşturulurken, "müşteri adı" alanı 50 karakter metin bilgisi tutacak, "son alışveriş tarihi" alanı tarih bilgisi tutacak, "kimlik numarası" alanı sayı bilgisi tutacak gibi tanımlamalar yapılır. Bu alanlar tablomuzun bir anlamda sütunlarıdır. Bu tanımlamaları veritabanı programını kullanarak veya direk SQL ile programımızın içinden yapabilmemiz mümkündür. Yani SQL ile yeni bir veritabanı tanımlayabilir ve o veritabanının içinde bir tablo yaratabiliriz. Kısacası tablo yaratırken önce "müşteriler" gibi bir tablo ismi veririz, sonra da tablodaki alanları açarız ve tiplerini belirleriz.

Tablonun alanlarından (sütunlarından) sonra ikinci önemli kısmı satırlarıdır. (Records) Modern veritabanı sistemlerinde teoride satır sayısı (kayıt sayısı) sınırsızdır. Pratikte ise veritabanı sunucusunun bellek, işlemci ve sabit disk kapasitesi bu sayıyı sınırlar. Bazı veritabanı sunucularının ücretsiz sürümlerinde ise büyük de olsa bir sınır vardır. Kayıt ekleme işi için yine SQL dilini kullanırız. Kayıt eklerken dikkat edilmesi gereken en önemli konu eklediğimiz kayıttaki bilgilerin tablodaki veri tiplerine uyumlu olmasıdır. Tarih bilgisi tutacak bir alana sayı bilgisi yazmaya çalışırsak bir hata oluşmasına neden oluruz.

Tabloların üçüncü önemli kısmı indekslerdir. İndeksler birçok işe yarar. Birincisi indeksler yardımıyla kayıtlar sıralanır. Örneğin Müşteriler tablomuzda "müşteri adı" alanı için bir indeks yaratırsak tablomuzdan müşteri kayıtlarını okurken kayıtlar "müşteri adı" alanına göre alfabetik olarak sıralanır. Aslında doğruyu söylemek gerekirse SQL sayesinde indeks yaratmamış olsak bile kayıtları belli bir alana göre sıralı okumak mümkündür ama indeksi olmayan bir alana göre sıralama yaparsak kayıt okuma işlemi çok yavaş çalışacaktır.

İstersek yine indeksleri kullanarak tablomuzdaki bazı alanların benzersiz kayıtlar içermesini sağlayabiliriz. Bu şu anlama gelir. Müşteriler tablomuzda aynı kimlik numarasına sahip iki kayıt açılmasını istemeyebiliriz. Bu durumda kimlik numarası alanı için bir tekil indeks (unique index) açarız. Eğer aynı kimlik numarası içeren iki kayıt açmaya kalkarsak veritabanımız bize programımızda bir uyarı çıkartma imkanı verecektir.

İndekslerin üçüncü kullanım alanı tablo ilişkileri yaratmaktır. Örneğin müşteriler tablomuzda müşterimizin bulunduğu şehri tutacağımız bir alan eklemek isteyelim. Şehir isimleri metin bilgisi olmalıdır. Ankara, Afyon, Mardin gibi. Eğer bu şehir isimlerini her kaydımıza eklersek bu durumda tablomuzun boyu büyüyecektir. İstersek şehir isimlerini başka bir tabloda tutarak müşteriler ve şehirler tablolarımız arasında bir ilişki yaratabiliriz. Şehir isimlerini şehirler tablosuna eklerken her şehir kaydına bir kayıt numarası verilir. 1 Adana, 2 Afyon gibi. Müşteriler tablosunda ise Şehir alanına şehir adını değil kayıt numarasını kaydederiz. Böylelikle Adana bilgisi yerine 1, Afyon bilgisi yerine 2 bilgisini tutarız. Sonra kayıtları okurken SQL ile bu ilişkiyi söyleriz. Bu ilişkiden haberdar olan veritabanı sunucusu müşteri bilgisini sunarken Şehir alanında kayıt numarasını değil Şehir Adını gösterir. Bu bire-bir bir ilişkidir.

Bire-bir ilişki tipinden başka ilişki tipleri de vardır. Örneğin müşteri kayıtları ve müşterilerden alınan siparişler ayrı tablolarda tutulur. Siparişler tablosunda tüm müşterilerden alınan siparişler durur. Her müşterinin birden fazla siparişi olabilir ama bir sipariş en çok (ve en az) bir müşteriye ait olabilir. Bu yüzden bu ilişkiye birden-çoğa denir. Siparişler kaydedilirken ilişki kurulabilmesi için sipariş kaydına müşteri kayıt numarası da yazılır. Örneğin A müşterisinin siparişleri tabloda 1 kayıt numarası ile, B müşterisinin siparişleri ise 2 kayıt numarası ile tutulur. A müşterisinin siparişlerini okumak için siparişler tablosundan müşteri numarası 1 olan siparişleri okumamız gerekir. Yine SQL ile bu ilişkiyi bildirdiğimizde sunucumuz ilgili bağlantıları yaparak kayıtları istediğimiz şekilde okuyabilmemizi sağlayacaktır. SQL dilinin özelliklerini incelemeye başladığımızda bu konular daha çok netlik kazanacaktır.

Bu ön bilgilerden sonra gelecek günlerde SQL dilinin özelliklerini incelemeye başlayacağız.

1 yorum:

Adsız dedi ki...

Oldukça güzel bir giriş yazısı olmuş