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

İ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ı)

ilişkisel veritabanı  tasarımı (dizayn)  1

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:

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ı)

ilişkisel veritabanı  tasarımı (dizayn)  2

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:

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ı)

ilişkisel veritabanı  tasarımı (dizayn)  3

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:

ilişkisel veritabanı tasarımı (dizayn)  4

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)

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)

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:

ilişkisel veritabanı  tasarımı (dizayn) normalization form  5

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:

ilişkisel veritabanı tasarımı (dizayn) normalization form

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:

ilişkisel veritabanı tasarımı (dizayn) normalization form   7

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: ilişkisel veritabanı tasarımı (dizayn) normalization form   8

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.

Hepinize kolay gelsin.

Yararlandığım kaynak :

- PHP, MySQL ve APACHE (yazar: Julie C. Meloni, 2006)

yazan Zülküf Küçüközer tarih   24th August 2009
primary key words  Veritabanı | Normalizasyon | İlişkisel veritabanı | Tasarım okunma  72452
secondary key words  Normal formlar
writing Mustafa Çelik writing 9th August 2010
Elinize saglık yararlı bir bilgi olmuş...
writing samet writing 15th August 2010
çok teşekkür ederim.
writing zülküf küçüközer writing 28th August 2010
ben teşekkür ederim yorumlarınız için :)
writing dilek erdemir writing 6th October 2010
bırde dezavantajlarını yazsaydınız tam super olacaktı..
writing çigdem writing 8th December 2010
süper olmuş tabloyla anlatım daha açıklayıcı oluyor teşekkürler..
writing est2000 writing 31st July 2011
sağ olasın güzel yazı
writing Muhammet writing 6th September 2011
Teşekkürler. Emeğinize sağlık
writing P?nar writing 11th January 2012
Teşekkürler kısa ve öz bir şekilde bizi bilgilendirdiniz.Kafa karıştırmadan anlaşıldı...:)
writing ilker writing 24th June 2012
eyw hocam saol
writing Pinar writing 4th December 2012
Tek kelimeyle harika çok teşekkür ederim :) çözdüm PK ile FKi :D
writing SONER writing 6th January 2013
helal olsun haci delikanli adamsın vesselam
writing Levent writing 24th February 2013
bilgi için teşekkürler.
writing Serhat writing 31st March 2013
Gerçekten Harika bir yazi olmus. Çalismalarinda Allah kolaylik versin.
writing Hüseyin KAPLAN writing 20th April 2013
Hocam elinize emeginize saglik Allah ragzi olsun :)
writing cem writing 13th November 2013
emeginize saglik
writing serdar writing 28th November 2013
merhaba ürün ve ürüne ait bazi detay tablom var ancak sorun su detay tablosunda her ürünün bazi alanlarini girmiyorum örnegin elbise için body alanini kullaniyorum ancak elektronik bir üründe bu alani kullanmiyorum bos geçmek zorundayim bos birakilan bir alan 4byte yer kapliyor sanirim,örnek yine bir firmanin detay tablosunda firma_id | adres | telefon | mail kolonlari var firmanin adresini yazdiktan sonra tekrarli kayit olan n tane telefonu yada mail adresi olabilr bu durumda yeni bir kayit giriyorum ve mail adresini yaziyorum ancak adres ve telefon kisimlarini haliyle bos geçiyorum bu dogru bir yolmu yoksa ne yapmam lazim
writing Zülküf Küçüközer writing 7th December 2013
Merhaba Serdar, 4 byte'lik bosluklar sorun olmaz. Yeterki master tablosundaki bir kaydin birden fazla kaydi tekrar etmesiz yani detay tablosunda bir tane satiri olsun. Bos olan alanlar yer kaplamayacaktir.
writing Kemal writing 26th March 2014
Hakikaten çok iyi bir anlatim olmus çok isime yaradi sagolun...
writing mehtap writing 10th April 2014
beyendim saolun güzel yazi
writing seda nur writing 22nd September 2014
iliskisel tabolarda neden illerin adini yazmayiz da kodlarini yazariz
writing ahmet writing 16th December 2014
elinize yüreginize saglik
writing Zülküf Küçüközer writing 26th February 2015
Merhaba Seda, kodu derken 'Id' gibi alanlardan bahsediyorsaniz sebebi integer ya da long tipinde UNIQUE alanlar kullanilirak String tipine göre fazla fiziksel alan kaplamamasindan dolayidir. Bu yüzden iliskili tablolarada ID içeren alanlar üstünden iliski kurulur.