Veri Tabanında Tablolar Arası İlişkiler (Bire-Bir, Bire-Çok, Çoka-Çok)
Yazılım projelerinin dinamizmi olarak nitelendirilen ve tamamen yapının üzerine kurulduğu veritabanı tasarımı oldukça önemli bir konudur. Yazılım geliştirme süreçlerinde henüz daha kod yazmaya geçmeden planlama ve analiz aşamalarında projenin tasarlanması, kağıda dökülmesi, veritabanı ilişkilerinin dizayn edilmesi ve projenin kod yazma aşamasına hazır hale getirilmesi gerekmektedir. Özellikle de orta ve büyük çaplı projelerde veritabanı tabloları hazırlanırken çeşitli ilişki türlerine de dikkat edilmelidir. İlişkili tablolarda hangi alanlar arasında hangi ilişkinin nasıl yapılacağına karar verilmesi, yazılım projelerinin ilerleyen aşamaları için büyük önem taşımaktadır.
Bu yazımızda veritabanı ilişki türlerinin hangileri olduğuna ve ne gibi özeliklere sahip olduklarına değineceğiz. Ayrıca örnek senaryolar da hazırlayarak tablolar arasındaki ilişkileri somut biçimde görmeye çalışacağız.
Veritabanı tabloları arasındaki ilişkiler bire bir, bire çok ve çoka çok ilişki olmak üzere 3 tanedir. Bir filmin birden çok kategoriye sahip olması, bir aracın sadece bir sigorta kaydına sahip olması, bir öğrencinin birden çok dersten sorumlu olması ve aynı biçimde bir dersin birden çok öğrenci tarafından alınacak olması gibi örnekler gerçek yaşamdan örneklerin aslında yazılım projelerine yansıdığını da göstermektedir.
Veritabanı mimarisi oluşturulurken tabloları olabildiğince parçalamak gerekir. Normalizasyon adı verdiğimiz bu işlem sayesinde büyük ve şişmiş veri tablolarından kurtulmak mümkün olup veritabanına daha esnek yapı kazandırmak, veritabanının performansını ve sorgu hızını artırmak da yine mümkün olacaktır.
Bahsetmiş olduğumuz ilişki türlerini sırasıyla açıklamak gerekirse;
Bire – Bir İlişki (1-1)
Bire bir ilişki durumu her iki tablo arasında kurulan ilişki neticesinde sol tablodan gelen bir kaydın sağ tablodan gelen sadece bir kayıtla eşleşmesi durumudur. Bire bir ilişki türü çok kullanılan bir yapı olmayıp güvenlik sebebiyle tabloların bir bölümünü yalıtmak ya da ana tablonun sadece bir alt kümesine ait olan bilgilerini saklamak amacıyla, birden çok alan içeren tabloların bölünmesinde kullanılan bir ilişki türüdür.
Buna en iyi örnek olarak ise kişilerin kimlik bilgileri eşleştirilmesidir. Persons (Kişilerin bilgilerinin tutulduğu tablo) adında bir tablo ile Identifications (kimlik bilgilerinin tutulduğu tablo) adlı iki tablo eşleştirilmesi neticesinde her bir kişiye sadece bir tane kimlik bilgisi getirilecektir.
Bu tablolar arasında primary key olarak PersonId ve IdentificationPersonId alanlarının eşleştirildiği görüntülenmektedir.
Bire – Çok İlişki (1-N)
Bire çok ilişkisi en çok tercih edilen ilişki türüdür. Soldaki tablodan gelecek tek bir kayda göre sağdaki tablodan birçok verinin alındığını gösteren ilişki türüdür. Bunun tersi çoka bir ilişkisi olup sağdaki tablodan bir kayıt soldaki tablodaki sadece bir kayıt ile eşleşebilir. Örneğin bir yazarın birden çok kitabı olabilir. Bunun tersi ise çoka bir ilişkisi olup bir kitabın sadece bir tane yazarı olabilir.
İlişkili veri tablolarında foreign key alanının hangi tabloya verileceği de önemlidir. Özellikle veri tekrarından kaçınılması için ilişkinin iyi kurulması gerekmektedir. Örneğin Author tablosunda BookId olarak foreign key tanımlansaydı aynı yazar bilgileri sürekli tekrarlanacak ve bu da yapının yanlış kurulmasına sebep olacaktı. Bundan dolayı 1-N ilişkilerde foreign key yapısı çoklu bilginin geldiği tabloya (N) eklenerek diğer tablodaki (1) primary key alanı ile eşleştirilmelidir. Böylece veri tekrarı da engellenecek olup daha esnek bir tablo yapısı kazandırılacaktır.
Çoka – Çok İlişki (N-N)
Çoka çok ilişkiler her iki tablodaki eşleşen kayıtların her iki tablo için de birden fazla verinin geldiği durumlardır. Bu tür ilişkilerde tablo yapısının daha esnek hale getirilmesi ve verim kazanılması için 3. bir tablo araya eklenerek diğer iki tablonun primary key alanları, 3. tabloda foreign key olarak belirtilir. Örneğin bir filmin birden çok kategorisi olabileceği gibi bir kategori birden fazla film için de geçerli olabilir. Bu senaryomuzda Movies, Category ve üçüncü tablo olarak ise MoviesCategory tablolarını ele alarak ilişkinin nasıl kurulacağını şu şekilde gösterebiliriz:
Bu ilişki türünde Movies ile Category arasında direkt ilişki kurulmayıp MoviesCategory adında üçüncü bir tablo eklenerek MovieId ve CategoryId olarak değerlendirilen Primary Key alanları, bu tablo için Foreign Key olarak eklenmiştir. Böylelikle MoviesCategory tablosundan Category tablosuna ve Movies tablosuna 1-N ilişkisi kurulmuş olup yapı oluşturulmuştur.
Genel olarak veritabanlarında verimliliğin artırılması, esnekleğin kazandırılması ve sistemin en iyi şekilde kurulması için normalizasyon işlemleri gerçekleştirilmektedir. Bu işlemler sayesinde tüm veriler tek bir tablo içerisinde toplanmayıp, çeşitli veri tablolarına dağıtılarak olaibldiğince parçalara ayırmak da yine en büyük amaçtır. Parça parça ayrılan tablolar arasındaki ilişkilerin ise bire bir, bire çok ve çoka çok olarak kurulması mümkün olup tüm yazılım sisteminin alt yapısı da veri tabloları üzerinden oluşturulabilir.