28 Eylül 2010 Salı

Relations (Veritabanı ilişkileri)

Bu konudan önce,  Normalization başlıklı yazıyı okumanızı öneririm.

Relation, veri tabanı tasarımcılarının, normalize edilmiş bir veri tabanı yaratırken, veri tekrarını önlemek için kullandıkları bir araçtır.  Basitçe, relation, tekrarlanan verinin, veritabanında hangi tabloların, hangi alanlarında bulunacağını gösteren bir yoldur.
Ana verinin  bulunduğu tabloya parent table denir. Normalization yazısında örneğini yaptığımız ve müşteri bilgilerinin tutulduğu Customer tablosu, bir parent tablodur.

Parent tabloda bulunan asıl veriye ulaşmak için pointerların tutulduğu tabloya Child tablo denir.  Parent ve Child tablolar birbirleriyle ilişkilidirler.  Yine normalizasyon yazısındaki, normalize edilmiş Order tablosu, bir child tablodur.  Order tablosundaki CustomerID ile Customer tablosundaki CustomerID alanıyla ilişkilidir.

Customer tablosundaki, CustomerID nin her bir müşteri için ayrı olduğunu ve Customer ID den müşterinin tüm bilgilerine ulaşabileceğimizi söylemiştik. Yani Customer tablosundaki CustomerID unique'dir ve başka tablolar ile CustomerID  alanı ile ilişkilendirilir. Bu neden Customer tablosundaki CustomerID'yi primary key yapabiliriz.

Bu durumda, diğer tablolardaki (Örneğin Order tablosundaki) CustomerID alanı, Customer tablosundaki, CustomerID yi işaret eder ve buna da foreign key denir.



Birkaç  çeşit veritabanı ilişkisi vardır.
One-To-One (1 - 1)  : Parent tablodaki bir satıra karşılık, child tablodada sadece 1 satır bulunur.  Örneğin Müşteri tablosundaki adres bilgisini başka bir tabloda tutsaydık ve sadece tek bir adres girilmesine izin verseydik, Müşteri ve Adres tablosu arasında "Bire - Bir" ilişki kuracaktık.

One-To-Many (1 - *) : Parent tablodaki bir satıra karşılık, child tabloda birden fazla satır olabilir. Tıpkı Müşteri ve Sipariş tablosundaki ilişki gibi. Bir müşteri 1 veya daha fazla sipariş verebilir.

Many-To-Many (*-*) : Parent tablodaki bir satıra karşılık, child tabloda birden fazla satır olabildiği gibi, child tablodaki bir satıra karşılık da, parent tabloda birden fazla satır olabilir. Many-To-Many ilişki aslında birden çok One-To-Many ilişkinin bir araya gelmesinden oluşur. Bu ilişkileri bir araya getirecek olan ve  Many-To-Many ilişkiyi sağlayacak olan bir ara bağlantı tablosudur. Bu tablo sadece ilişkide gerekli olan alanları tutar.

Aşağıdaki şekil, many to many ilişki kurulmuş bir örnek gösteriyor. Asp.Net 'in  user - role leri yönetmemiz için hazırladığı aspnetservices veri tabanından bir gösterim.

Users ve Roles tabloları var. Bir kullanıcı birden fazla role'de yer alabileceği gibi, bir role için de birden fazla kullanıcı tanımlanabilir.
Kullanıcı bilgileri aspnet_Users tablosunda tutuluyor. Yanında anahtar resmi görünen UserId alanı, tablonun primary key'i.
Role'ler, aspnet_Roles tablosunda tutuluyor. RoleId alanı ise, bu tablonun primary key'i.
Many-To-Many ilişkiyi sağlayan ise aspnet_UserInRoles tablosu. Bu tabloda sadece her iki tablonun da primary key'leri tutuluyor.

Bu gösterimi, SQL Server Management Studio'da, "Database Diagram" kullanarak hazırladım.  Tüm veri tabanı tasarım toolları tablolar arasındaki ilişkinin varlığını araya çizgi çekerek ifade eder. Sadece ilişki türleri biraz farklı gösterilebilir. SQL Server,  Tek bir kayıt olacağını gösterdiği yerler için anahtar şeklini, çoklu kayıt olacak yerlerde ise sonsuz işaretini kullanmış. 

aspnet_Users ile aspnet_UsersInRoles arasındaki ilişkide,  aspnet_Users tarafında bir anahtar işareti görünüyor. Bu, ilişkinin o tarafında tek bir satırın olacağını gösteriyor.  aspnet_UsersInRoles tablosuna bağlanan yerde ise bir sonsuz işareti var, bu tabloda bir kullanıcıya karşılık istediğimiz kadar role ekleyebileceğimiz anlamına geliyor.

Aynı türde ilişki aspnet_Roles ve aspnet_UsersInRoles tabloları arasında da kurulmuş. Bu ilişki de bir role'ün birden fazla kullanıcıya verilebileceğini ifade ediyor.
Sonuç olarak, bu 3 tablo ile, bir kullanıcıya birden fazla görev verilebilirken, bir görevde de birden fazla kullanıcının olabileceği bir  yapı sağlanmış oluyor.


Primary key, foreign key ve ilişkilerin SQL Server'da nasıl tanımlandığına daha sonra değineceğiz.

Hiç yorum yok: