SAP HANA, gelişmiş veri işleme yetenekleri sunan bir bellek tabanlı veritabanıdır. Veritabanı tasarımında temel taşlardan biri olan referential join ve cardinality kavramları, ilişkisel veritabanlarında veri entegrasyonunu ve tutarlılığını sağlamak için kritiktir. Bu yazıda, SAP HANA'da referential join ve cardinality kavramlarını detaylı bir şekilde açıklayacağız ve örneklerle nasıl kullanıldığını göstereceğiz.

Referential Join Nedir?

Referential join, iki tablo arasındaki ilişkiyi kullanarak sorgu performansını artıran bir join operasyonudur. Bu tür join işlemleri, genellikle referans bütünlüğüne dayanır ve bir tablodaki yabancı anahtarın, başka bir tablodaki ilgili birincil anahtar ile eşleştirilmesini içerir. Bu sayede veritabanı sorguları daha etkili hale gelir.

Örnek: Bir müşteri ve siparişler veritabanını ele alalım:

CREATE TABLE Musteriler (

    MusteriID INT PRIMARY KEY,

    Adi VARCHAR(50),

    -- Diğer sütunlar

);

CREATE TABLE Siparisler (

    SiparisID INT PRIMARY KEY,

    MusteriID INT,

    Urun VARCHAR(100),

    -- Diğer sütunlar

    FOREIGN KEY (MusteriID) REFERENCES Musteriler(MusteriID)

);

Bu örnekte, Siparisler tablosundaki MusteriID alanı, Musteriler tablosundaki MusteriID alanına referans verir. Referential join kullanarak, her müşteriye ait siparişleri kolayca çekebiliriz.

Referential Join Kullanımı:

SELECT *

FROM Musteriler

JOIN Siparisler ON Musteriler.MusteriID = Siparisler.MusteriID;

Bu sorgu, müşteri ve siparişler tablolarını müşteri ID'si üzerinden birleştirir.

Inner Join Nedir?

Inner join, iki tablo arasındaki ortak alanlar üzerinden eşleşen kayıtları getiren bir join türüdür. Bu join türü, sadece eşleşen kayıtları içerir ve eşleşmeyenleri dışarıda bırakır. Inner join, bir referential join olabilir, ancak her inner join referential join olmak zorunda değildir.

Referential Join ile Inner Join Arasındaki Farklar

Amacı:

Referential Join: Referential join, tablolar arasında referans bütünlüğünü sağlamak için kullanılır.

Inner Join: Inner join, iki tablo arasındaki eşleşen kayıtları getirmek için kullanılır.

Sonuç Kümesi:

Referential Join: Referential join, referans bütünlüğünü sağladığı için eşleşen kayıtları getirir.

Inner Join: İki tablo arasındaki eşleşen kayıtları getirir.

Kullanım Alanları:

Referential Join: Referential join genellikle referans bütünlüğünü koruma amacıyla kullanılır.

Inner Join: Inner join, genel veri çekme işlemlerinde kullanılır.

Zorunluluk:

Referential Join: Referential join kullanmak istiyorsanız, tablolar arasında referans bütünlüğü olması gerekir.

Inner Join: Herhangi bir referans bütünlüğü şartı olmadan kullanılabilir.

Referential join ve inner join, veritabanı tasarımında farklı amaçlara hizmet eden iki önemli araçtır. Hangi join türünün kullanılacağı, tasarım gereksinimlerine ve ilişkisel yapının özelliklerine bağlı olarak değişebilir. Bu nedenle, join türleri seçilirken dikkatlice düşünülmelidir.

Tablolarımızı oluşturalım ve içlerine birkaç örnek veri ekleyelim. Ardından referential join ve inner join kullanarak bu tabloları birleştirelim.

Customers tablosu

CREATE TABLE Customers (

    CustomerID INT PRIMARY KEY,

    CustomerName VARCHAR(50)

);

INSERT INTO Customers (CustomerID, CustomerName) VALUES

(1, 'Customer A'),

(2, 'Customer B'),

(3, 'Customer C');

-Orders tablosu

CREATE TABLE Orders (

    OrderID INT PRIMARY KEY,

    CustomerID INT,

    OrderDate DATE

);

INSERT INTO Orders (OrderID, CustomerID, OrderDate) VALUES

(101, 1, '2022-01-01'),

(102, 1, '2022-02-01'),

(103, 2, '2022-03-01');

-- Ekstra bir müşteri ekleyelim ki referential join ile bu müşteri gözüksün

INSERT INTO Orders (OrderID, CustomerID, OrderDate) VALUES

(104, 4, '2022-04-01');

Referential Join

SELECT Orders.OrderID, Customers.CustomerName

FROM Orders

JOIN Customers ON Orders.CustomerID = Customers.CustomerID;

Bu sorgu, Orders tablosundaki CustomerID ile Customers tablosundaki CustomerID'yi referans alarak birleştirme yapar.

Inner Join

SELECT Orders.OrderID, Customers.CustomerName

FROM Orders

INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID;

Bu sorgu da referential join ile aynı sonucu verecektir çünkü referential join, bir tür inner join'dir.

Şimdi ekstra bir adım atalım ve Customers tablosundaki CustomerID alanını birincil anahtar ve dış anahtar (foreign key) olarak tanımlayarak referans bütünlüğünü sağlayalım:

Customers tablosunu güncelle

ALTER TABLE Customers

ADD CONSTRAINT fk_customer_orders

FOREIGN KEY (CustomerID) REFERENCES Orders(CustomerID);

Bu adımdan sonra, eklediğimiz müşteri (CustomerID=4) referential join ile gözükecektir ancak inner join ile gözükmeyecektir çünkü referential integrity (referans bütünlüğü) sağlandığından Orders tablosundaki bir müşteriye karşılık gelen bir müşteri Customers tablosunda bulunmalıdır.

-- Referential Join (değişen sonuç)

SELECT Orders.OrderID, Customers.CustomerName

FROM Orders

JOIN Customers ON Orders.CustomerID = Customers.CustomerID;

Sonuç:

OrderID

CustomerName

101

Customer A

102

Customer A

103

Customer B

104

Null

 

-- Inner Join (değişen sonuç)

SELECT Orders.OrderID, Customers.CustomerName

FROM Orders

INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID;

Sonuç:

OrderID

CustomerName

101

Customer A

102

Customer A

103

Customer B

 

Referential join'de eklenen müşteri (CustomerID=4) sonuç setinde NULL olarak gözüküyor çünkü bu müşteri Customers tablosunda yok. Inner join'da ise bu müşteri hiç görünmüyor çünkü inner join, referans bütünlüğünü kontrol etmez ve yalnızca eşleşen kayıtları getirir. Bu örnek, referential join ile inner join arasındaki farkı daha net göstermektedir.

 Cardinality Nedir?

Cardinality, ilişkisel veritabanlarda tablolar arasındaki ilişkinin sayısal boyutunu ifade eder. Yani bir tablodaki kayıtların, diğer tablodaki kayıtlarla olan ilişkisinin sayısını belirtir. Cardinality, bire-bir, bire-çok, çok-bir ve çok-çok olmak üzere dört temel türde gelebilir.

Cardinality Türleri:

Bir-Bir (1:1): Her bir kayıt, diğer tablodaki bir kayıta karşılık gelir, ve tam tersi.

Bir-Çok (1:N): Her bir kayıt, diğer tablodaki birden çok kayıta karşılık gelir, ancak diğer tablodaki her kayıt sadece bir kayıta karşılık gelir.

Çok-Bir (N:1): Bir-Çok'un tersidir, bir kayıt birden çok kayıta karşılık gelir.

Çok-Çok (N:N): Bir tablodaki birden çok kayıt, diğer tablodaki birden çok kayıta karşılık gelir.

Örnek:

E-ticaret sitesinde ürünler ve kategoriler arasındaki ilişkiyi ele alalım:

CREATE TABLE Urunler (

    UrunID INT PRIMARY KEY,

    Adi VARCHAR(100),

    -- Diğer sütunlar

);

CREATE TABLE Kategoriler (

    KategoriID INT PRIMARY KEY,

    Adi VARCHAR(50),

    -- Diğer sütunlar

);

CREATE TABLE UrunKategorileri (

    UrunID INT,

    KategoriID INT,

    PRIMARY KEY (UrunID, KategoriID),

    FOREIGN KEY (UrunID) REFERENCES Urunler(UrunID),

    FOREIGN KEY (KategoriID) REFERENCES Kategoriler(KategoriID)

);

Bu örnekte, UrunKategorileri tablosu, ürünlerin ve kategorilerin birçoktan çok ilişkisini temsil eder. Yani bir ürün birden çok kategoriye ait olabilir ve bir kategoriye ait birden çok ürün bulunabilir.

Referential join ve cardinality, SAP HANA gibi gelişmiş veritabanlarında veritabanı tasarımının temel bileşenleridir. Bu kavramları doğru bir şekilde anlamak ve uygulamak, veri entegrasyonunu ve tutarlılığını artırarak veritabanı performansını optimize etmeye yardımcı olur. Bu nedenle, veritabanı tasarımı yaparken referential join ve cardinality konularına dikkat etmek önemlidir.