Foreign Key Nedir ?
- 1
- 0
- 0
- 0
- 0
- 0
Merhabalar, Bir önceki yazımızda Primay Key konusunu ele almıştık. Bugün ki yazımızda Foreign Key Nedir? Konusunu ele alacağız.
Foreign Key için temel olarak birbirine bağlamak diyebiliriz. Bir tablodaki Primary Alan ile diğer tablodaki bir alanın eşleşmesidir. Örneklemeler üzerinden gideceğiz.
Örnek olarak Öğretmen ve Uzmanlık Alanı ilişkisini düşünelim. Her öğretmenin 1 tane uzmanlık alanı vardır ve uzmanlık alanları değerleride bellidir aslında. Her öğretmen için uzmanlık alanını yazmaktansa Uzmanlık Alanı diye bir tablo oluşturup, Öğretmende ki Uzmanlık Alanı ile eşlememiz en iyi çözüm olacaktır.
Foreign Key kullanarak gereksiz veri tekrarını ve veri bütünlüğünü sağlamış oluruz.
Foreign Key’in tabiki de olumsuz bir yanı vardır. Insert, Update, Delete işlemlerini yavaşlatır.
Foreign Key oluşturmak için kullanacağımız kod şu şekildedir:
ALTER TABLE [dbo].[AnaTabloAdI] WITH CHECK ADD CONSTRAINT [İsimlendirme] FOREIGN KEY([Ana Tablodaki Alan]) REFERENCES [dbo].[Referans Tablo] ([Referans Tablodaki Alan])
Konu ile ilgili örneklere giriş yapmadan şunları demek iyi olacaktır. İlişkileri kurarken 3 farklı durum mevcuttur.
- 1-1 (Çocuk-Anne)
- 1-N (Kitap-Kategori)
- N-N (Öğretmen-Öğrenci)
Bu ilişkileri özetlicek olursak 1 çocuğun 1 annesi olabilir, 1 kitabın 1 kategorisi olabilir ama 1 kategoride 1’den çok kitap olabilir, 1 öğretmenin 1’den çok öğrencisi olabilir aynı zamanda bir öğrencininde birden çok öğretmeni olabilir. Uygulamalara başlayabiliriz.
1-N İlişkisi
Bu uygulamamız için öncelikle kitap ve kategori tablomuzu oluşturuyoruz. Burada dikkat etmemiz gereken kitap tablosunun içinde, o kitabın hangi kategoride olduğu bilgisini tutacağımız CategoryId alanını unutmayalım.
CREATE TABLE [dbo].[Books]( [Id] [int] NOT NULL, [Name] [nvarchar](50) NULL, [CategoryId] [int] NULL, CONSTRAINT [PK_Books] PRIMARY KEY CLUSTERED ( [Id] ASC ) ) ON [PRIMARY] CREATE TABLE [dbo].[Categorys]( [Id] [int] NOT NULL, [CategoryName] [nvarchar](20) NULL, CONSTRAINT [PK_Categorys] PRIMARY KEY CLUSTERED ( [Id] ASC ) ) ON [PRIMARY] GO
Tablolarımızı oluşturduk. Foreign Key’ler unutmamamız gereken diğer bir durum referans alacağımız tablodaki alan Primary Key olmak zorundadır. Referans tablomuz Kategori tablosu olduğundan Id alanını Primary Key olarak tanımlamak zorundayız. İki tablo arasında şimdi ilişkimizi kurabiliriz.
ALTER TABLE [dbo].[Books] WITH CHECK ADD CONSTRAINT [FK_Books_Categorys] FOREIGN KEY([CategoryId]) REFERENCES [dbo].[Categorys] ([Id])
İlişkimizide kurduk. Artık kitap eklerken sadece kitabın kategorisinin Id’sini yazmamız yeterli olucaktır. Tablolarımızın bağlantı şekli aşağıdaki gibidir.
İlk önce kategori tablomuza verileri ekleyelim. Ardından kitap tablosuna verileri ekleyiniz. Foreign Key’lerin bir diğer avantajı olası silinme durumunda kurtarır bizi. Herhangi bir kategori içinde kitap yer alıyorsa ve o kategoriyi silmeye çalışırsanız hata alırsınız.
Msg 547, Level 16, State 0, Line 1
The DELETE statement conflicted with the REFERENCE constraint “FK_Books_Categorys”. The conflict occurred in database “Test”, table “dbo.Books”, column ‘CategoryId’.
Kategorinin içinde kitap olduğu için silemezsiniz.
N-N İlişkisi
En önemli ilişkidir aslında. Mülakatlarda sorulur. N-N ilişkisinde iki tabloda birbiri ile sonsuz sayıda ilişki kurabilir. Böyle bir durum olduğu için bu iki tablodaki eşleşmeleri başka bir tablodan kontrol etmelisiniz. Yani bu iki tablo arasına bir tablo yerleştirip (1-N)(N-1) şeklinde bir dönüşüm yapmak gerekiyor. Öğretmen ve öğrenci tablolarımızı ve bu iki tablodaki durumların yer alacağı ara tablomuzu oluşturalım.
CREATE TABLE [dbo].[Student]( [Id] [int] NOT NULL, [Name] [nchar](10) NULL, CONSTRAINT [PK_Student] PRIMARY KEY CLUSTERED ( [Id] ASC ) ) ON [PRIMARY] CREATE TABLE [dbo].[Teacher]( [Id] [int] NOT NULL, [Name] [nchar](10) NULL, CONSTRAINT [PK_Teacher] PRIMARY KEY CLUSTERED ( [Id] ASC ) ) ON [PRIMARY] CREATE TABLE [dbo].[TeacherStudent]( [Id] [int] NOT NULL, [TeacherId] [int] NULL, [StudentId] [int] NULL, CONSTRAINT [PK_TeacherStudent] PRIMARY KEY CLUSTERED ( [Id] ASC ) ) ON [PRIMARY]
Tablolarımızda gördüğünüz gibi TeacherStudent tablosu bizim ara tablomuzdur. Hangi öğrenci hangi öğretmen ile eş bilgisini vermektedir. Bağlantılarımızı oluşturalım.
ALTER TABLE [dbo].[TeacherStudent] WITH CHECK ADD CONSTRAINT [FK_TeacherStudent_Teacher] FOREIGN KEY([TeacherId]) REFERENCES [dbo].[Teacher] ([Id]) GO ALTER TABLE [dbo].[TeacherStudent] WITH CHECK ADD CONSTRAINT [FK_TeacherStudent_Student] FOREIGN KEY([StudentId]) REFERENCES [dbo].[Student] ([Id]) GO
Bağlantılarımızı oluşturduktan sonra tablolarımız arasındaki görüntü şu şekilde olacaktır.
Bu 3 tablomuza biraz veri ekleyelim ve sonucu görelim.
SELECT * FROM dbo.Teacher SELECT * FROM dbo.Student SELECT * FROM dbo.TeacherStudent
TeacherStudent tablosuna baktığımızda
- 1 Id’li öğretmenin sadece 1 Id’li öğrencisi var.
- 2 Id’li öğretmenin 1,2,3 Id’li öğrencisi var.
- 3 Id’li öğretmenin 1,3 Id’li öğrencisi var.
Tam tersi şeklinde de öğrenci-öğretmen ilişkisini çıkarabiliriz. Gördüğünüz gibi çoka çok (N-N) bir ilişkiyi kurmuş olduk.
Foreign Key oluşturmadan da bu işlemi yapabiliriz. Aynı tabloları oluşturmamız yeterli olacaktır sadece silinme ve eklenme durumunda bir kontrol olmayacaktır.
Yazımızın sonuna geldik. Bir sonraki yazıda görüşmek üzere.
1 Yorum
[…] oluşturduk. Bir önceki yazımızda ele aldığımız Foreign Key konusunu tablomuzda kullandık. Tabloların vazgeçilmezidir. Her çalışanın bir yöneticisi […]