Veritabanı Normalizasyonu

Veritabanı normalizasyonu, ilişkisel veritabanı sistemlerinde tablolara karar verme kurallarıdır. Sağlıklı bir veritabanı uygulaması için bu kurallara uyma zorunluluğu uygulamanın kapsam ve önemiyle doğru orantılıdır.

İlişkisel bir veritabanı sistemi Veritabanı Tasarımı makalemizde ifade edildiği gibi veri bütünlüğünün sağlanması, bilgi tekrarının önlenmesi, verilerin doğru ve etkin bir biçimde kullanılması sağlamaktadır. Veritabanı sistemlerinde veriler tablolarda tutulmaktadır. Normalizasyon kuralları da bu tablolarda tutulacak verilerin nelerden oluşacağına karar verme kuralları olduğuna göre ilişkisel veritabanı tasarımı aşamasında gerekli bir işlemdir. Genel kabul görmüş 5 normalizasyon kuralı vardır.

1. Normalizasyon Kuralı:

Bir satırdaki bir alan yalnızca bir tek bilgi içerebilir. Örneğin dersler tablosunda, ders tipi için zorunlu, seçmeli diye alanlar açsaydık, bu kurala uymamış olurduk. Böyle bir durumda, ayrıca ders tipleri tablosu oluşturularak bu kural çiğnenmemiş olur.

İpucu: Verileri virgül veya bir başka karakter ile ayırıp aynı alanda tutmak ve daha sonra program içerisinde split ile bu değerleri ayırmak ilişkisel veritabanının doğasına aykırıdır.

2. Normalizasyon Kuralı:

Bir tablo için, anahtar alan dışındaki her alan, birincil anahtar olarak tanımlı tüm alan veya alanlara bağlı olmak zorundadır.

Örneğin, Staj tablosunda OGRENC_ADI diye bir alan eklese idik, bu sadece STAJ ile ilgili bir bilgi olacaktı ve OGRENCI_NO’ya bağlı bir özellik olmayacaktı. Bunu çözmek için, öğrenci bilgilerini ayrı bir tabloda tutmak gerekir.

Eğer anahtar alan birden fazla alandan oluşuyorsa, anahtar alanlardan sadece birine bağlı veriler, tabloda yer almamalı, bu veriler ayrı bir tabloda tutulmalıdır.

Bunun tersi de geçerlidir. Yani iki ya da daha fazla tablonun birincil anahtarı aynı olmamalı. Eğer böyle ise, bu iki tablo tek tabloya indirilmelidir.

3. Normalizasyon Kuralı:

Bir tablo için, anahtarı olmayan bir alan, anahtarı olmayan başka hiç bir alana bağlı olamaz.

Örneğin, dersler için ders tipi adında bir alan ekleyip burada da zorunlu ders için Z, seçmeli dersler için S, zorunlu seçmeli dersler için ZS yazılsaydı, bu kodlama, dersler tablosunun birincil anahtarı olan DERS_KODU alanına bağlı bir kodlama olmayacaktı. Çünkü bu kodlama bir başka anahtarı olmayan alana bağlıdır. Bunun sonucunda da veritabanında, karşılığı olmayan bir kodlama yer almış olacaktı. Ders tipi bilgisini kodlu olarak tutan alan aslında ders tipi açıklaması olan başka bir alana bağlıdır. Bu ilişki başka bir tabloda tutulmalıdır.

Bu durumda, ders tipleri adında bir tablo gereklidir. Bu tablonun alanları da DERS_TIPI_KODU ve DERS_TIPI_ADI olmalıdır. Ancak bundan sonra, dersler tablosunda DERS_TIPI_KODU adında bir sütun açıldıktan sonra buraya da ders tipleri tablosunda tanımlanan ders tipi kodları yazılabilir.

4. Normalizasyon Kuralı:

Birincil anahtar olan alanlar ile anahtarı olmayan alanlar arasında, birden fazla bağımsız bire çok (1-N) ilişkisine izin verilmez.

4.Normal formu sağlamak için, her bağımsız bire çok (1-N) ilişki için ayrı bir tablo oluşturmak gerekir.

5. Normalizasyon Kuralı:

Veri tekrarlarını önlemek için her bir tabloyu mümkün olduğunca küçük parçalara bölmek gerekir. Aslında ilk 4 kural sonuçta bu işe yarar ancak, bu kurallar kapsamında olmayan tekrarlamalar da 5. normalizasyon kuralı ile giderilir.

Örneğin, öğrencinin uyruğu ile ilgili verinin girileceği bir sütun olsun: Bu bölüme girilecek bilgiler bellidir: T.C., Almanya, Fransa,.. gibi.

Bu bilgiler başka bir tabloda tutabilir. Böylelikle, kullanıcıların bu alan gelişi güzel bilgiler girmesi engellemiş olur. Bu da sorgulama esnasında veriler arasında bir tutarlılık sağlar. Bu işlem sonucunda, tutarsızlıklara neden olabilecek ve sık tekrarlayan veriler başka bir tabloya taşınmış olacaktır.

Veritabanı normalizasyon kuralları, bir ilişkisel veritabanının tasarlanma aşamalarını değil de ilişkisel veritabanında yer alacak kayıtların ilişkisel veritabanı ile uyumlu olup olmadığını denetlemeye yönelik olduğundan hareketle sonuç olarak ilişkisel bir veritabanı tasarımı;

– Yer kullanımı çok iyi olmalı dolayısıyla boş yer mümkün olduğunca az olmalıdır.

– Veri bütünlüğü sağlanmalı ve veri tekrarı yapılmamalıdır.

– Veriler, kendi aralarında bir ilişki tanımlanmaya uygun olmalıdır.

 Yazan : Yaşar Gözüdeli – SQL Server 2005 ve Veritabanı Programlama

Veritabanını Anlamak

tamamıyla alıntıdır:
 

VERİTABANI KAVRAMI

 

Şimdi sizler bu makaleyi okumaya başlarken “vay be Şişman Adam nerelerdesin sen” demeyin sakın… Son makalemizde msn’imizi yazdık ne arayan oldu ne de soran… Bu mudur yani ? İşin esprisi sevgili dostlarım uzun süre maceralara ara verdiğim için kusuruma bakmayınız ama bakınız 2007’ye bomba gibi giriyoruz…

 

Sevgili dostlarım; eğer bu maceraların takipçisiyseniz; yazılımın, hayatın tam içinden olduğunu biliyorsunuz demektir ve eğer bunun bilincindeyseniz; benden de böyle bir yazım tarzı bekliyorsunuz demektir…

 

Ama söz konusu Veritabanı olunca…

 

Ya… Heyecanlanmayın tamam… Şaka yaptım sadece “Ama” sı falan yok… :D Veri tabanı da, hayatımızın içinden bir kavram…

 

Şöyle düşünün arkadaşlar (bu tarzı yemin ederim çok özlemişim.) Günlük hayatımızda, doğumumuzdan ölüme kadar olan süreç içersinde tüm yaşamsal ihtiyaçlarımızı karşılamamızda yardımcı olan en önemli şey nedir sizce? Hadi canım dürüst olun! “Para” dır. Öyle değil mi?

 

Peki sizler günlük hayatınızda bu paraya sürekli ulaşabilmeniz, üzerinde işlem yapabilmeniz ve paranın güvenliğini sağlamak için ne yaparsınız… Sıralayalım:

 

  • Anneme veririm, annemden alırım. 

  • Yastığımın içine koyarım. 

  • Testiye koyup bahçeme gömerim 

  • Bankaya yatırırım ve böylece internet, telefon gibi iletişim cihazlarını kullanarak parama istediğim zaman erişir, üzerinde işlem yapabilirim. Hem de güvenli olur. 

Buradaki durumda; “en hızlı ve güvenilir” olanı seçersek; bu seçenek hiç şüphesiz ki; “Banka” olacaktır.

 

İşte sevgili dostlarım; günlük hayatımızdaki paranın yerini, yazılım hayatında “veri” almaktadır. Bankanın yerini ise Veritabanı…

 

O zaman Yukarıda yer alan son maddeyi buna göre tekrarlayalım

 

“Veritabanını kullanarak verime istediğim zaman erişir, üzerinde işlem yapabilirim. Hem de güvenli olur” (yo hayır tabii ki copy-paste yapmadım ellerimle yazdım).

 

Arkadaşlar, üzerinde önemle duruyorum ki, veritabanına kavramına hakim olmak ve ona hak ettiği ehemmiyeti vermek çok önemli. Lütfen ve lütfen veri tabanı bilmeden yazılım konusunda çok fazla yol kat edilemeyeceğinin bilincinde olalım…

 

Bu benden beklenmeyen ciddi uyarıdan sonra, hayattaki örneklerimize geri dönelim…

 

Dostlarım; mademki, veriyi para ile bir tutuyoruz, bu yoldan hareketle şunu söyleyebiliriz, önemli olan parayı BİRİKTİRMEK değil YÖNETMEK’ tir. Yoksa efenim enflasyonu var, devalüasyonu var… Risk yönetimini ciddiye almak lazım.

 

Yatırım yönetimi konusunda tecrübeli insanlardan öğrendiğim kadarıyla; paranın birbiriyle ilişkili olacak şekilde birden farklı yatırım kanallarına bölünerek değerlendirilmesi çok daha iyiymiş. Ama burada önemli olan kriter, yatırım kanallarının çok olması DEĞİL, ilişkilerinin sağlıklı olmasıymış…

 

Devam etmek isterim ama, konumuz SQL değil mi? Mademki veri eşittir para, o zaman acaba yatırımcı ağabeylerin / ablaların sözlerini veritabanında da kullanabilir miyiz ?

 

Evet, aslında sevgili dostlarım iki paragraf önce, ilişkisel veritabanı yönetimi sistemi – Relational DataBase Management System (RDBMS) kavramına girmiş oldunuz. Yazılım dünyasına hayırlı ve uğurlu olsun.

 

Evet arkadaşlar, veritabanındaki yatırım araçlarımız ise tablolarımızdır. Tablolar arası kurulan ilişkiler aracılığıyla; verinize güvenilir ve hızlı erişir ve aynı oranda güncelleyebilirsiniz… İşte bu, verileri tablolara bölme ve tabloları birbiriyle ilişkilendirme yöntemlerine de normalizasyon adı verilir.

 

Dostlarım, tecrübeli yatırımcılar nasıl tecrübelerini diğer yatırımcılara aktarıyorlarsa, RDBMS kavramına yılların emeğini vermiş insanlar da bizlere öyle aktarıyorlar modelleme yöntemlerini… Normalizasyon kavramı da aslında bu tarz önerilerin bir manifestosudur. Söz gelimi; Excel’de oluşturulmuş bir belge de veri tabanı olarak düşünülebilir ancak “hmm bak böyle yaparsan daha iyi olur” der bize normalizasyon…

 

Bir veritabanının normalizasyonunu oluştururken başlangıç olarak “amaçladığınız sonuç” a karar vermelisiniz dostlar. Yani elinizdeki verinin olabilecek en detaylı çıktısını örnekleyerek yola çıkarsınız.

 

Hadi eğlence başlasın o zaman

 

Senaryomuz bir telefonla pazarlama şirketi üzerinden olsun. Bu şirketin, nasıl çalıştığını kaba taslak bir çizelim önce…

 

Şirketimiz birkaç kategoriden oluşan ve birkaç farklı tedarikçinin sağladığı ürünleri, kayıtlı müşterilerine ulaştırmaktadır. Satılan ürünler, anlaşmalı kargo şirketleri tarafından müşterilere ulaştırılmaktadır. Bu arada, şirketin çalışanları sattıkları ürünlere belli oranlarda prim alırlar. Bu durumda söz konusu şirket için sipariş verilerinin tutulması çok büyük önem taşımaktadır.

 

Bu paragraf, bazı şeylerin kafamızda canlanması için yeterli sanırım. Bakınız bazı kelimelerin üzerinden geçelim ve daha dikkatli olalım

 

  • birkaç kategoriden oluşan 

  • farklı tedarikçinin sağladığı 

  • ürünleri 

  • kayıtlı müşterilerine 

  • anlaşmalı kargo şirketleri 

  • çalışanları 

  • sipariş 

(Bu sefer copy – paste yaptım. İtiraf ediyorum).

 

İstediğimiz en detaylı veri çıktısı ise aşağıdaki gibi olsun:

 

 


Sipariş No………1
Müşteri Adı……. Ayhan Çalışkan
SiparişTarihi…… 07.01.2007
Gönd.Gereken T. 14.01.2007
Kargo Tarihi…… 10.01.2007
Kargo Ücreti….. 100 YTL
Alınan Ürün…… Plazma TV
Ürün Kategorisi. Elektronik
Ürün Adedi        1
Sipariş Toplam   2500 YTL
 

 

Şimdi… Biraz kendimizi zorlayalım ve bazı sorular soralım:

 

  1. Böyle bir veriyi en hızlı ve en güvenli şekilde nasıl elde ederim

  • Bu veriden daha farklı olarak nasıl veriler üretilebilir ?
  • İkinci sorumuzdan başlayalım.

     

    • Çalışanlar satışları üzerinden prim aldıklarına göre, hangi çalışanın ne kadar ürün sattığı bilinmek istenecektir.

  • Hangi müşterinin belirli bir dönemde ne kadar ürün aldığı görülmek istenebilir.
  • Bir tarih verilip, o tarihteki siparişler görülmek istenebilir.
  • Kargo şirketlerinin durum takibi istenebilir
  • En çok hangi ürünün satıldığı / kar ettirdiği bilinmek istenebilir.
  • En çok kazandıran sipariş görülmek istenebilir
  • Ve daha fazlası.. Bu patronlar hep böyle canım isterler de isterler… Şimdi biz, bu veritabanının nasıl normalize edileceğine bakalım….

     

    Bir an için, bilgisayar diye bir şeyin icat edilmediğini var sayalım. Ama yine de, yukarıdaki raporları isteyen bir patron mutlaka olurdu herhalde !! (Ey sevgili patronum eğer bu yazıyı okuyorsan seni tenzih ederim… Sözüm meclisten dışarı :)

     

    Şimdi madem bilgisayar yok, o zaman raporları hazırlamanız için kendinize bir ekip kurardınız di mi? Peki Bu ekibin görev dağılımı en verimli nasıl olabilirdi ?

     

    Verimlilik derken şunu kastediyorum, ekibinizdeki tüm kişilerin performansı yüksek olmalıdır ki; istediğiniz raporu hızlıca hazırlayabilsinler. Çok sıkılıp bunalmasınlar. Her veriyi nerede bulabileceklerini çok iyi bilsinler. Yani o konuda uzman olsunlar.

     

    Demek ki, ekipteki her kişiye uzman olması gereken bir konu vereceğim;

     

    Örneğin;

     

    • Mehmet bey; siz yalnızca çalışanların bilgilerinden sorumlusunuz. Her bir çalışanın, adı, soyadı, iletişim bilgileri, doğum tarihi sizden sorulacak

  • Aykut bey; siz ise Kargo şirketlerinden sorumlusunuz efenim
  • Emre bey, siz Kayıtlı Müşterilerden sorumlusunuz. Şirketin müşteri portföyündeki tüm bilgileri ne var ne yok bilmenizi istiyorum
  • Cihan bey aramızdaki en tecrübeli sizsiniz bu nedenle Sipariş bilgilerini de size emanet ediyorum…Hangi siparişimiz hangi müşterimiz tarafından alınmış.. Hangi çalışan satmış, sipariş tarihleri falan sizden sorumludur efendim
  • İlhan bey, siz siparişlerin bazı detaylarından sorumlusunuz. Örneğin hangi siparişte hangi üründen kaç adet var – indirim felan yapılmış mı bu görev sizin…
  • Derya hanım, siz ürün bilgilerinden sorumlusunuz…
  • Ayhancım dostum, sen kategorileri çok iyi bileceksin. Ona hakim olacaksın hadi göreyim seni…
  • Tuğrul bey siz de, efenim lütfen tedarikçi şirketlerimiz hakkındaki tüm verilere hakim olunuz…
  • Şimdi değerli ekip arkadaşlarım beni iyi dinleyiniz. İşleri hızlandırmak için şöyle bir şey yapacağız; Şöyle ki :

     

    •  
      1. Ayhan ve Tuğrul bey siz telefon numaralarınızı Derya hanıma veriniz.

  • Derya hanım siz de telefon numaranızı İlhan bey’e veriniz lütfen.
  • İlhan bey siz, Cihan beyin de telefon numarasını alın…
  • Emre Aykut ve Mehmet bey sizlerde telefon numaralarınızı Cihan beye veriniz lütfen…
  • Bakın arkadaşlar bu sayede şöyle bir sistem kurmuş olduk;

     

    clip_image001

     


    Şimdi niye böyle bir şey yaptık? Şöyle düşünün yazılım dostları, ben Derya hanım’a, Ürünlerin hangi kategorilere ait olduklarını ve bu ürünleri kimden tedarik ettiğimizi sorarsam; Derya hanım hemen Ayhan bey’i arayarak ürünlerin kategorilerini soracak. Bilgileri aldıktan sonra da, Tuğrul beyi arayıp, tedarikçilerin isimlerini alacak. Yani, bu bilgiler, Derya hanım’da toplanacak ve istediğim rapor hazırlanmış olacak. Di mi ? Peki yukarıdaki “en detaylı veri çıktısı” nı istersem?

     

    O zaman;

     

    1. Cihan Bey, Mehmet Bey’i arayarak, Çalışan ismini sorar

     

    2. Cihan Bey, Emre Bey’i arayarak, Müşteri ismini sorar

     

    3. Cihan Bey, Aykut Bey’i arayarak siparişi götüren kargo şirketini sorar

     

    4. Cihan Bey, İlhan Bey’i arayarak hangi ürünün sipariş edildiğini sorar

     

    5. İlhan bey bunu bilmediğinden, Derya hanımı arar ve ürün adını öğrenir

     

    6. Derya hanım kategorisini öğrenmek için Ayhan bey’i arar

     

    Ve ben raporumu yine elde ederim !!!!

     

    Ya sevgili dostlar tahmin ettiğiniz gibi yukarıdaki senaryoda, ekibimde bulunan insanlar aslında birer tablo. Ve tablolar birbirlerine ilişkiler ile bağlı…

     

    Bakın bir kavram daha görmüş oluyorsunuz böylece….

     

    PrimaryKey’ler ve ForeignKey’ler… Bunu şöyle açıklayalım…

     

    Tuğrul bey’in cep telefonu numarası kendisinin PrimaryKey’idir…

     

    Derya hanımın cep telefonundaki rehberde yer alan Tuğrul Bey’in numarası ise ForeignKey’dir…

     

    Derya Hanım bu ForeignKey’i kullanarak Tuğrulbey’e ulaşır…

     

    İŞTE VERİM DİYE BEN BUNA DERİM

     

     

    Süper oldu ama di mi ? Ben yöneticilik mi yapsam ne ?

     

    Evet sevgili yazılımseverler… Bu makalemde, normalizasyon kavramını naçizane Şişman Adam tarzında anlatmaya çalıştım sürç-i lisan ettiysek affola…

     

    Umarım hoşunuza gitmiş ve veritabanı kavramının mantığını anlamışsınızdır…

     

    Bu arada sevgili kankalarım www.sismanadam.com adresinde de yazılarımı bulabilirsiniz. Hepinizi saygıyla selamlamadan önceeee, size msn adresimi bir kez daha veriyorum:

     

     

    Şişman Adam… Yazılım Aşığı Kahraman….

     

    Türkay ÜRKMEZ