Kapsamlı Bilgisayar Mühendisliği Eğitimi Rehberi 9 - Veritabanı Sistemleri



3. sınıf birinci dönemdeki iki bilgisayar dersini de anlattım, şimdi geldim en okkalı döneme. Bu okkalı dönemde üç tane kazık gibi ders var: İşletim Sistemleri, Veritabanı Sistemleri ve Sinyal ve Sistemlerin temelleri. Sinyal ve sistemler elektronikçi konusu ve oldukça teorik olduğundan geçeceğiz. İşletim Sistemleri okulun en kazık dersidir. Ama ondan önce, ne işletim sistemleriyle ne de önceki derslerin hiçbiriyle bir alakası olmayan melankolik veritabanlarından biraz bahsedelim.

3. Sınıf 2. Dönem

CS 353 - Database Systems

Daha önce Ahmet'in arabası verisini tutmak için önce Ahmet'i sonra bir GidenAraba nesnesi olan ahmetinArabasını yaratmıştık. GidenAraba nesnesi de arabanın hızını falan içinde tutuyordu. 

Ya binlerce Ahmet, milyonlarca Giden Araba üzerinde işlem yapmamız gerekirse?

Bir gidenAraba arrayi açıp buna on milyon araba koymayı deneyebiliriz pekala, ardından da mavi ekranı yeriz. Çünkü RAM diye bir şey var ve sonsuz değil.

Ayrıca her şeyi koda yazarak oldukça kirli bir kod elde ederiz.

Ayrıca istediğimiz veriyi hızlıca çekip alamayız.

Ayrıca veriler arasında bağlantı varsa bir sürü işlem yapmamız gerekir, örneğin Ahmet arabasını değiştirince hem Ahmet nesnesini, hem GidenAraba nesnesini hatta GidenArabayıKullananSürücününGözRengi nesnesini elle değiştirmemiz gerekir.

Uzayıp giden bir nedenler listesinden dolayı Veritabanı kavramı ortaya çıkmış. Veritabanında tablolar bulunur ve bu tablolarda aynı kategorideki veriler tutulur. Şunun gibi bir şey:


Örneğin hepimizin kimlik bilgileri "Vatandaş" tablosunda tutulur. Tablolar başka tablolara veya kendilerine bağlı olabilir. Örneğin benim doğduğum şehir "Şehir" tablosunda kayıtlıyken annem ise yine "Vatandaş" tablosunda bulunur (ayrı bir "Anneler" tablosu yoktur yani)

Peki nasıl kuruluyor bu veritabanı, nasıl programlanıyor? Muhtemelen daha önce duyduğunuz SQL yardımıyla. 

SQL aslında bir programlama dilinden çok bir protokoldür, görgü kurallarıdır, adres yazarken mahalleden başlamaktır, yemeğe çorbayla başlayıp tatlıyla bitirmektir, mektupları iyi dileklerle bitirmektir. Veritabanı olayı ortaya çıkınca müyendizler "Ya şimdi ortaya bir sürü zottirik veritabanı dili çıkaracaklar. Olm bu veritabanları sonuçta hep aynı şeyleri yapmıyor mu? Bir standarda bağlayalım şunu." diye aralarında konuşmuş, ortaya SQL çıkmış. 

SQL'ü bilen herhangi bir veritabanı teknolojisini kullanabilir. MySQL, PostgreSQL vs. Gerçi bu standart yavaş yavaş yıkılmaya başladı, millet beğenmiyor SQL'i :)

SQL'de bir veritabanı şöyle yaratılır:

create table Vatandaş (
           ID  char(11),
           isim varchar(20),
           şehir varchar(20),
           yaş integer 
           primary key (ID));

create table tablo yarat demek. char(11) demek 11 tane karakterden oluşan string, 11'in hepsi kullanılmak zorunda. varchar(20) ise maksimum 20 tane karakterden oluşan string. integer artık biliyorsunuzdur umarım.

Burada ID Tc kimlik no ve kişiyle birebir eşleşir, yani bir tc kimlik nosunu birden fazla vatandaş kullanamaz, aynı şekilde de her tabloda da bu şekilde birebir eşleşen, genelde ismi "ID" koyulan anahtarlar bulunur ve buna primary key denir.

Şimdi böyle 80 milyon tane vatandaş olduğunu düşünürsek bu kadar bilgiyi tutmak için sünnet merasimine başlamamız gerekir. Bir char 1 byte'tır (içinde Türkçe karakterler varsa 2 byte), bu durumda "İstanbul" kelimesi 8 byte. Halbuki bir integer 4 byte'tır. Dolayısıyla her seferinde İstanbul yazıp boşuna 4 byte harcamamak için ayrı bir "Şehir" tablosu açarız.

create table Şehir (
           ID  char(2),
           isim varchar(20)
           primary key (ID));

Türkiye'de 81 il olduğuna göre ID'yi iki karakterle gösterebiliriz. 1...81 diye. Bu tabloda 81 tane il isimleriyle beraber yazarız. Vatandaş tablosunda ise şehir'in ismi yerine Şehir tablosundaki şehrin ID'sini gireriz. Vatandaş tablosunda bulunan Şehir ID'sine foreign key denir. 

create table Vatandaş (
           ID  char(11),
           isim varchar(20),
           şehir varchar(20),
           yaş integer
           primary key (ID)
           foreign key (şehir) references Şehir(ID));

İşe foreign key karışınca işler bulamaç olur çünkü artık tablolar birbirini bağlamaya başladı. Bir tabloya bir şey olunca öbürü de etkileniyor. Ya da ne bileyim, tablodaki şehirlere "Nüfus" sütunu eklesek artık "Nüfusu milyonun üstünde yaşayan vatandaşlar" gibi aramalar yapabiliriz. Dersin ilk kısmı genelde bu tip aramalarla geçiyor.

Gelişmiş aramalarla sizi sıkmayacağım, ama basit bir arama örneği vereyim.

Aramalar her zaman select from where sırasıyla yapılır.

select isim
from Vatandaş
where yaş = 15;

Örneğin bu Vatandaş tablosunda yaşı 15 olarak gözüken kişilerin isimlerini çeker.

select *
from Şehir

Bu da şehir tablosundaki bütün şehirleri tüm sütunlarıyla listeler, tablonun kendisini döner yani.

İşe şehri de karıştırmak için iki tabloyu birleştirmek gibi saçma sapan bir şey yaparız, ilk öğrenince mantığa yatmaz, sonra alışırsınız. Yani şöyle:

select *
from Vatandaş join Şehir on Vatandaş.şehir = Şehir.ID
where Vatandaş.yaş > 18
group by şehir
order by yaş

Bu kod önce "Vatandaş join Şehir" diyerek iki tabloyu birleştirdi birbirine yapıştırdı, ama gerçekten yapıştırdı. Örneğin normalde Vatandaş tablosunda sadece bir Ahmet Mehmetoğlu varken ve onun da şehirinde 1 yazıyorken yani adam Adanalıyken bir anda 81 tane Ahmet Mehmetoğlu türedi, hepsinin şehirinde 1 yazıyor ama Şehir.ID'leri 1'den 81'e, Şehir.isim'leri Adanadan Düzceye gidiyor. Yani elimizde hem vatandaşın hem şehrin sütunlarının olabilecek tüm kombinasyonlarını barındıran karma bir tablo oldu. 

Vatandaş.şehir = Şehir.ID kontrolünü yaparak tutarsız satırları eledik. Yani elimizde sadece Adanalı Ahmet Mehmetoğlu kaldı tekrar. 

(Eğer bu karma tablo olayını anlamadıysanız ders kitabından şu resmi göstereyim, Ahmet Mehmetli tablo çizmeye üşendim:

Burada gördüğünüz gibi r tablosuyla s tablosunun her elemanının eşleştiği bir tablo çıktı ortaya. Aynı olan isimler de r.B s.B diye yeniden adlandırıldı.)

Ondan sonra Vatandaş.yaş'ı kullanarak 18 yaşından büyük vatandaşları alıyoruz, gerisini atıyoruz.

group by diyerek şehirlere göre sıralıyoruz, Adanalı Ahmet Mehmetoğlu en üstte.

order by diyince de yaşa doğru sıralıyoruz. En yaşlı Adanalı kim ise en üstte oluyor.

Bunun gibi bir sürü karışık arama ve arama tekniği var ama ben burada kesiyorum.

Dersin yarısında bu tip şeylerle uğraşıyoruz.

Ondan sonraki yarısında birkaç ıvır zıvır konuyla beraber verilerin en verimli nasıl tutulacağı ve aramaların en verimli nasıl yapılacağı var. "Google bunlardan soruyormuş" dediğim yazıda ağaçları görmüştük mesela. Database için de özel ağaçlar var. Bu ağaçlarda arama yapmanın hız analizini falan öğreniyoruz. Aşırı üst düzey konular, kendim de zar zor anlamıştım zaten. 

Size veritabanıyla ilgili bir anımı anlatayım. Birinci sınıf ikinci dönemimde ilk yazılım projemizi yapıyorduk grupçak. Ben üst sınıflarla konuşuyordum bol bol. "İyi not almak için kendi başınıza bir şeyler öğrenmeniz gerek. Android öğrenebilirsiniz ama zordur. En kolay ve zevklisi database'dir." demişlerdi. Quiz oyunu yapıyorduk ve database iyi fikirdi. Fakat database'i bırak oyunun kendisini zor yetiştireceğimizi fark edince uğraşmadım. Fakat bütün soru ve cevapları koda yazınca hatamızı anladım. Hocalar da dedi zaten bunları bari bir not defterine yazaydınız diye. Database kullanmayan bir çok kişiye düşük not verdiler. Bunu okuyan genç dimağlar varsa en azından not için projelerine database katmalarına öneririm ;)

Yorum Gönder