Tablo tasarımı yapılırken öncelikle nelerin kayıt alınacağı, bunlara girilecek bilgilerin tipi ve uzunluğu saptanır. Daha sonra yapılacak optimizasyonlar yapılır, anahtar alanlar vs saptanır ve daha sonra tablo oluşturulur.
Örnek bir tablo
Öğrenci no Adı Soyadı Sınıfı Doğum Tarihi Cinsiyet Mezuniyet
1 İbrahim Kutluay 5 01.04.1974 Erkek Yüsekokul
3 İsmail Kutluay 4 02.02.1976 Erkek Üniversite
2 Tuba Şahin 2 03.05.1980 Kadın Lise
8 İbrahim Şahin 5 05.05.1983 Erkek İlkokul
4 İsmail Şahin 1 08.01.1986 Erkek İlkokul
9 Azize Şahin 2 02.04.1988 Kadın Lise
5 Türkan Şahin 1 01.01.1960 Kadın İlkokul
Şimdi genel mantık açısından tablo tasarımı konusunda fikir geliştirelim.
Görüldüğü gibi öğrenci no herkes için tek bir değer almaktadır. İsim ve soy isim char ve ya varchar olarak tanımlanabilir ve 20 karakter yeterlidir. Sınıf değeri için şu anda smallint tipi bile uygun ama 6 FEN C gibi değerler içinde hazır bir alan tutmak adına varchar yada char tanımlanabillir. Burada tasarım hüneri bunlarda değil son iki sütundadır. Şöyleki gördüğünüz gibi cinsiyet bilgisi 5, mezuniyet ise 10 karakter uzunlukta. Tabloda 1.000.000 kayıt var ise bu iki sütun toplam 15 Mb yer kullanacaktır. Peki biz cinsiyet değeri yerine, erkek =1 kadın= 0 olarak smallint , ve de mezuniyet için aynı teknikle, ilkokul =0, ortaokul=1, lise=2 , Myo =3 ve Üniversite=4 diye iki değer kullansak nasıl olur. Ekrana görüntülerken ilave kod yazmak gerekecek ancak ilk hali ile 15 MB yer kullacak olan bu sütunlar smallint ile sadece 2 MB yer tutacak. Tabii bu değerler liste alınırken vs hafızanın daha ekonomik kullanılmasınada yarayacak.
Son olarak ise arama işlevleri için hazırlık yapmaya gelelim. Şimdi Örneğin adı Tuba olan öğrenciyi bulmak istersek ne yapmak gerekecek. CSV örneklerini hatılarsak For each ile bütun tabloyu sırayla okuyup kontrol edeceğiz. Peki bu işlemi hızlandıramazmıyız. Örneğin yukardaki asıl tablonun asıl tablonun yanında birde anahtar dosya tanımlasak. Mesela numara alanı için
Öğrenci no Adı
1 İbrahim
2 İsmail
3 Tuba
4 İsmail
5 Türkan
8 İbrahim
9 Azize
Şeklinde kayıt tutan bir indeks dosyası tanımlasak ve burada kayıtlar sıralı olduğu için arama yöntemleri kullansak nasıl olur. Örneğimizde 8 nolu kayda ulaşmak için 5 kayda gidip kontrol etmek gerekirken ikiye bölerek arama yöntemi kullanılırsa neler olur.
Bu töntemde kayıtların en ortasındaki eleman bulunur. Örneğimizde bu 4 tür. Aradığımız değer bundan büyükse buraya kadar elemanlar iptal olur, küçükse bundan sonraki değerler iptal olur. Görüldüğü gibi ilk elemede kayıtların yarısı uçmakta. Daha sonra orta eleman 8 oluncaya kadar bu yüntem devam edecektir.
Bir adım daha ileri gidelim;
Bu öğrencilerin derslerini ve bu derslerden aldıkları notlarıda tabloda tutacak olursak ilk akla gelen öğrenci tablonsunun sonuna tüm dersleri eklemek olacaktır. Oysa lisede bu öğrenciler dallara ayrılacak ve her öğrenci sadece belli bir ders grubunu alacaktır. Kısaca bu yapı hem öğrenci tabslonu şişirecek hemde hiçbilgi girişi yapılamayacak bir sürü boş alana sebep olacaktır.
Şimdi o zaman dersleri ayrı bir tabloda tutalım demenin vakti gelmiştir. Yani
Öğrenci No Ders Adı Not 1 Not 2 Not 2 Sözlü Ortalama
1 Matematik 50 40 60 80 55
Yukardaki ilk örneğe bakılırsa daha pratik çünkü öğrenciler sadece aldıkları derslerden not almış ve kayıt edilmiş olacaklar. Ancak hala yapıalacak bir şey var; Gördüğünüz gibi ders adı metin bir alan ancak ders isimleri genelde belli. Yani bunlarıda cinsiyet gibi bir tabloda tutup, 0 ? Matematik, 1 Türkçe şeklinde tutmak mümkün.
Gördüğünüz gibi veriyi şu anda bir çok tabloya bölündü ama bir çok yer tasarrufuda sağlanmış oldu. Bu tasarımın Turkcell gibi 20 milyona yakın abonesi olan bir yerde yapıldığını düşünürseniz veritabanının boyunun kaç GB küçülmüş olabileceğini düşünün.
Programcılık dünyasında artık veritabanı tasarımı ayrı bir uzmanlık alanı haline gelmiştir. Yukarda saydıklarımız şüphesiz kimseyi veritabanı yöneticisi yapmaz ama arama algoritmaları ve indekslerin gerekliliği ise sadece tavsiye anlamında kaynaklarda yer almaktadır. O bakımdan işin detayını öğrenmek bakımından iyi bir adım atılmış olmaktadır.
350 - (Toplam) 0 - (Bugün)