Archive

Archive for the ‘Veritabanı’ Category

İlişkisel Veritabanı Tasarımı, İlişkiler, Normalizasyon ve Normal Formlar

26 April 2011 Leave a comment

Kaynak: http://www.zskblog.com/detay.aspx?id=21

Süper bir anlatım. Facebooktan biraz buna vakit ayırıp yalayıp yutarsanız nasıl veritabanı planlayacağınızı öğrenmiş olursunuz…
İlişkisel veritabanı neredeyse tüm veritabanlarında kullanıldığı için tasarımı ve normalizasyonu önemli bir konu. İyi bir ilişkisel veritabanı tasarımı yapmanın bir çok avantajı vardır. Tasarlanan ilişkisel veritabanın kalitesine paralel olarak kısaca sıralanacak avantajlar şunlardır :

  • Tekrarlanan verilerin azaltılması.
  • Veritabanı hakimiyetini yükseltmek.
  • İş yükünü azaltmak ve esneklik sağlamak.

İlişkisel veritabanın tasarımının avantajlarına kısaca göz attıktan sonra ilişkisel veritabanında olabilecek 3 adet ilişki türünü sıra sıra inceleyelim:

  • Bire Bir
  • Birden Çoğa
  • Çoktan Çoğa

Bire Bir İlişki Türü: (İlişkisel Veritabanı Tasarımı)

Kural basitir ; tablodaki anahtar ilişkili tabloda sadece bir tane olabilir.

Aynı mantığı şekille gösterelim: (İlişkisel Veritabanı Tasarımı)

Yukarıdaki şekilde Ogrenciler ve Liseler adında iki tablo var. Öğrencinin mezun olduğu lise bir tane olacağını düşünürsek şekildeki ilişki türü buna uygundur. Ogrenciler tablosundaki Mezun_Lise_Id alanı ile ilişkili tabloyla alakalı Lise_Id alanı eşleştirilerek ilişki sağlanmış olunuyor.
Eğer ogrenci ve mezun olduğu lise bilgisini birleştirerek veritabanını sorgulamak istersek aşağıdaki SQL sorgusunu çalıştırmamız yeterli olacaktır:

view source

print?

1 SELECT
* FROM
Ogrenciler, Liseler WHERE
Ogrenciler.Mezun_Lise_Id = Liseler.Lise_Id

Yapılan kısaltmalara açıklık getirelim.
(PK) : Primary Key (Birincil Anahtar)
(FK) : Foreign Key (Komşu Anahtar)

Birden Çoğa İlişki Türü: (İlişkisel Veritabanı Tasarımı)

Birden çoğa ilişkide bir tablodaki anahtar ilişkili olduğu tabloda birden çok kez olabilir.
Şekille gösterelim: (İlişkisel Veritabanı Tasarımı)

Yukarıdaki şekilde bir karikaturcunu birden fazla karikature sahip olabileceğini çıkartabiliriz. Çünkü Karikatur tablosunda ilişkili olduğu tablonun anahtarı bulunuyor (Foreign Key). Bu ilişki türü en çok karşılaşılan ilişki türüdür. Karikatürcü ve karikatur bilgisini veritabanından çekecek olursak yazacağımız SQL kodu şöyle olurdu:

view source

print?

1 SELECT
* FROM
Karikaturcu, Karikatur WHERE
Karikaturcu.Karikaturcu_Id = Karikatur.Karikatur_Id

Çoktan Çoğa İlişki Türü: (İlişkisel Veritabanı Tasarımı)

Çoktan çoğa ilişikiler karmaşıklığı nedeniyle veritabanında bir çok soruna neden oldur.
Soruna neden temek olarak şudur Bir tablodaki anahtar ilişkili olduğu tabloda birden çok kez olabilirken karşıtı da doğrudur.
Bu yüzden istenilen ilişkiselliği sağlamak için ilişkiyi birden çoğa indirgemek gerekir. Yani araya fazladan bir tablo koyarak karmaşıklıktan kurtulmuş oluruz.

Bunu nasıl yapağımızı örnek vererek açılayayım:
Bir futbolcu birden fazla takımda oynayabilirken aynı takım birden fazla oyuncu oynatabilir olduğunu varsayalım.

Öncelikle Futbolcular ve Takimlar adında aşağıdaki şekildeki gibi iki tane tablo olşuturalım: (İlişkisel Veritabanı Tasarımı)

Daha önce yaptığımız gibi anahtari ilişkisel olduğu tabloya Foreign Key ( Komşu Anahtar) ekleyerek çoktan çoğa ilişkiyi sağlamak düşünürseniz mümkün değil.
Bu yüzden araya aşağıdaki gibi bir tablo ekleyelim:

Böylece hedefi tam 12′den vuracak şekilde ilişkisel veritabanı tasarımını yapmış olduk.

Çoktan çoğa ilişkiyi birden çoğa indirgediğimiz için iki tane birden çoğa ilişki elde ettik yine bu sebepten iki tane FK (Foreign Key) ortaya çıktı. Dolayısıyla SQL sorugusu iki adet olacak. Birincisi bir futbolcunun oynadığı takımlar, ikicisi ise bir takımda oynayan futbolcular olacak.

Birinci sorgumuz (Id numarası 1 olan futbolcunun oynadığı takımları getiren sorgu)

1 SELECT
* FROM
Futbolcular, Takimlar, Takim_Futbolcu WHERE
Takim_Futbolcu.Futbolcu_Id = Futbolcular.Futbolcu_Id AND
Futbolcular.Futbolcu_Id=1

İkinci sorgumuz (Id numarası 1 olan takımda oynayan futbolcuları getiren sorgu)

1 SELECT
* FROM
Futbolcular, Takimlar, Takim_Futbolcu WHERE
Takim_Futbolcu.Takim_Id = Takimlar.Takim_Id AND
Takimlar.Takim_Id=1

Artık üç tip ilişki tipini öğrendik. Biraz da normalizasyon konusunu inceleyelim.


Normalizasyon

Normalizasyon kısaca işinizi kolaylaştıracak bir takım kurallar kümesidir. Tablolarınızı uygun hallerde ilişkilendirme ve gecekteki olası büyümelere karşı esnek olacak şekilde organize edebilme yeteneğidir.

Normalizasyonda kullanılan kurallar kümesine normal formlar denir. Toplamda 7 adet birbirini izleyen normal form vardır. Fakat 7 adet normal form kullanan çok azdır ya da yoktur. :) Genellikle ya 2 ya da 3 adet form kullanmak yeterli olmaktadır. Bu yüzden Normalizasyon konusunu anlatırken biz de 3 adet normal form kullanacağız.

Daha önce yaptığımız örneğe benzer bir örnekle Normalizasyon konusuna giriş yapalım. Birinci normal formu uygulamak için düzeltilmesi gereken problemler olması gerekir. Veritabanında çalışırken oluşabilecek problem düz tablodur. Düz tablo bir sürü sütuna sahiptir ve birbirine benzer veriler yer alır. Tüm veriler düz tablo içinde yer alır. Bir takım ve takımda oynayan oyuncuların hepsinin sadece bir tabloda, yani düz tabloda olduğunu düşünün:

Yukırıdaki tabloda ileriye yönelik oluşabilecek en büyük sorun şudur: Takimda oynayan başka bir oyuncu eklemek için yeni sütünlar eklemek gerekir. Bu senaryo oldukça verimsiz ve fazla fiziksel alan tüketir. Problemi belirledikten sonra çözüm üretmek için artık birinci normal formu hazırlayabiliriz.

1) Birinci normal form: (İlişkisel Veritabanı Tasarımı ve Normalizasyon)

Kurallar:
- Tekrarlanan bilgiyi ele.
- İlişkili veri için ayrı tablolar oluştur.

Eğer kuralları uygularsak tekrarlanan veriler için tabloyu Futblcular ve Takimlar olarak ikiye ve ilişkiyi Foreign Key (Komşu Anahtar) kullanarak çözebiliriz.
Birinci normal form uygulandıktan sonra:

Yaptığımız iki tablo ve arasındaki birden çoğa ilişki sayesinde bir takımda oynayan futbolcuları farkli bir tabloya ekledik ve böylece esneklik sağladık.

2) İkinci normal form: (İlişkisel Veritabanı Tasarımı ve Normalizasyon)

Bu normal formun kuralları şöyle olsun ;
- Birinci anahtara bağlı olmayan ve anahtar olmayan nitelikler.

Bu kuralı uygulayacak olursak yeni bir tablo oluşturak Birinci anahtara bağlı olmayan ve anahtar olmayan nitelikleri elemiş oluruz.
İkinci normal forma alınmış hali:

3) Üçüncü normal form: (İlişkisel Veritabanı Tasarımı ve Normalizasyon)

Üçüncü normal form kuralları;
-Anahtar olmayan ve diğer niteliklere bağlı olmayan nitelikler.

Üçüncü normal forma alınmış hali:


Yukarıdaki şekilde takim kurucularının bilgisini başka bir tabloya taşıyarak esnekliği arttırdık.

Normalizasyon konusu bu şekilde ve form sayısı ihtiyaca göre arttırılabilir. Sizde kendi ilişkisel veritabanını dizayn ederken bu üç ilişkiyi ve normalizasyonu uygulayarak veritabanına esneklik, kullanım rahatlığı ve hakimiyet sağlayabilirsiniz.

ADO. NET Nedir?

09 April 2011 Leave a comment

Ado. Net Microsoft’un veriye erişme teknolojisinin adıdır.

Eskiden Microsoft’un veriye erişme teknolojisinin adı bilindiği üzere Ado’dur. Bu teknoloji Activex teknolojisi ile geliştirilmiş bir teknolojidir.
Ado, Ado. Net’ e temel oluşturduğu söylenen bir teknolojidir. Ancak hala bu görüş tartışılmaktadır. Aralarında ortak olan ve tartışılmayan tek şey ise veriye erişim felsefesidir.

Ado. Net, . Net Framework ile geliştrilen veri işlemlerini kolaylaştıran, N katmanlı mimariler geliştirmek için hazırlanmış ayrıca offline sistemleride destekleyen ve XML’e tam destek veren bir sistemdir.
Ado. Net temelde 2 farklı model olarak incelenebilir.

Bunlar Connected(Bağlantılı) ve Disconnected(Bağlantısız) modeldir.

Connected(Bağlantılı) model:Bu modelde veri tabanı ile direk bağlantı sağlanır. Yapılan değişiklikler, veri tabanına direk yansır. Bu modelde; veri tabanı ile uygulama arasında daima bir bağlantı bulunmaktadır. Genelde online işlemlerde kullanılır. Bu sistemin eksileri son satırı okuyana kadar bağlantının açık kalmasıdır. Bu da ekstra yük demektir.
Disconnected(Bağlantısız) model: Bu model veri tabanını kullanmak için her seferinde ona müracaat etmek yerine, veri tabanının bir örneğini Ram üzerine alarak, gelen talepleri belleğin üzerinden gerçekleştirmek için kullanılan bir teknolojidir. Her şey Ram üzerinde yapılır. Böylece veri tabanına fazla yük binmemiş olur. Örneğin güncelleme silme yeni kayıt oluşturma vs. Ama bu modelinde artıları olduğu gibi eksileri vardır. Mesela veri tutarsızlığı, verilerin güncelliğini yitirmesi gibi.

Bu modelin en önemli yapı taşları DataSet, DataTable ve DataAdapter’dır.
Şunu hatırlatmakta fayda vardır ki: bu model duyulduğunda bağlantı yokmuş gibi bir fikre kapılabilinir ama aslında bunda da kesinlikle bir bağlantı vardır.

Ado. Net Üyeleri


System. Data: Ado. Net’in en temel kütüphanesidir. Veriyi sembolize eden veri tipleri bu namespace altındadır. Örneğin DataTable,DataSet gibi. .
System. Data. Common: Bu namespace Data namespace’in altında durmaktadır. Bu namespace’i kullanarak, Managed Provider dediğimiz; veriye erişim kaynaklarında kullanilan sistemlere yönelik siniflar bulunmaktadir. Örneğin; DbDataAdapter,DbConnection,DbCommand,DbDataReader gibi. .
System. Data. Odbc: Bu namespace (Open Database Connectivity) standartlarını sağlayan ve odbc bulunan sistemlere bağlantı kurmayı sağlayan sınıfları bulundurmaktadır. Örneğin; OdbcCommand, OdbcConnection,OdbcDataAdapter gibi sınıflar vardır.

System. Data. OleDb: Bu namespace her türlü veritabanına erişmek için kullanılır. Örneğin Oracle,Mysql,MsAccess gibi.

System. Data. SqlClient: Bu namespace sadece Sql Server’a bağlanmak ve bunuda tam performanslı yapmak için kullanılan tipleri içerir. Aslında SqlServer’a OleDb ile de bağlanılabilir ama burada bunu daha performanslı kılan özel tipler vardır.

System. Data. SqlType: Bu namespace altinda bulunan, veri tipleri, Ms Sql Server icerisinde desteklenen doğal veri türlerini icerir.
System. Data. OracleClient: Bu namespace normalde . Net FrameWork’te yoktur. Ama Oracle’cıların oturupda yazdığı bir namespace’tir. Oracle’a OleDb ile de bağlanılabilir. Ama bunu performanslı yapabilmek için böyle bir kütüphane oluşturulmuştur.

Ado. Net’ten Bazı Tipler

  • SqlConnection: Bu sınıf ile bağlantı kurmak istediğimiz yeri(bu local olur veya farklı bir yerdeki server olabilir),bağlanma şeklimizi,bağlantı kuracağımız database’mizi ve birçok özelliğini burada belirtiriz. Bu sınıfın en önemli faktörü bağlantının açık unutulmamasıdır.
    Bir diğer önemli özellik ise bağlantı cümlesidir. Çünkü yetkilere ve rollere göre bağlantının açılabilmesidir.
    Bu nesne System. Data. SqlClient namespace’i adı altında bulunmaktadır.

SqlConnection sınıfının bazı özellikleri şöyledir:
SqlConnection con = new SqlConnection();
//Sınıfımızı burada örnekliyoruz.
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
//Burada SqlConnectionStringBuilder kullanma sebebim bazen çok fazla özellikler yazmak zorunda kalırız SqlConnection’ın içine. Bu yüzden işimizi kolaylaştırmak için ve özelliklerini daha iyi göstermek için kullandım.
builder. DataSource = “. “;
//Burası Sql Server İnstance adının yazıldığı yerdir. Ben burada default olarak bağlandım locale.
builder. InitialCatalog = “AdventureWorks”;
//Bağlanmak istediğimiz database adını buraya yazıyoruz.
builder. IntegratedSecurity = true;
//true ise Windows Authentication ile bağlanılmak istendiğini, false ise SqlServer Authentication ile bağlanmak istenildiğini gösterir.
builder. UserID = “sarikanaryam”;
//false ise user id yi buraya yazılır.
builder. Password = “fenerbahcem”;
//false ise password da buraya yazılır.
builder. AsynchronousProcessing = true;
//Bazen Asenkron işlemlerde bulunmak isteriz o zaman asenkron işlemleri yapabilmek için true değerini vermemiz gerekir.
builder. Pooling = true;
//Aynı connectionstring isteklerinde bağlantının tekrardan oluşturulmasu yerine bu özelliği true olarak yazdığımızda connectionstring havuza atılır. Sonraki baglantı işlemlerinde bu havuzda olan açık ve kullanılabilir bağlantı alınıp kullanılır. Default olarak 100 adet bağlantı tutulur.
builder. MaxPoolSize = 523;
//Eğer biz ayarlarla oynamak istersek Pooling özelliğini false yapıp kendi değerlerimizi atarız.
builder. MinPoolSize = 223;
con. ConnectionString = builder. ConnectionString;

Open():Bu metod bağlantının açılmasını sağlar.
Close():Bu metod bağlantının kapatılmasını sağlar.
State :Bu özellik ise bağlantının durumunu verir. Örneğin açık,kapalı,çalışıyor veya kırılmış gibi. .

  • SqlCommand: Sql’ de yapılacak işlemlere ayak olan sınıftır.
    Bu nesne System. Data. SqlClient namespace’i adı altında bulunmaktadır.
    Başlıca metot ve özellikleri şöyledir.
    SqlCommand cmd = new SqlCommand();
    //Önce sınıfımızı örnekliyoruz.
    cmd. CommandText = “Select top 5 name from production. product”;//burada çalıştırmak istediğimiz sql cümlesini yazıyoruz.
    cmd. CommandType = CommandType. Text;
    //burada yazdığımız cümlenin ne olduğunu söylüyoruz.
    cmd. Connection = con;
    //hangi bağlantı üzerinden bu işlemleri yapacağımızı söylüyoruz.

cmd. ExecuteNonQuery():Yazılan Sql cümlesi yada stored procedurlerde yapılan işlemler sonrası etkilenen kayıt sayısını geriye döndürür. Geriye int tipi döner.
cmd. ExecuteScalar():Bu metod excecutenonquery gibidir fakat geriye bir int tip değilde object cell dönderir yani tek bir hücre döner.
cmd. ExecuteXmlReader():Sql server üzerinde oluşturulmuş xml veriyi bozmadan veriyi xml olarak almayı sağlar.
cmd. ExecuteReader():Bu metod ise veri paketi ya da paketlerini okur. Geriye ise SqlDataReader döner.

  • SqlDataReader: Bu sınıf Connected modellerde kullanılır. Bu sınıftan örneklenen değişken yukarda anlatıldığı üzere ExecuteReader() metodundan döner. Ayrıca bu sınıf sadece read-only ve forward-only mantığı ile çalışmaktadır. Bu nesne System. Data. SqlClient namespace’i adı altında bulunmaktadır.

Bazı önemli metod ve özellikleri şöyledir.
SqlDataReader dr = cmd. ExecuteReader();//önce bilgiyi üzerimize aldık.
dr.Read()://bu metod result setin bir sonraki satırına geçmeyi sağlar. Satır varsa true yoksa false döner.
dr.GetSQLTİPADI()://burada SQLTİPADI() yazılan yere sqlserverdaki o fieldın tip adı getirilir. Ayrıca bu metod; örneklediğimiz field Read olduğunda o satırdaki sütunların değerlerini alabilmeye yarar.
dr. Close():Veri okuma bittiğinde bu metod ile kapatılır.
Bir örnek kullanım verecek olursak:


  • SqlDataAdapter:Bu sınıf Disconnected modelin en güçlü parçasıdır. Ne iş yapar bu sınıf? Bu sınıf yazılan cümlede oluşturulan cümleyi getirmede,onu bellek üzerinde tutacak olan sınıflara aktarma,silme güncelleme gibi işlemleri tekrardan veritabanına işlemede kullanılır. Bağlantısız ortamda bağlantı ile kullanıcı ilgilenmez. Bu sınıf bağlantıyı nasıl bulduysa öyle bırakır. Kapalı ise bağlantıyı açar,işini yapar çıkar gider,bağlantıyı kapatır. Açık ise işini yapar ve açık bırakır.
    Bu nesne System. Data. SqlClient namespace’i adı altında bulunmaktadır.
    Bu işlemleri yapabilmesi için SqlCommand’ın bazı özellikleri verilmiş diyebiliriz.
    da. SelectCommand = cmd;
    da. InsertCommand = cmd;
    da. UpdateCommand = cmd;
    da. DeleteCommand = cmd;
    //Buradaki property ler SqlCommand tipinden bir nesne alır.

  • DataTable: Veri tabanındaki tabloyu temsil eder, içersinde kolonlar ve satırlar bulunmaktadir, veri tabanındaki bir tabloyu Baglantisiz Ortamda DataTable ile temsil edebiliriz. DataTable olusturulurken, kolonlarinda veri tipleri belirtilir, ve bu kolonlara sadece o türde veri girilebilir. VeriTabanından veriyi üzerine DataAdapter nesnesi aracılığı ile üzerine alır. Bu nesnenin fill metodu ile veri aktarılır.
    Bu nesne System. Data namespace’i adı altında bulunmaktadır.
  • DataSet: Veri tabanındaki Databaseleri temsil eder, yani içerisinde birden fazla tabloyu tutabilen yapilardir, dolayısıyla birden fazla datatable içerebilir.

    Uzun lafın kısası DataColumn’lar birleşerek DataRow’ları, DataRow’lar birleşerek DataTable’ları,DataTable’lar birleşerek DataSet’leri meydana getirir.

    DataTable olduğu gibi veritabanından veriyi dataadapter nesnesi ile doldurulur.
    Bu nesne System. Data namespace’i adı altında bulunmaktadır.


Kaynak: http://www.ahmetcebisli.com/?p=192

Categories: ADO.NET, Veritabanı

İleri Veritabanı Sistemleri

12 March 2010 Leave a comment

AHMET YESEVİ ÜNİVERSİTESİ’nden html şeklinde anlatım, buyrun

Categories: Veritabanı
Follow

Get every new post delivered to your Inbox.