Ana içeriğe geç

SQL Yabancı Anahtar: Veritabanı İlişkilerinizi Kontrol Altında Tutun

Yabancı anahtarların tabloları nasıl birbirine bağladığını, geçersiz verilerin sızmasını nasıl engellediğini ve veritabanınızı nasıl tutarlı tuttuğunu keşfedin.
· 13 dk. oku

Yapay Zeka ile Keşfedin

İlişkisel veritabanlarında veriler genellikle daha büyük bir sistemin belirli bir yönünü depolayan birden çok tabloya dağıtılır. Bu ayrım iyi bir tasarım tercihidir; ancak veriler hızla yorumlanması zor hale gelebildiği için bir zorluğu da beraberinde getirir.

Bu zorluğu aşmak için ilişkisel veritabanları, tablolar arasındaki ilişkileri uygulayan kurallara dayanır. Bu yapıyı ve güvenilirliği korumak için en önemli mekanizmalardan biri, ilişkili verilerin uyumlu kalmasını sağlayan yabancı anahtarların kullanılmasıdır.

Bu eğitimde yabancı anahtarların nasıl çalıştığını açıklayacağım. Veri tabanı mühendisi olarak yeni başlıyorsanız, veritabanı şemanızı tanımlarken ilişkileri nasıl oluşturacağınızı öğrenmek için SQL ile İlişkisel Veritabanlarına Giriş ve Veritabanı Tasarımı kurslarımızı almanızı öneririm.

Birincil Anahtar vs. Yabancı Anahtar

Ayrı bir yazımızın konusu olan birincil anahtar ve yabancı anahtar, ilişkisel bir veritabanının yapısını ve bütünlüğünü korumaya yardımcı olur. Her ikisini de açıklayayım:

Yabancı anahtar nedir?

Yabancı anahtar, bir tabloda yer alan ve başka bir tablodaki birincil anahtara referans veren bir alan ya da alanlar kümesidir. Bu yabancı anahtar, referans veren tablodaki verilerin referans alınan tablodaki geçerli girdilerle eşleşmesini sağlamak için tablolar arasında bir bağlantı kurar.

Diyelim ki bir veritabanında bir users tablonuz ve bir orders tablonuz var. orders tablosunda, users tablosundaki mevcut bir user_id ile eşleşmesi gereken bir user_id sütunu bulunabilir. Yabancı anahtar kısıtı, var olmayan bir kullanıcıya bağlı bir sipariş oluşturmanızı engeller.

Yabancı anahtarları anlamak, aynı zamanda birincil anahtarları anlamayı da gerektirir; çünkü yabancı anahtarlar bu ilişkileri kurmak ve sürdürmek için birincil anahtarlara dayanır.

Birincil anahtar nedir?

Birincil anahtar, bir tablodaki her kaydı benzersiz şekilde tanımlayan bir sütun veya sütun kombinasyonudur. İki satır aynı birincil anahtar değerini paylaşamaz ve bu değer asla NULL olamaz. Dolayısıyla bir tablonun, diğer tablolardaki tüm yabancı anahtarların referans aldığı benzersiz tanımlayıcı olan bir birincil anahtarı olmalıdır.

Örneğin, aşağıdaki sorgu users tablosunu, user_id sütunu birincil anahtar olacak şekilde oluşturur:

-- Create users table with user_id as primary key
CREATE TABLE users (
    user_id INT PRIMARY KEY, 
    username VARCHAR(100),
    email VARCHAR(255)
);

Birincil ve yabancı anahtarlar arasındaki temel farklar

Birincil ve yabancı anahtarlar arasındaki farkları aşağıdaki tabloda özetledim:

Boyut

Birincil Anahtar

Yabancı Anahtar

Amaç

Bir tablodaki her kaydı benzersiz şekilde tanımlar

Başka bir tablodaki birincil anahtara referans vererek ilişki kurar

Benzersizlik

Benzersiz olmalıdır

Yinelenen değerler içerebilir

NULL Değerler

NULL olamaz

NULL olabilir (kısıtlanmadıkça)

Konum

Aynı tabloda tanımlanır

Başka bir tablonun birincil anahtarına referans verir

Yukarıdaki açıklamadan, yapılandırılmış ve güvenilir veritabanları oluşturmak için birincil ve yabancı anahtarların önemli olduğunu görüyoruz. Veri tutarlılığını sağlamak, ilişkileri korumak ve veritabanının bütünlüğünü sürdürmek için birlikte çalışırlar.

SQL'de Yabancı Anahtarlar Oluşturma ve Yönetme

Artık yabancı anahtarların ne olduğunu ve veritabanlarında neden önemli olduklarını anladığınıza göre, veritabanınızı tasarlarken bunları nasıl tanımlayacağınızı, yöneteceğinizi ve davranışlarını nasıl kontrol edeceğinizi öğrenelim.

SQL ile yabancı anahtar tanımlama

SQL'de bir yabancı anahtarı iki şekilde kurabilirsiniz; tabloyu oluştururken ya da tablo zaten mevcutsa sonradan ekleyebilirsiniz.

Aşağıdaki örnek, SQL Server'da bir tablo oluştururken yabancı anahtarın nasıl tanımlanacağına dair ilk seçeneği gösterir.

-- Create parent table: users
CREATE TABLE users (
    user_id INT IDENTITY(1,1) PRIMARY KEY,
    username NVARCHAR(100),
    email NVARCHAR(255)
);

-- Create child table: orders
CREATE TABLE orders (
    order_id INT IDENTITY(1,1) PRIMARY KEY,
    user_id INT,
    order_date DATE,
    CONSTRAINT fk_orders_users FOREIGN KEY (user_id)
        REFERENCES users(user_id)
);

Sözdizimi PostgreSQL için de aynıdır, ancak birincil anahtar için otomatik artışlarda SERIAL kullanırız.

-- Create parent table: users
CREATE TABLE users (
    user_id SERIAL PRIMARY KEY,   -- SERIAL auto-increments
    username VARCHAR(100),
    email VARCHAR(255)
);

-- Create child table: orders
CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,
    user_id INT,
    order_date DATE,
    CONSTRAINT fk_orders_users FOREIGN KEY (user_id)
        REFERENCES users(user_id)
);

MySQL'de bir yabancı anahtar kurarken, aşağıda gösterildiği gibi InnoDB kullanmalısınız.

-- Create parent table: users
CREATE TABLE users (
    user_id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(100),
    email VARCHAR(255)
) ENGINE=InnoDB;   -- Must use InnoDB for FK support

-- Create child table: orders
CREATE TABLE orders (
    order_id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT,
    order_date DATE,
    CONSTRAINT fk_orders_users FOREIGN KEY (user_id)
        REFERENCES users(user_id)
) ENGINE=InnoDB;

Oracle veritabanı kullanıyorsanız, yabancı anahtarı tanımlayabilirsiniz; ancak her iki tabloda da veri tiplerinin birebir aynı olduğundan emin olun.

-- Create parent table: users
CREATE TABLE users (
    user_id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    username VARCHAR2(100),
    email VARCHAR2(255)
);

-- Create child table: orders
CREATE TABLE orders (
    order_id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    user_id NUMBER,
    order_date DATE,
    CONSTRAINT fk_orders_users FOREIGN KEY (user_id)
        REFERENCES users(user_id)
);

Mevcut bir tabloya yabancı anahtar eklemek için aşağıdaki sorguyu kullanın:

-- Assuming orders table already exists
ALTER TABLE orders
ADD CONSTRAINT fk_orders_users
FOREIGN KEY (user_id)
REFERENCES users(user_id);

Veritabanı oluştururken SQL lehçelerindeki farklar hakkında daha fazla bilgi edinmek için SQL Server'a Giriş ve PostgreSQL Veritabanları Oluşturma kurslarımızı almanızı öneririm.

Kısıtları ve adlandırma kurallarını yönetme

Yabancı anahtarlar, veritabanı yönetim sistemi (DBMS) tarafından ekleme, güncelleme ve silme gibi işlemler sırasında verileri doğrulamak için uygulanan bir kural türü olan kısıtlardır. Bir yabancı anahtar kısıtı etkin olduğunda, veritabanı, yabancı anahtar sütununa girilen herhangi bir değerin referans verilen birincil anahtar sütununda zaten var olmasını sağlar.

Yaygın bir uygulama, kısıtları fk_<child>_<parent> desenine göre adlandırmaktır. Örneklerimizde yabancı anahtar fk_orders_users olur. Yabancı anahtarlarınızı bu şekilde adlandırırsanız şemalar okunabilir hale gelir, kısıt ihlallerini hata ayıklamayı kolaylaştırır ve geçiş araçlarıyla iyi çalışır. Kısıt doğrulaması, aşağıdaki işlemleri gerçekleştirdiğinizde devreye girer:

  • INSERT: Referans alınan üst değer yoksa satırı reddeder

  • UPDATE: İlişkileri bozacak değişiklikleri engeller.

  • DELETE: Bağımlı alt satırlar varken silme işlemlerini engeller.

Başvuru bütünlüğü ve zincirleme işlemler

Başvuru bütünlüğü, yabancı anahtar kısıtının uyguladığı temel ilkedir. Yabancı anahtarlar, alt tablodaki satırların üst tablodaki var olmayan satırlara işaret ettiği durumda ortaya çıkan yetim kayıtları önleyerek bunu uygular.

SQL ayrıca zincirleme işlemler (cascading) tanımlamanıza da olanak tanır. Bunlar, DBMS'ye referans alınan kayıtta yapılan değişiklikleri tam olarak nasıl ele alacağını söyleyen otomatik yönergelerdir. Örneğin bu zincirleme işlemleri şu gibi şeyler için kullanabilirsiniz:

Eylem

Davranış

ON DELETE CASCADE

Üst satır silindiğinde alt satırları sil

ON UPDATE CASCADE

Üst anahtar değiştiğinde alt anahtarı güncelle

SET NULL

Alt yabancı anahtar NULL olur

SET DEFAULT

Alt kayıt varsayılan değeri alır

NO ACTION / RESTRICT

İlişkileri bozan değişiklikleri engelle

Örneğin, aşağıdaki sorgu, siparişini kaldırdıklarında bir kullanıcı kaydını silmek ve user_id değerleri değişirse otomatik olarak güncellemek için zincirleme işlemler ekler.

-- Adds cascading rules to enforce hierarchical cleanup
ALTER TABLE orders
ADD CONSTRAINT fk_orders_users
FOREIGN KEY (user_id)
REFERENCES users(user_id)
ON DELETE CASCADE     -- deleting a user deletes their orders
ON UPDATE CASCADE;    -- if user_id changes, update automatically

Tablolar Arası İlişkileri Tasarlama

Yabancı anahtarlar, bir veritabanındaki tablolar arasındaki ilişkileri tanımlayan veri modellemede kullanılan yapı taşlarıdır. Bu bölümde, yabancı anahtarların tabloları birbirine bağlarken veri tutarlılığını nasıl sağladığına ilişkin farklı yöntemlere bakacağız.

Bire-çok ve çoka-çok ilişkiler

Bire-çok (1:N) ilişkide, üst tablodaki bir satır alt tablodaki birçok kayıtla ilişkilendirilebilir. Bu ilişki, üst tablonun birincil anahtarının, örneğin users.user_id, alt tabloda orders.customer_id gibi bir yabancı anahtar olarak konumlandırılmasıyla uygulanır.

Örneğin, bir kullanıcının birden çok siparişi olabilir ya da bir departmanda birden çok çalışan bulunabilir.

Bire-çok ilişki örneği.

Bire-çok ilişki örneği. Görsel: Yazar.

Öte yandan, çoka-çok (M:N) ilişki, bir tablodaki birden çok kaydın başka bir tablodaki birden çok kayıtla ilişkili olabildiği durumlarda ortaya çıkar. Normalleştirilmiş bir veritabanında çoka-çok ilişkiyi doğrudan uygulayamayacağınız için iki yabancı anahtar içeren bir bağlantı (köprü) tablosu kullanırız.

Çoka-çok ilişki örneği.

Çoka-çok ilişki örneği. Görsel: Yazar.

Bileşik ve kendine referans veren yabancı anahtarlar

Bileşik anahtar, bir kaydı benzersiz şekilde tanımlayan ve birlikte referans verilmesi gereken iki veya daha fazla sütundan oluşur. Bu desen, doğal anahtar birden fazla alana yayıldığında ya da yinelenen ilişkileri önlemek istediğinizde kullanılır. Örneğin, (course_id, semester) ile tanımlanan bir ders açılışınız olabilir veya student_id ile course_id'nin bileşik birincil anahtar olduğu bir bağlantı tablonuz olabilir.

-- Defines courses table
CREATE TABLE course_offerings (
    course_id INT,
    semester VARCHAR(10),
    
    -- Composite primary key ensures a course can only be offered once per semester
    PRIMARY KEY (course_id, semester) 
);

-- Create enrollment table
CREATE TABLE enrollment (
    student_id INT,
    course_id INT,
    semester VARCHAR(10),

    -- This foreign key links enrollment records to a valid course offering
    FOREIGN KEY (course_id, semester)
        REFERENCES course_offerings(course_id, semester)
);

Kendine referans veren yabancı anahtar veya özyinelemeli yabancı anahtar, aynı tablodaki birincil anahtara referans veren bir yabancı anahtardır. Bu desen, Çalışan → Yönetici gibi hiyerarşik verilerde yaygındır. Ek tablolar oluşturmadan özyinelemeli ilişkileri temsil etmenin bir yolunu sağlar.

Aşağıdaki sorguda, manager_id aynı tablodaki employee_id'ye referans verir.

CREATE TABLE employees (
    employee_id INT PRIMARY KEY,
    name VARCHAR(100),

    -- manager_id references employee_id in the same table
    manager_id INT,
    FOREIGN KEY (manager_id) REFERENCES employees(employee_id)
);

Verilerle Çalışma ve Bütünlüğü Sağlama

Artık yabancı anahtarların veritabanlarında veri bütünlüğünü sağlamak için kullanıldığını biliyoruz. Bu bölümde, SQL işlemleri için yabancı anahtarlarla çalışırken pratik hususlara, yaygın zorluklara ve kısıtların nasıl yönetileceğine bakacağız.

INSERT, UPDATE ve DELETE işlemleri

Bu işlemlerin yabancı anahtarlarla nasıl etkileşime girdiğine bakalım.

Yabancı anahtarlarla ekleme (insert) işlemleri

Bir alt kaydı eklemek için, referans alınan üst değer mevcut olmalıdır. Değilse ekleme başarısız olur. Örneğin, aşağıdaki sorgu, users tablosunda user_id değeri 1 olan bir kayıt varsa orders tablosuna kaydı ekleyecektir.

-- users table contains user_id = 1
INSERT INTO orders (order_id, user_id, order_date)
VALUES (100, 1, '2024-02-01');

Üst tabloda var olmayan bir kullanıcı için kayıt eklemeye çalışırsanız, yabancı anahtar kısıtı ihlalini gösteren bir hata alırsınız.

-- user_id = 999 does NOT exist in users table
INSERT INTO orders (order_id, user_id, order_date)
VALUES (101, 999, '2024-02-01');
ERROR: insert or update on table "orders" violates foreign key constraint "fk_orders_users"

Güncelleme işlemleri ve zincirleme davranış

Güncellemeler, yabancı anahtarı veya birincil anahtar tablosunu etkileyebilir. Örneğin, orders tablosundaki yabancı anahtarı güncellerseniz, bu işlem yalnızca üst tabloda birincil anahtar mevcutsa başarılı olur. Örneğin, aşağıdaki güncelleme yalnızca users.user_id = 5 exists ise başarılı olacaktır.

-- updating foreign key value
UPDATE orders
SET user_id = 5
WHERE order_id = 100;

Yukarıdaki örnekte gördüğünüz gibi, alt satırlar hâlâ 1 değerine referans verdiği için ON UPDATE CASCADE olmadan birincil anahtarı güncelleyemezsiniz. Bunu önlemek için önce mevcut yabancı anahtar kısıtını kaldırır, ardından ON UPDATE CASCADE etkin olacak şekilde yeniden oluştururuz. Bu yöntemle ilişkili orders.user_id değerleri otomatik olarak güncellenir.

-- Drop existing foreign key constraint
ALTER TABLE orders
DROP CONSTRAINT fk_orders_users;

-- Recreate FK with ON UPDATE CASCADE enabled
ALTER TABLE orders
ADD CONSTRAINT fk_orders_users
FOREIGN KEY (user_id)
    REFERENCES users(user_id)
    ON UPDATE CASCADE;   -- Automatically update child rows when parent key changes
UPDATE users
SET user_id = 500
WHERE user_id = 1;

Silme işlemleri ve zincirlemeler

Herhangi bir zincirleme kuralı yokken bir üst satırı kaldırmaya çalışırsanız, silme başarısız olur ve bir hata alırsınız. ON DELETE CASCADE eklediğinizde, veritabanına, üst kayıt silindiğinde ilgili alt satırları otomatik olarak kaldırmasını söyleyerek her şeyi tutarlı tutarsınız.

Aşağıdaki örnekte, orders.user_id üzerinde, users.user_id'ye referans veren bir yabancı anahtar oluşturuyoruz. ON DELETE CASCADE ile, users tablosundan bir kullanıcı silinirse, ilgili tüm siparişler otomatik olarak silinir.

-- Add a new foreign key constraint to the orders table
ALTER TABLE orders
ADD CONSTRAINT fk_orders_users
FOREIGN KEY (user_id)
    REFERENCES users(user_id)
    ON DELETE CASCADE;             -- Delete orders automatically when user is deleted

Bazen silmelerin veritabanı tarafından otomatik olarak ele alınmasını isteyebilirsiniz. Bunu tabloyu oluştururken ON DELETE SET NULL ile uygulayabilirsiniz. Bu, üst kayıt değişir veya silinirse alt tablodaki yabancı anahtar sütunlarının NULL yapılmasını sağlar.

CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    user_id INT,               -- FK referencing users.user_id
    order_date DATE,
    FOREIGN KEY (user_id)
        REFERENCES users(user_id)
        ON DELETE SET NULL     -- If a user is deleted, set user_id in orders to NULL
);

Yaygın zorlukların ele alınması

Karmaşık veritabanları tasarlarken, yabancı anahtarlarla ilgili zorluklarla karşılaşmanız muhtemeldir. Aşağıda yabancı anahtarlarla yaşadığım yaygın sorunlar ve her biri için pratik çözümler yer alıyor.

  • Uyumsuz veri tipleri: Yabancı anahtar ve referans verilen birincil anahtar sütunlarınızın veri tipleri uyumsuzsa kısıt oluşturulamaz. Bunu önlemek için, ilişkili tablolar genelinde tipleri her zaman standartlaştırın.

  • Döngüsel bağımlılıklar: İki tablonun birbirini referans vermesi sonucu ekleme çıkmazlarına yol açabilir. Bu sorunu çözmek için şema tasarımını yeniden değerlendirmeli ya da önce tabloları yabancı anahtarlar olmadan oluşturup temel verileri yüklemeli, ardından kısıtları eklemek için ALTER TABLE kullanmalısınız.

  • Sarkan yabancı anahtarlar: Bu sorun, bir alt tablonun yabancı anahtarının var olmayan bir üst tabloya işaret etmesi durumunda ortaya çıkar. Bunu düzeltmek için, silme ve güncelleme işlemleri sırasında verileri doğrulamak üzere zincirleme işlemler kullanın.

Değişiklikleri yönetme ve kısıtları kaldırma

Bazen veritabanı şemanızı yeniden tasarlarken yabancı anahtar kısıtlarını değiştirmek isteyebilirsiniz. Aşağıda, farklı SQL lehçelerindeki küçük sözdizimi farklılıklarıyla yabancı anahtarı kaldırma yolları yer almaktadır.

PostgreSQL, SQL Server ve Oracle veritabanlarında DROP CONSTRAINT ifadesini kullanırız.

-- Drop foreign key
ALTER TABLE orders
DROP CONSTRAINT fk_orders_users;

Ancak MySQL'de yabancı anahtarı kaldırmak için DROP FOREIGN KEY ifadesini kullanırız.

-- Drop foreign key
ALTER TABLE orders
DROP FOREIGN KEY fk_orders_users;

Bir yabancı anahtar kısıtını kaldırmanın, veritabanının başvuru bütünlüğünü uygulamasını da kaldıracağını unutmamalısınız. Kaldırma işleminden sonra ilişkiyi ihlal eden verileri ekleyebilir veya güncelleyebilirsiniz; bu da veride tutarsızlığa yol açabilir.

Performans ve Optimizasyon

Yukarıdaki örneklerden, yabancı anahtarların veri bütünlüğünü koruyarak etkili veri tasarımını nasıl sağladığını gördük. Ancak veritabanlarınızın performansını artırmak için yabancı anahtarları nasıl optimize edeceğinizi de anlamalısınız. İşte yabancı anahtarlarla çalışırken faydalı bulduğum bazı ipuçları:

Indeksleme ve sorgu performansı

Bir yabancı anahtarı indekslediğinizde, veritabanı ekleme, güncelleme veya silme işlemleri sırasında üst tablodaki karşılık gelen anahtarları bularak değişiklikleri hızla doğrulayabilir. Benzer şekilde, indeksler, veritabanı motorunun satırları yabancı anahtar değerlerine göre eşleştirmesine olanak tanıyarak alt ve üst tabloları bağlayan birleştirme (join) işlemlerini hızlandırır.

En iyi uygulama olarak, DBMS bunu otomatik olarak ele almıyorsa yabancı anahtar sütunlarını açıkça indekslemenizi öneririm.

Sorgu optimizasyon teknikleri

Bazı SQL motorları, yabancı anahtarların varlığını, sorgu yürütme planından gereksiz birleştirmeleri belirleyip kaldıran bir teknik olan join elimination için kullanır. Örneğin, bir sorgu yalnızca alt tablodaki sütunlara erişiyor, ancak yabancı anahtar kısıtı tarafından garanti edilen bir filtreleme için üst tabloyla birleştirme içeriyorsa, bu birleştirme işlemi optimize edilerek kaldırılabilir.

Sorgu iyileştiricisinin yabancı anahtarları ve birleştirmeleri nasıl ele aldığını görmek için her zaman yürütme planlarını görüntüleyebilirsiniz. Bu optimizasyonlar ve verimlilikleri, PostgreSQL, MySQL ve SQL Server gibi SQL motorları arasında değişir. Özgül veritabanınızın iyileştirici davranışını anlamak, yabancı anahtar kısıtlarından tam olarak yararlanan performanslı sorgular yazmanıza yardımcı olur.

Örneğin, PostgreSQL'de yürütme planını görüntülemek için aşağıdaki sorguyu kullanabilirsiniz:

-- View execution plan
EXPLAIN ANALYZE
SELECT o.order_id, u.email
FROM orders o
JOIN users u ON o.user_id = u.user_id;

Bu tablo, farklı veritabanlarında yürütme planının nasıl görüntüleneceğini özetler:

Veritabanı

Komut

PostgreSQL

EXPLAIN / EXPLAIN ANALYZE

MySQL

EXPLAIN

SQL Server

Tahmini / Gerçek Yürütme Planı

Oracle

EXPLAIN PLAN FOR

Farklı ilişkili tablolarla nasıl çalışılacağını ve SQL'deki farklı join türlerini öğrenmek için SQL'de Verileri Birleştirme kursumuzu almanızı öneririm.

İleri Düzey Kullanım Senaryoları ve En İyi Uygulamalar

Temel uygulamanın ötesinde, yabancı anahtarları sağlam, ölçeklenebilir ve sürdürülebilir bir veritabanı mimarisi kurmak için kullanabilirsiniz. Bu bölümde, yabancı anahtarları kullanırken göz önünde bulundurulması gereken özel senaryoları ve üst düzey tasarım ilkelerini açıklayacağım.

Veritabanları arası veya şemalar arası ilişkiler

Yabancı anahtarlar tek bir veritabanı veya şema içinde bütünlüğü sağlamak için tasarlanmış olsa da, daha karmaşık kurumsal ortamlarda bu sınırlar arasında ilişkiler gerekebilir. Aşağıdaki tablo, farklı SQL lehçeleri için şemalar arası destek ve veritabanları arası desteği özetler.

Veritabanı

Şemalar Arası Destek

Veritabanları Arası Destek

Sınırlamalar

PostgreSQL

Evet

Hayır

Tek bir veritabanı kümesiyle sınırlıdır.

SQL Server

Evet

Evet

Veritabanları arası bütünlük, yerel yabancı anahtarlar yerine uygulama mantığı veya tetikleyicilerle yönetilir.

Oracle

Evet

Evet

Veritabanı bağlantıları veri erişimi içindir; yerel yabancı anahtar kısıtları genellikle bağlantılar arasında uygulanmaz.

MySQL

Hayır

Hayır

InnoDB gibi aynı veritabanı ve depolama motoru içindeki tablolarla sıkı şekilde sınırlıdır.

SQLite

Hayır

Hayır

Belirli dosya/veritabanı bağlantısıyla sınırlıdır.

Bakım ve denetim

Yabancı anahtarlar oluşturdukça, iş mantığınız her değiştiğinde bunların da değiştiğini fark edeceksiniz. Güncel kalmalarını sağlamak için yabancı anahtarları denetlemek ve bakımını yapmak üzere aşağıdaki yolları göz önünde bulundurun:

  • Kısıtları gözden geçirin: Yabancı anahtar kısıtlarını, gelişen iş kuralları ve şema değişiklikleriyle uyumlu kalmalarını sağlamak için düzenli olarak denetleyin.
  • Düzenli indeks denetimi: Özellikle büyük veri aktarımları veya sistem yükseltmelerinden sonra, tüm yabancı anahtar sütunlarında indekslerin bulunduğunu doğrulayarak birleştirme ve doğrulama performansını en iyi düzeyde tutun.
  • Dokümantasyon ve görselleştirme: İlişkileri belgelemek için Varlık-İlişki (ER) diyagramları veya şema görselleştirme araçları kullanın. Bu görsel araçlar, tüm geliştiricilerin ve analistlerin ilişkileri ve yabancı anahtarlarınızın uyguladığı bütünlük kurallarını anlamasını sağlar.

Sağlam veritabanı tasarımı için en iyi uygulamalar

Yabancı anahtarların sunduklarından en iyi şekilde yararlanmak için aşağıdaki ilkelere uyun:

  • Anahtarlarınızı gerçek iş mantığıyla hizalayın: Birincil ve yabancı anahtarların, yapay veya kararsız tanımlayıcılara güvenmek yerine, gerçekten varlıkları ve aralarındaki ilişkileri temsil ettiğinden emin olun.

  • Açık ve tutarlı adlar kullanın: Şemanızın bakımını, hata ayıklamasını ve ekip çalışmasını kolaylaştırmak için fk_orders_user_id gibi açıklayıcı kısıt adları seçin.

  • Sıkılık ve esnekliği dengeleyin: Kısıtlar veri kalitesini korumalıdır; ancak tasarımınızın, uygulama katmanında ele alınan pratik uç durumlara veya doğrulamalara da izin vermesi gerekir.

  • Döngüsel ilişkilerden kaçının: Yabancı anahtar bağımlılıklarının birbirine geri dönmeyeceği şekilde şemanızı yapılandırın; çünkü bunlar ekleme, güncelleme ve silme işlemlerini gereksiz yere karmaşıklaştırır.

  • Performansı optimize edin: Yabancı anahtarlarınızı doğru şekilde indeksleyin ve bütünlüğü korurken sisteminizi yavaşlatmamak için zincirleme işlemleri dikkatle uygulayın.

Sonuç

Her beceride olduğu gibi, yabancı anahtarları ustalıkla kullanmak pratik gerektirir. Şema modellemeyi denemenizi, zincirleme işlemleri test etmenizi ve kısıtların gerçek dünya senaryolarında nasıl davrandığını anlamanızı öneririm. Zamanla, katı kuralları uygulamalarınızın ihtiyaç duyduğu esneklikle nasıl dengeleyeceğinizi öğrenerek, gereksinimler evrildikçe hem dayanıklı hem de uyarlanabilir veritabanları oluşturursunuz.

Artık veritabanı tasarımında yabancı anahtarları nasıl kullanacağınızı anladığınıza göre, veri mühendisliği ve veri ambarı temellerini öğrenmek için SQL ile Yardımcı Veri Mühendisi kariyer yolumuzu denemenizi öneririm. Son olarak, büyük veri için veritabanı yönetimi becerilerinizi ilerletmek istiyorsanız, boyutsal modelleme hakkında daha fazla bilgi edinmek için Snowflake'de Veri Modellemesine Giriş kursumuzu almanızı tavsiye ederim.

Allan Ouko

Yazar

Allan Ouko

Veri analitiği, iş zekâsı ve veri bilimi alanlarında pratik deneyime sahip Veri Bilimi Teknik Yazarı. SQL, Python, Power BI, Databricks ve veri mühendisliği üzerine, gerçek dünya analitik çalışmalarına dayanan, uygulamaya dönük ve sektöre odaklı içerikler yazıyorum. Yazılarım teknik derinlikle iş etkisi arasındaki köprüyü kurarak profesyonellerin veriyi güvenle karara dönüştürmelerine yardımcı olur.

SSS

Birincil anahtar ile yabancı anahtar arasındaki fark nedir?

Birincil anahtar, kendi tablosundaki kayıtları benzersiz şekilde tanımlar; yabancı anahtar ise bir ilişki kurmak için başka bir tablodaki birincil anahtara referans verir.

Bir tablo birden çok yabancı anahtara sahip olabilir mi?

Evet, bir tabloda, her biri farklı üst tablolara bağlanan birden çok yabancı anahtar olabilir.

Bir tabloda yabancı anahtar sütunları benzersiz olmak zorunda mıdır?

Hayır, yabancı anahtar sütunları yinelenen değerler içerebilir ancak üst tablodaki geçerli satırlara referans vermelidir.

Yabancı anahtarın referans verdiği bir kaydı silerseniz ne olur?

Kısıtlara bağlı olarak, veritabanı silmeyi kısıtlayabilir, ilişkili satırları zincirleme olarak silebilir ya da yabancı anahtar değerlerini NULL yapabilir.

Yabancı anahtarlar ilişkisel veritabanlarında zorunlu mudur?

Zorunlu olmamakla birlikte, yabancı anahtarlar ilişkisel bütünlüğü sağlamak ve güvenilir veritabanı tasarımı için önemlidir.

Konular

İlgili