14 Ağustos 2024

SCD(Slowly Changing Dimension) Nedir?Nasıl Uygulanır?

 

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 😊