SAP HANA'da Referential Join ve Cardinality: Veritabanı İlişkilerinin Temelleri
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, 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.
Yorum Yap