SCD(Slowly
Changing Dimension) Nedir?Nasıl Uygulanır?
Bu tablo tipi hemen hemen tüm DWH yapılarında yer alır çünkü
bizim DWH yapma sebeplerimizden biri de geçmişi saklamaktır.Daha doğrusu
geçmişi geçmişin verileri ile yorumlamaktır.
SCD’ye neden ihtiyaç peki?Diyelim ki sizin bir ürün tablonuz
var ve ürünlerinizin birim fiyatları zaman zaman değişebiliyor ve diyelim ki
siz tutarı bulmak için satışlar tablosundaki ürün adedi ile birim fiyatını
çarparak toplam tutarı bulmak istiyorsunuz.Bu durumda ürün tablosu her zaman
son değeri tuttuğundan sanki 5 yıl öncede aynı fiyata satmışsınız gibi
görürsünüz.Halbuki her yıl-ay farklı fiyatlandırma söz konusudur.İşte SCD ile
bu karışıklığı çözebiliyoruz.
Sadece buda değil elbette iyice oturması için örnekleri arttırabiliriz
diyelim ki sizin çalışanlarınız departman değiştiriyor bu durumda bunu tutmak
isteyebilirsiniz veya servis güzergahları bir kişi değiştiriyor ise eskisini
tutmak isteyebilirsiniz vb.
Burada dikkat ederseniz hep koca bir tablodaki tek bir
sütundan bahsediyorum çünkü bizim için kritik bilgi o sütun-lar.Ürün tablosunda
bizim için birim fiyat kritikti ama çalışan tablosundan departman oldu.Elbette
tek sütun değil sizin için birden çok sütun kritik olabilir bu önemli değildir
sadece kritik sütunları belirlemek burada önemlidir.Kritik sütundan kastım
elbette geçmişini saklamak istediğiniz sütunlardır.
Farkındaysanız bu örnek verdiğimiz 3 tabloda aslında bir
dimension tablo yani ölçüm değil ölçümün içeriği hakkında veri tutan tablolar.Fakat
zamanla yavaş yavaş içerisindeki veri değişiyor.Aslında Slowly Changing dediğimiz
kavramın bir karşılığı oluyor ve aynı zaman bir dimension tablo.Peki her
dimension tablo değişiyor aslında neyin SCD olacağına nasıl karar veriyoruz diye
sorarsak cevap geçmişi sizin için değerli olan tablolar olacaktır.
Peki bu geçmişi nasıl tutacağız ve sonrasında buna nasıl erişeceğiz?
Öncelikle SCD’nin bir çok tipi var şuanlık 6 😊
Ama bizim için en önemlisi her zaman Type 2 olacaktır bunu
unutmayın.Type 2 hemen hemen her zaman işinizi görecektir.Açıkçası diğerlerini
hiç yapma ihtiyacı hissetmedim ben ama sizin öyle bir caseniz olurki type 6
mantıklı olur o zaman o şekilde yapabilirsiniz.
Type 2 da dimension tablolarınıza 3 sütun eklersiniz.
·
Start Date
·
End Date
·
Is Current
Start Date:Bir önceki kaydın bitiş tarihi +1(etl çalıştığı
gün)
End Date :Sonraki kaydın başlangıç tarihi-1(Etl çalıştığı
gün-1)
Is Current:Her zaman son kayıtta 1 önceki kayıtlarda 0
Burada önemli nokta şudur her ürünün bir önceki veya sonraki
kaydı olmak zorunda değil özellikle ilk yaptığınız anda hepsinin aslında tek
bir kaydı vardır tabloda.Bu durumda Start Date 1900-01-01,End Date 2999-12-31
şeklinde girilir genelde!
Ve her zaman son eklenen kaydın bitiş tarihi 2999-12-31
olarak girilir çünkü zaten yeni bir kayıt geldiğinde buradaki değeri ezecek ve
hangi gün geldiyse o günün değeri basılacaktır endişe etmeyin.
Hemen örnek bir tablo yaratalım diyelim Ürün tablosu olsun.
SK |
ProductId |
ProductName |
ListPrice |
StartDate |
EndDate |
IsCurrent |
1 |
1 |
A Ürünü |
10 |
1.01.1900 |
31.12.2999 |
1 |
2 |
2 |
B Ürünü |
10 |
1.01.1900 |
14.08.2024 |
0 |
3 |
2 |
B Ürünü |
20 |
15.08.2024 |
31.12.2999 |
1 |
4 |
3 |
C Ürünü |
30 |
1.01.1900 |
31.12.2999 |
1 |
5 |
4 |
D Ürünü |
50 |
1.01.1900 |
31.12.2999 |
1 |
6 |
5 |
E Ürünü |
60 |
1.01.1900 |
31.12.2999 |
1 |
7 |
6 |
F Ürünü |
70 |
1.01.1900 |
14.08.2024 |
0 |
8 |
6 |
F Ürünü |
60 |
15.08.2024 |
20.08.2024 |
0 |
9 |
6 |
F Ürünü |
80 |
21.08.2024 |
31.12.2999 |
1 |
10 |
7 |
G Ürünü |
20 |
1.01.1900 |
31.12.2999 |
1 |
Bu tabloyu inceleyelim şimdi bakın A Ürünü tek bir kayıt var
fiyatı hiç değişmemiş bu yüzden başlangıç bitiş tarihleri maximum değerde ve iscurrent
1.
Fakat B Ürününe baktığımızda 14.08.2024 tarihinde bir
değişiklik olmuş fiyat 10 ken 20 olmuş.İşte biz bu tarihten önceki satışlar
için 10 lira ile sonrası için 20 lira ile çarpacağız tutarı bulmak için.
Veya F Ürünü 3 kez değişmiş bu n kez değişebilir hiç önemli
değildir.
Tüm ETL araçlarında SCD type 2 için hazır yöntemler vardır
fakat yok veya kendiniz yazmak istersenizde row by row bir loop ile değil bulk
olarak bunu yapmaya dikkat edin.
PL/SQL,T-SQL ile de yapabilirsiniz bu süreci bilginiz olsun.
Peki dikkatinizi çeken bu SK sütunu nedir?
SK(Surrogate Key)’in kısaltmasıdır.Dikkat ederseniz ProductId
çokluyor çünkü biz ProductID bazında geçmişi saklıyoruz.Bu durumda bize unique
bir key lazım işte bu SK oluyor.Özellikle DWH ortamlarında çok sık kullanılan
bir kavramdır.SCD tablolarında olmazsa olmazdır!!!
SK üretmek için auto increment sütun tanımlayabilirsiniz
veya sequence’den değer getirtebilirsiniz.
Unutmadan söylemiş olalım SCD tabloları asla ama asla
truncate edilemez!!
SCD tablomuzu type 2 formatta tutmaya başladık diyelim bitti
mi?
SCD anlamında evet ama fact anlamında hayır.
Raporlama katmanında her tarihi o zamanki değer ile eşleştirmek
için iki yönteminiz vardır.
Ya fact tablonuzda ProductID ve raporlama tarihi vardır
bunları aşağıdaki joine benzer bir şekilde joinlersiniz BI Toolıunuzda.
Select * from Fact
inner join scd on fact.product_id=scd.product_id and fact.report_Date
between scd.start_date and scd.end_date
Ya da direkt fact üzerine SCD’nin SK değerini basarsınız.SK
unique olduğu için bir daha joinlerde bu kadar uğraşmazsanız hatta Power BI’da
mecbursunuz mesela çünkü ikili joinlere izin vermiyor.
Peki fact üzerine SK değerini nasıl basacaksınız?
Aslında yukardaki joinin bir benzeri fact’inizi dolduran ETL
mappinginizde yapacaksınız ve o join sonucu dönen SK değerini fact’e basacaksınız.
Baştan uca bir SCD işlemi böyle oluyor fakat bazen Snapshot
fact tablo gibi düşünülebiliyor.Buradan raporlama yapamazsınız bunu
unutmayın.Örneğin x tarihinde kaç çalışanım vardı veya ürünüm vardı bunlar SCD’nin
görevi değil.Bunlar için verilerin x tarihindeki durumlarını bulamıyorsanız
snapshot fact tutmalısınız bu da değişen değil tüm datayı tuttuğundan çok
tercih edilmez zorunda değilseniz.
Geçmişe dönük SCD doldurmak işkence gibidir iş birimini ikna
edebiliyorsanız bugünden başlatın.Zaten elinizde log yoksa hiçbir şey
yapamazsınız ama varsa da çok zorlayabilir.
Umarım faydalı olmuştur,bir sonraki yazımda görüşmek üzere 😊