ODI 12C ile Slowly Changing Dimesion (SCD2)

Merhabalar arkadaşlar, bu yazımda ODI de SCD nin nasıl yapılacağından bahsedeceğim. Başlamadan önce SCD nedir kısaca bundan bahsedelim. Adı üzerinden yavaşça değişen dimension tablolar için kullanılan bir tekniktir. Tablodaki dataların değişim süresi çok uzunsa ve değişen dataları historical şekilde tutmak istiyorsak SCD tekniğini kullanırız. Mesela personel tablomuzda personellerimizin çalıştığı birimler sürekli olarak değişemeyeceğinden burada SCD kullanabiliriz ya da müşterilerimizin abonelik durumları sürekli olarak değişemeyeceğinden burada da SCD yapısını kullanabiliriz. Çalışma prensibi örnek üzerinde daha net anlaşılacaktır. Burada bilmemiz gereken SCD nin 0’dan 7’ye kadar toplam 8 tane tipi mevcuttur. Fakat genellikle type2 kullanılır. Bu nedenle bu örnek de type2 olacak.

ID ,department_name kolonlarından oluşan bir kaynak tablo create edelim. Önce içeriye bir kişi insert edelim daha sonra da bu kişinin department_name ini güncelleyelim ve sonuçlarını gözlemleyelim.

Yukarıdaki gibi bir kaynak tablo bir de hedef tablo create ediyoruz. Sonra oluşturulan bu tabloları ODI ye reverse edip geliştirmesini yapacağız. Tabloların ODI ye nasıl reverse edileceğini burada anlatmıştım. Daha sonra target tablomuzu ODI de açarak kolonları üzerinde düzenlemeler yapacağız. Önce aşağıdaki gibi tablonun Olap tipini slowly changing dimesion olarak değiştiriyoruz.

Sonrasında ise aşağıdaki gibi düzenliyoruz;

Buradaki scd behavior adımlarını kısaca açıklayalım;

  • Surrogate Key : Şimdilik sanal ID olarak düşünebiliriz. Yani ID si 1 olan çalışan departmanını değiştirdiği zaman ID si yine 1 olacak bu nedenle bu iki kaydı birbirinden ayırt edebilmek için kullandığımız bir özellik. Genelde buraya sequence atanır.
  • Natural Key : Bu key ise kaynak tablodaki Primary Key alana denk gelmektedir.
  • Add row on Change : Bu özellik ise kolondaki bir değişim olduğu zaman değişimi yakalayıp SCD uygulanmasına yarar. Yani yukarıda department_name için kullandık. Eğer kayıtların department_name i değişirse SCD uygulanacak.
  • Starting Timestamp: Başlangıç tarihi
  • Ending Timestamp : Bitiş tarihi. Genelde ulaşılması imkansız tarihler olarak atanırlar.
  • Current Record Flag : Birden fazla oluşan kayıtlardan hangisinin güncel olduğunu belirlemek amacıyla kullanılır.

Yukarıda kaynaktan gelen 2 kolonu direk targeta mapledim. SID kolonu için de standart bir sequence oluşturdum ve SID kolonuna atadım. Sequence i aşağıdaki gibi oluşturdum.Flag kolonu içinse, current recort flag olarak ayarlamıştık bunu da 1 değerini atadım. Böylece güncel dataların flag i 1 olurken eski datalar 0 olarak kalacak. Start_date için sysdate, end_date için de to_date (‘01.01.2400′,’DD.MM.YYYY’) olacak şekilde düzenledim. Burada yine dikkat etmemiz gereken oluşturduğumuz sequence i SID kolonuna atamamız için mapping işleminden önce oluşturmamız gerekiyor. Bu ODI nin bir bug ı , yani mapping yaparken kullanacağımız objeleri mapping işlemine başlamadan önce oluşturmamız gerekiyor. Eğer mapping işleminden sonra bir obje oluşturursak bunu mapping içerisinde göremeyiz.

Önce sol taraftan new sequence adımı ile ilerliyoruz ve bu iş için standart bir sequence işimizi göreceği için sadece isim verip kaydediyoruz.

Kolonlarımızı ayarladıktan sonra hedef tablonun target bölümünü aşağıdaki gibi düzenliyoruz;

Şimdi ise physical sekmesinde KM mizi seçeceğiz ve konfigüre edeceğiz. KM mizi aşağıdaki gibi seçiyoruz ve Option adımında sadece flow_control ü false etsek yeterli olacak.

Şimdi kaynak tabloya bir kayıt atalım ve mappingimizi bir kez çalıştıralım ki kaynaktaki data hedef tabloya atılsın.

Şimdi de kaynaktaki datamızın add row on change olarak belirlediğimiz kolonunu güncelleyelim ve mappingi tekrar çalıştıralım;

Sonuç olarak target tablomuza select attığımızda aşağıdaki gibi bir sonuç dönmüş olur ;

Görüldüğü gibi update işlemi geldiği zaman historical şekilde data tutuluyor.

Bu yazımda anlatacaklarım bu kadardı, sonraki yazılarımda görüşmek üzere. Hoşça kalın 🙂

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir