13 Mart 2017 Pazartesi

VERİ TABANI YÖNETİM SİSTEMLERİ


Merhabalar bu yazımda veritabanı yönetim sistemlerini temel yapısı ile ele alacağım bu nedenle öncelikle veri nedir kavramı ile başlayalım.


Veri nedir ?
Öncelikle bilgi veri kavramı birbirinden ayrılmalıdır. Veri bilgiyi elde etmeye yarayan işlenmemiş ham maddeye denmektedir yani bilgi veriyi kullanmaya başladıktan sonra ortaya çıkar.
Veri Tabanı nedir ?
Veri tabanı birbirleriyle ilişkili olan verilerin tutulduğu, kullanım amacına uygun olarak düzenlenmiş veriler topluluğunun mantıksal ve fiziksel olarak tanımlarının olduğu bilgi depolarıdır. Veri tabanları gerçekte var olan ve birbirleriyle ilişkili olan varlıkları ve ilişkilerini modeller. Günümüzde hemen hemen verilerin kullanıldığı tüm alanlarda Veri Tabanı Yönetim Sistemi yazılımı kullanmak mecburi hale gelmiştirVeri Tabanı Yönetim Sistemi kullanıcı ile veri tabanı  arasında bir ara birim oluşturur ve veri tabanına her türlü erişimi sağlar. Bir veri tabanı verileri koruma, onlara erişim sağlama, güncelleme, ilişkilendirme gibi temel işlemleri yapabilmelidirVeri Tabanı Yönetim Sistemleri veri modeline göre Hiyerarşik veri tabanları, Ağ veri tabanları, Nesneye yönelik veri tabanları, İlişkisel veri tabanları şeklinde ayrılmaktadır biz İlişkisel veri tabanı üzerinde duracağız.



İlişkisel Veri Tabanları

İlişkisel veritabanı mantığı 1970 yılında Dr. Edgar F.Codd tarafından yazıla ''A Relational Model of Data for Large Shared Data Banks'' adlı makalede ortaya atılmıştır.

İlişkisel veritabanlarındaki yapıda veriler tablolar halinde saklanır. Tablolar alanlardan ve kayıtlardan oluşur.İlişkisel veri tabanlarını anlamak için anahtar kavramını iyi anlamak gerekir. Primary Key, Unique Key ve Foreign Key olmak üzere 3 çeşit anahtardan bahsedeceğiz. Şimdi bu anahtarların ne işe yaradığına bakalım...
Primary Key(Birincil Anahtar):Primary key bir tabloda buluduğu satırı ifade edecek bir anahtar veridir. Tabloda Primary key alanına ait verinin tekrarlanmaması gerekmektedir

Unique Key(Tekil Anahtar):Uniqe key olarak tanımlanan bir alan için bir değer sadece bir kere girilebilir. Bir başka satıra daha aynı verinin girilmesine izin verilmez. Primary key'den farklı olarak unique key NULL değerini alabilir.
Örneğin personele ait verilerin tutulduğu bir tabloda personel sicil numaraları kişiye özel olacağından unique key olarak tanımlanabilir ancak isimler unique olarak tanımlanmamalıdırlar çünkü aynı isme sahip birden fazla personel bulunabilir eğer personel adı unique tanımlanırsa aynı ismin ikinci defa girilmesine sistem izin vermez

Foreign Key(Yabancı Anahtar):Bir tabloya girilecek değerleri başka bir tablonun belli bir alanı ile ilşkilendirmeye yarar.Şimdi aşağıdaki örnek tablo üzerinden yapıyı daha iyi anlamaya çalışalım.
Alttaki tabloda courseId ismide bir primary key'imiz var bu primary key bu tablo için ayırt edici bir değerdir. Diğer tablodada courseId'si isminde bir foreign key'imiz var foreign key'in amacının tablolar arası ilişki kurmak olduğundan bahsetmiştik. İlk tablodaki foreign key ikinci tablodaki primary key alanını işaret etmektedir.Bu yazıda ilişkisel veri 
tabanındaki genel kavramlardan bahsetmiş olduk daha sonraki bölümde daha detaylı bir şekilde ilişkisel veri tabanını ele alacağım.

TEMEL KAVRAMLAR

Varlık-İlişki Modeli 

Öncelikle konunun daha iyi anlaşılması için varlık ilişki modelinden biraz bahsedelim.





Yandaki şekildeki ifadeler kullanılan sembollerdir.

Anlamlarının bilinmesi gerekir. Varlık dediğimiz şey nesneleri ifade eder. Nitelik sembolü Varlığ'a ait özellikleri ifade eder. Anahtar nitelik o varlığa ait ayırt edici bir özelliktir ve daha önceki anlatımda bahsettiğimiz primary key kavramına karşılık gelir.Çoklu değer alabilen nitelik. Bir diğer önemli sembol ise bağıntı-ilişki sembolü'dür varlık ile nitelik arasındaki ilişkiyi belirtir. Diğer sembollerden ise yeri geldikçe bahsedeceğiz. 

 Daha anlaşılabilir olması açısından basit bir örnek ile başlayarak Varlık-İlişki kavramını anlamaya çalışalım. 

Görsele baktığımızda Öğrenci ve Ders varlıklarını görüyoruz. Öğrenci varlığına ait  5 nitelik var. Öğrenci_No bu varlığa ait primary key'dir. Yaş ise türetilmiş niteliktir türetilmiş nitelik denmesinin nedeni öğrencinin aynı diyagramda D.Tarihi niteliği ile doğum tarihini barındırması ve yaşında o nitelikten türetilmiş olmasıdır. Ders varlığıda aynı özelliklere sahiptir. Öğrenci varlığına ders_kodu diye bir nitelik ekleyerek Ders varlığının primary key'ine foreign key atayabilir ve iki varlık arasında bu şekilde ilişki kurabiliriz.

İlişki Türleri

İlişkisel veri tabanında tabloların öneminden bahsetmiştik bu tablolar kadar tablolar arası ilişkide oldukça önemlidir. Tasarım aşamasında hangi ilişki türünün seçileceğine iyi karar vermek oldukça önemlidir. 3 çeşit ilişki türü bulunmaktadır. Şimdi bunları inceleyip nasıl seçim yapmamız gerektiğini öğrenelim.

   =>1-1 ilişki:
Konuyu bir örnek üzerinden anlamaya çalışalım. Buna Evlilik ilişkisi örnek verilebilir. TC Medeni Kanununa göre bir kişi yanlızca bir tane  eşe sahip  olamlıdır  ya  da bir başka örnek diyelim ki 30  kişilik  bir sınıfımız  ve   bu sınıfa yerleşecek 30 tanede öğrencimiz var. Bu durumda her sıraya bir   öğrenci  her   öğrenciye   bir  sıra   düşmektedir. Tabloya aktarımda  ise A tablosundaki  bir veri B tablosunda yanlızca bir veriyle  eşleşebilir. B tablosuda aynı şekilde A tablosunda yanlızca bir veriyle eşleşmelidir.

   =>1-N (Birden çoğa)ilişki:

Bir Okuldaki sınıf öğretmenlerini düşünelim.  Her öğrenciye bir sınıf öğretmeni düşmektedir. Bir sınıf öğretmeninin birden fazla öğrencisi bulunmaktadır. Böyle bir durumda eklemeleri nereye yapacağımıza şöyle karar veririz: 
Öğretmen tablosuna ğörenci id'si eklediğimizi düşünelim her öğrenci için tabloya tekrar ekleme yapmamız gerekecek ancak veri tekrarı bizim istemediğimiz bir durumdur.Bu durumda öğrenci tablosuna öğretmen id 'si eklemek mantıklı olur. Bu duruma şöylede karar verebiliriz. Bire N'lik ilişkinin N tarafına foreign key eklenmelidir.

   =>M-N (Çoktan çoğa)ilişki:

Diğer ilişki türlerine göre daha karmaşıktır. Bu tür de iki tabloda birden fazla bağa sahip olduğundan bu durumu iki tablo ile çözmek yeterli gelmemektedir. Yeni bir tablo daha eklenmektedir bu durumada yine öğrenci üzerinden açıklama yapalım .Bir ders seçim sisteminde bir öğrenci birden fazla ders seçtiği gibi bi dersi alan öğrenci sayısıda birden çoktur ve bu durumu açıklamak için üçüncü bir tablo daha tutulur.


Yukarıda hazırladığımız hastane sistemine ait varlık-ilişki diyagramı görülmektedir. Şuana kadar bahsettiğim nitelikler ve kavramların hepsini bu diyagram üzerinde yorumlayıp tablolarını inceleyelim

Tabloda kırmızı ile gözüken kısımlar foreign key kısımlarıdır ve oklar ile gösterildiği primary keylere işaret etmektedirler. Hasta-ilaç ve Hasta-Doktor varlıkları arasında M-N lik ilişki bulunmaktadır yani bu varlıkları tabloda ifade ederken ek bir tabloyada ihtiyacımız var.Hasta-ilaç tablosunu için reçete isimli üçüncü bir tablo, Hasta-Doktor tablosunda da Muayene isimli üçüncü tablo ekledik.




SQL SORGULARI

1-SELECT İFADESİ
Veri tabanında belirlediğimiz kritere uygun verileri getirme işlemini select ifadesi yapıyor.Aşağıda yazımında da  gördüğümüz gibi select ifadesinden sonra getirmek istediğimiz kolonun adını from ifadesiylede hangi tablodan getirmemiz gerektiğini yazarız. Select * ifadesi ise o tabloya ait tüm verileri getirme işlemini yapar.

SELECT Kolon_adi FROM Tablo_adi 
SELECT * FROM Tablo_adi

Kişiler tablosu
Id               Ad                                 Soyad                               Şehir
1                Ayşegül                       Hatipoğlu                          BURSA
2                Miraç                            Aydın                                ANKARA
3                Mehmet                       Emin                                  ERZURUM        

Elimizde yukarıdaki gibi bir tablo olsun. "SELECT Ad , Soyad , Şehir  FROM Kişiler"  ifadesi sırasıyla isim soyisim ve şehir özelliklerini tablo şeklinde geri döndürür yani tüm kişilere ait özelllikleri listeler. "SELECT * FROM" dersek Id özelliğide gelir.


2-WHERE İFADESİ

Eğer getirilmesini istediğimiz veriler belli kriterlere sahip ise where anahtar kelimesi ile koşulumuzu tanımlamalıyız. Bunu da yine bir örnek üzerinden yazalım.


Kişiler tablosu

Id               Ad                                 Soyad                               Şehir
1                Ayşegül                       Hatipoğlu                          BURSA
2                Miraç                            Aydın                                ANKARA
3                Mehmet                       Emin                                  ERZURUM       
4                Kübra                           Ateş                                  GÜMÜŞHANE
5                Sümeyye                     Ay                                      ERZURUM
6                Yusuf                            Hatipoğlu                         BURSA

"SELECT * FROM Kisiler WHERE Şehir = 'ERZURUM'"  ifadesi şehir özelliği ERZURUM olan kişileri tüm özelliklerini getirir .Yani tablo çıktımız şu şekilde olacaktır:
3                Mehmet                       Emin                                  ERZURUM       
5                Sümeyye                     Ay                                      ERZURUM


"SELECT * FROM Kisiler WHERE Id>2"   ifadesi Id özelliği 2 'den büyük olan kişileri tüm özelliklerini getirir .Yani tablo çıktımız şu şekilde olacaktır:
3                Mehmet                       Emin                                  ERZURUM       
4                Kübra                           Ateş                                  GÜMÜŞHANE
5                Sümeyye                     Ay                                      ERZURUM
6                Yusuf                            Hatipoğlu                         BURSA


3-AND OR İFADELERİ

Birden fazla koşul tanımlamak istediğimizde işimize oldukça yarayan ifadelerdir. İfadelerin Türkçe karşılıklarındanda anlaşılacağı üzere AND ifadesinin çalışması için iki koşulunda doğru olması gerekir.OR da ise koşullardan birinin doğru olması yeterlidir.

Kişiler tablosu

Id               Ad                                 Soyad                               Şehir
1                Ayşegül                       Hatipoğlu                          BURSA
2                Miraç                            Aydın                                ANKARA
3                Mehmet                       Emin                                  ERZURUM       
4                Kübra                           Ateş                                  GÜMÜŞHANE
5                Sümeyye                     Ay                                      ERZURUM
6                Yusuf                            Hatipoğlu                         BURSA
7                Kübra                           Mumcu                                İSTANBUL

"SELECT * FROM Kisiler WHERE Ad='Kübra' AND Id=4" ifadesinin çıktısı 4 idsine sahip Kübra isimli kişinin tüm özelliklerini getirir.
4                Kübra                           Ateş                                  GÜMÜŞHANE
"SELECT * FROM Kisiler WHERE Ad='Kübra' OR Id=5" ifadesinin çıktısı 5 idsine sahip yada  Kübra isimli kişinin tüm özelliklerini getirir.
4                Kübra                           Ateş                                  GÜMÜŞHANE
5                Sümeyye                     Ay                                      ERZURUM
7                Kübra                           Mumcu                                İSTANBUL

"SELECT * FROM Kisiler WHERE Ad='Kübra' AND ( Id=7 OR Şehir=BURSA)" ifadesinin çıktısı Adı Kübra olan kişilerden  id=7 olan yada şehir=BURSA olan kişileri tüm özelliklerini getirir.
7                Kübra                           Mumcu                               İSTANBUL


4-ORDER BY

SELECT ile çektiğimiz kayıtları Order  by ile kolona göre sıralarız.Küçükten büyüğe yada büyükten küçüğe olabilir.Azalan sıra için DESC artan sıra için ASC kullanılır.
Id               Ad                                 Soyad                               Şehir
1                Ayşegül                       Hatipoğlu                          BURSA
2                Miraç                            Aydın                                ANKARA
3                Mehmet                       Emin                                  ERZURUM       
4                Kübra                           Ateş                                  GÜMÜŞHANE
5                Sümeyye                     Ay                                      ERZURUM
6                Yusuf                            Hatipoğlu                         BURSA
7                Kübra                           Mumcu                                İSTANBUL


"SELECT * FROM Kisiler ORDER BY Ad" :İsim kolonuna göre küçükten büyüğe sıralar.
1                Ayşegül                       Hatipoğlu                          BURSA
4                Kübra                           Ateş                                  GÜMÜŞHANE
7                Kübra                           Mumcu                                İSTANBUL
3                Mehmet                       Emin                                  ERZURUM       
2                Miraç                            Aydın                                ANKARA
5                Sümeyye                     Ay                                      ERZURUM
6                Yusuf                            Hatipoğlu                         BURSA

"SELECT * FROM Kisiler ORDER BY Ad DESC" :İsim kolonuna göre büyükten küçüğe sıralar.
6                Yusuf                            Hatipoğlu                         BURSA
5                Sümeyye                     Ay                                      ERZURUM
5-DISTICT:
Select ifadesi ile sorgu yaptığımızda aynı bilgiden birden fazla kayıtta bulunması durumunda bu veri tekrarına engel olmak için kullanır yani tekrarlı verileri bir kere gösterir.
"SELECT * DISTINCT FROM tablo_adi"
şeklinde kullanılır.

6-SEÇİLEN BİR SÜTUNA TAKMA İSİM ATAMA: 
Sorgulama yaparken cok fazla işimize yarayan bir özelliktir. 
Tablo isimlerini akılda tutmak hem zordur hem uzun isimler kullanılması durumunda kod kalabalığı yapar. Ayrıca aynı tabloyu karmaşık sorgularda farklı varlıklar için kullanmamız gerekebilir ve bu durumda isimlendirme yapmaya mecbur kalabiliriz.
"SELECT sütun_adi AS takma_ad"
7-TOP:
Belirli bir SQL sorgusunun ilk belli sayıdaki kaydını almaya yarar.
"SELECT TOP sayi sütun_adi FROM tablo_adi " Şeklinde kullanılabilir.
8-GROUP BY:
Tablomuzda ortak özellikleri olan kayıtların birbiri ile ilişkilendirilmiş


şekilde sorgulanmasıdır. HAVİNG ifadesi ise gruplandırma koşulunu
belirtmek için kullanılır. Genelde bir arada kullanımları mevcuttur.


SELECT sütun_adi FROM tablo_adi
WHERE koşul
GROUP BY g_sütun_adi
HAVING BY koşul ORDER BY sütun_adi
9-IN-NOT:
İç içe sorgularda kullanılır.Böyle sorgularda önce içteki sorgu
sorgu sonra dıştaki sorgu gerçekleşir. Yani birinden çıkan sonuç

diğerinde kullanılabilir.



10-AVG() COUNT:
AVG istediğimiz sorgu sonucuna göre sütun değerlerinin
ortalamasını verir. COUNT ise istediğimiz sütunun barındırdığı
kayıt sayısını verir.


11-EXCEPT:
Adından da anlaşılacağı üzere fark işlemidir. İlk sorguda
bulunalardan EXCEPT sorgusundan sonra bulunmayanları
listelemek için kullanılır.
11-EXIST:
Alt sorgudaki şartların yerine getirildiği durumlardaüstteki sorgu
değer üretir. Bu ifade doğru ya da yanlış sonuç dödürür.

ORM KULLANIMI

ORM(OBJECT RELATİONAL MAPPİNG) NEDİR ?

ORM bir ilişkisel veri tabanıyla nesneyi bağlamak için meta
data tanımlayan programlama tekniğine verilen isimdir. C# Java gibi nesneye yönelimli programlama dilleriyle yazılır.Veritabanımızda yaratmış olduğumuz her bir nesneye karşılık kod tarafında bir nesne oluşturan program şeklinde düşünülebilir.Bu programlar bizim yazmamız gereken kodu otomatik olarak üretiyorlar. ORM ilişkisel veri tabanı ve Nesneye yönelimli programlama arasındaki veri dönüşümünü sağlar aralarında ki bir köprü gibi düşünülebilir Veritabanındaki tabloları sınıflara çevirir. ORM sayesinde kod aşamasında veri tabanında daha az zaman harcarız. Daha az SQL sorgusu yazarız ve tüm nesneye yönelimli programlama dilleri için mevcuttur. ORM kullanımının biraz daha oturması için bir örnek üzerinde inceleyelim.Bunun için Microsoft SQL Server Management Studio programında hazırlamış olduğum Database'in Diagram görüntüsü üzerinden ilerleyelim. Görüntü şu şekildedir:

Database görüldüğü gibi oluşturulduktan sonra visual studio programıyla database'i gerekli işlemler ile birleştirdim. Bu işlemler visual studio programının kullanımıyla alakalı olduğundan onun detayına değinmeyeceğim sadece konunun anlaşılması açısından bu örnek üzerinden ilerliyorum. Bu database'e karşılık aşağıdaki şekilde tablolara karşılık gelen class'ların bulunduğu visual ekran oluşturuldu. Yani bu tabloları biz elle oluşturmadık iki programı ORM kullanımıyla birleştirerek tablo oluşturma aşamasını programa yaptırmış olduk. 

Görüldüğü üzere ORM kullanımı işimizi oldukça kolaylaştırdı. ORM'nin bize sağladığı bir diğer kolaylığın da kod kalabalığından kurtardığından bahsetmek olduğunu söylemiştik yani kodları biz yazmadıkta bunu program bizim için otomatik olarak yaptı. Visual studio'nun database için oluşturduğu kod kısımları aşağıdaki gibidir.
namespace odevson
{
    using System;
    using System.Collections.Generic;
   
    public partial class authordetail
    {
        public int authorID { getset; }
        public string first { getset; }
        public string last { getset; }
        public string birth { getset; }
        public string death { getset; }
    }
}
_______________________________________________________________________________
namespace odevson
{
    using System;
    using System.Collections.Generic;
   
    public partial class ebook
    {
        public int etextID { getset; }
        public string title { getset; }
        public Nullable<int> copyright { getset; }
        public Nullable<int> download { getset; }
        public string filename { getset; }
    }
}
_______________________________________________________________________________
namespace odevson
{
    using System;
    using System.Collections.Generic;
   
    public partial class lccsubject
    {
        public int subjectID { getset; }
        public string subject { getset; }
    }
}
_______________________________________________________________________________
namespace odevson
{
    using System;
    using System.Collections.Generic;
   
    public partial class lchsubject
    {
        public int subjectID { getset; }
        public string subject { getset; }
    }
}
Bu oluşturulan kod kısmının bir bölümüdür ve görüldüğü üzere işimizi bir hayli kolaylaştırmıştır.