Veritabanı İlişki Tipleri

Depolanması gereken verilerin gittikçe artması ve hızın önem kazanması ile Oracle, MsSQL ve MySQL gibi ilişkisel veritabanlarında (relational database) tasarım oldukça önemli bir yer tutmaktadır. Bu nedenle veritabanı kurulurken ilişki tiplerine dikkat edilmelidir.

İlişkisel veri tabanlarında 3 tip ilişki vardır:

  • Bire Bir
  • Bire Çok
  • Çoka Çok

Birincil Anahtar (Primary Key): Tablolarda benzersiz kayıtlar elde etmemizi sağlayan sütuna verilen addır.

İkincil Anahtar (Foreign Key): Bir tabloda benzersiz kayıt oluşturmayı sağlayan sütunun diğer tabloda bir sütun olarak bulunmasına denir.

Bire Bir İlişki Tipi: İki tablo arasındaki ilişkiyi sağlayacak olan ortak alanların ikiside birincil anahtar (primary key) ise birebir ilişki olur.

Yukarıdaki şekilde MUAYENELER ve MUAYENEDETAY adlı iki tablo vardır. Her muayeninin bir detayı olacağı ve her detayında sadece bir muayene için olacağını düşünürsek güzel bir bire bir ilişki tipi olur. Burada ilişki iki tablonun MuayeneNo adlı birincil anahtarı ile sağlanır.

Eğer MUAYENELER ve MUAYENEDETAY tablolarını birleştirerek veritabanını sorgulamak istersek aşağıdaki SQL sorgusunu çalıştırmamız yeterli olacaktır:

1
2
 SELECT * FROM Muayene, MuayeneDetay
 WHERE Muayene.MuayeneNo = MuayeneDetay.MuayeneNo

Bire Çok İlişki Tipi: İki tablo arasındaki ilişkiyi sağlayacak olan ortak alanlardan birisi birincil anahtar (primary key) diğeri yabancı anahtar (foreign key) ise bire çok ilişki olur.

Yukarıdaki şekilde MUAYENELER ve HASTALAR adlı iki tablo vardır. Her hastanın birden fazla kez muayne olabileceğini ve her muayenenin yalnız bir hastaya ait olduğunu düşünürsek güzel bir bire çok ilişki tipi olur. Burada ilişki HASTALAR tablosundaki birincil anahtar HastaNo ile MUAYENE tablosundaki yabancı anahtar HastaNo ile sağlanır.

Eğer MUAYENELER ve HASTALAR tablolarını birleştirerek veritabanını sorgulamak istersek aşağıdaki SQL sorgusunu çalıştırmamız yeterli olacaktır:

1
2
 SELECT * FROM Muayene, Hastalar
 WHERE Muayene.HastaNo = Hastalar.HastaNo

Çoka Çok İlişki Tipi: Çoktan çoğa ilişikiler karmaşıklığı nedeniyle veritabanında bir çok soruna neden oldur. Sorunun temel nedeni 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.

Yukarıdaki tablolardanda görüldüğü gibi eğer ortadaki tablo olmasaydı birçok mühendisle bir çok proje ilişkisi oluşacak ve karmaşıklık yaratacaktı. Fakat araya yeni bir tablo ekleyerek MUHENDISLER ve MUHENDISPROJE tabloları arasında bire çok ayrıca MUHENDISPROJE ile PROJELER tablosu arasında bire çok bir ilişki oluşturuldu.

Böylece verimli bir ilişkisel veritabanı oluşturuldu.

Ç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 ikincil anahtar (Foreign Key) ortaya çıktı. Dolayısıyla SQL sorugusu iki adet olacak. Birincisi bir mühendisin yaptığı proje, ikicisi ise bir projede görevli mühendis olacak.

Birinci sorgumuz (Id numarası 1 olan mühendisin yaptığı projeleri getiren sorgu)

1
2
 SELECT * FROM Muhendisler, MuhendşsProje, Projeler
 WHERE MuhendisProje.PersonelID = Muhendisler.PersonelID AND Muhendisler.PersonelID=1

İkinci sorgumuz (Id numarası 1 olan projede görev alan mühendisleri getiren sorgu)

1
2
 SELECT * FROM Muhendisler, MuhendşsProje, Projeler
 WHERE MuhendisProje.ProjeID = Projeler.ProjeID AND Projeler.ProjeID=1

9 thoughts to “Veritabanı İlişki Tipleri”

  1. her tabloda yalnızca bir birincil anahtarmı olabilir ,bazı kaynaklarda birden fazla olur diyor.Bir tablodaki yabancı anahtar başka bir tablonun birincil anahtarı olmak zorundamı veya başka bir tabloda olmalımı

  2. Her tabloda yalnız birincil anahtar olmak zorunda değil, birden fazla kolonda birleşerek bir tekillik oluşturabilir, veya tbaloda hiç birincil anahtarda olmayabilir, ama genelde bu doğru bir kullanım değildir.
    Aynı şekilde tablonun birincil anahtarı başka bir tabloya referans vermek zorunda da değildir.
    Bu ilişkiler tamamen sizin analiz ve kurgunuza bağlıdır.

  3. Okuduğum bir kaynakta iki yada daha fazla tablonun birincil anahtarlarının aynı olamıyacağını durum böyleyse tek bir tabloya düşürülmesi gerektiğini yazıyordu.
    İlk örneğinizde farklı iki tablonunda birincil anahtarları aynı. Hangisi doğru kararsız kaldım.

  4. Dediğiniz gibide yapılabilir, iki tablodaki veri tek tabloda tek birincil anahtarla saklanabilir. Ama bu durum data arttıkça gereksiz alan kaybına, ilişki kurmakta zorluğa ve veriye ulaşmakta sıkıntı yaratcaktır. Bunların sonucunda da performans kaybı yaşarsınız.

  5. 3 tablom var üniversite fakülte ve bolüm her fakulte yalnızca bir üniversiteye, her bolümde yalnızca bir bolume ait olmak zorunda. bağlantıyı ve sorguyu nasıl yapacağım bilmiyorum yardım edebilir misiniz

  6. Verdiğiniz örnekte bölüm tablosunda fakülte bilgisini, fakülte tablosunda da üniversite bilgisini tutmanız yeterlidir. Bu bilgileri id bazında tutmak işimizi kolaylaştırır. Tablo kolonları elimde olmadığı için basitçe aşağıdaki gibi bir örnek verebilirim.

    select * from universite as uu, fakulte as ff, bolum as bb
    where bb.fakulte_id = ff.fakulte_id
    and ff.universite_id = uu.universite_id

  7. Merhabalar. proje ve kullanıcı olan bir veritabanım var. Projelerin bir yöneticisi var ve sonsuz sayıda katılımcısı olabilir. Bir kullanıcı bazı projelerde yönetici bazı projelerde katılımcı olabilir. Buradaki ilişkileri nasıl kurabilirim ?

  8. Merhaba, Burada ihtiyaca ve sürece göre değişik karar verilebilir.
    Eğer her projenin sadece bir yöneticisi olacaksa proje tablonda yönetici olan kullanıcının id sini tutarak atama yapabilirsin. Ayrıca bir proje-kullanıcı ilişkişi için bir tablo yaratarak proje id ile kullanıcı id lerini ilişkilendirebilirsin.
    Eğer bir projede birden fazla yönetici olursa ilişki tablosunda yönetici mi, kullanıcı mı gibi bir kolon ekleyerek durumu yönetebilirsin.
    Ben ikinci seçeneği tavsiye ederim, çünkü şuan için tek yönetici olsada ileride 1 den fazla yönetici olması durumunda geliştirme yapman daha kolay olur.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.