Informatica Ile Incremental Süreçlerin Yönetimi-2 (SCD Type-2 Current Flag Column)

Merhabalar,

Önceki yazımda Incremental süreç nedir, nasıl bir ihtiyaç sonucu uygulamaya başlarız, SCD Type ların dan ve en son olarak da SCD Type-1 ile ilgili bir örnek yapmıştık.

Bu yazı ile SCD Type -2 yi incelemeye devam edeceğiz.

Öncelikle Type-2 yi ne gibi ihtiyaçlar doğrultusunda kullanmalıyızı konuşalım. Verinin değişim historisi sizler için önemli ise Type-2 sizler için uygun diyebiliriz. Yani veri güncellense de yeni hali ile birlikte eski halini daha doğrusu hallerini tutmak  gibi ihtiyaçlarınıza bu yöntemle birlikte cevap verebilirsiniz.

Type-2 yi farklı yöntemlerle uygulayabilirsiniz. Bunlar:

  • Current Flag Column: Bu yöntemi uygularken tabloda verinin en son güncellenen halinin hangi satır olduğunu anlamak için Flag lemek için yani Flag kolonuna ihtiyacımız bulunmakta. Veri güncelse 1, değilse yani eski veri ise 0 olarak flag leriz. Böylece güncel dataları bulmak istediğimizde where CurrentFlag=1 dememiz yeterli olacaktır. İlgili kayıdın tüm eski versiyonlarında Flag=0 olacaktır.
  • Version Number Column: Bu yöntem, flag lemekle hemen hemen aynı. Tek fark version numarası 1 artarak devam eder. Yani initial load da version number ı 1 olarak insert edip, veri güncellenirse 2, tekrar güncellenirse 3 olarak devam edecektir. Versiyon numarası veri değiştikçe artarak devam edecektir.
  • Date Range Columns(StartDate-EndDate): Bu yöntemde verinin geçerli olduğu tarih aralığı tutulur. Yukarıdaki yöntemlerle aynı amaç doğrultusunda yani verinin full history sini tutmak için bu yöntem uygulanabilir. Tek fark verinin değişimi ile ilgili daha ayrıntılı bilgi tutmuş oluyoruz.

 

SCD Type-2 Current Flag yöntemi ile ilgili bir örnek üzerinden ilerleyelim.

SDBU schemasında bulunan Employee tablosundaki EmployeeId, FirstName, LastName, City, PhoneNumber, Gender, Age verilerine ihtiyacım olduğunu, bunları tasarlamakta olduğum veri ambarına DimEmployee adı ile boyut olarak eklemek istediğimizi düşünelim. Bu sırada çalışanlarımızın city bilgisi değişirse, employee lerin eski city bilgilerini de dw mde tutmak istediğimizi farz edelim. Bu senaryo üzerinde SCD Type-2 Current Flag yöntemi ile city nin değişimini de göz önüne alarak OLTP sistemimizden DW mize aktarıma başlayalım.

Power Center ı açtım, source umu ekliyorum. Ihtiyaç duymadığım kolonları siliyorum.

flag-1.PNG

Target ı oluşturmak için oluşturmuş olduğumuz source u target designer a sürükleyip bırakıyoruz. TRG_Employee olarak isimlendirip, Current_Flag kolonu ekliyoruz.

flag-2.PNG

Target tabloyu db de oluşturmak için Generate and Execute SQL ile tabloyu create ediyoruz.

Mapping e geçebiliriz. Create mapping diyerek başlıyoruz. 

Source umu sürükleyip bırakıyorum mapping ekranına. Bir önceki makalemde target ta ilgili verinin olup olmadığını belirlemek için Lookup kullanmıştık. Source ve target ı bir araya getirmiştik diyebiliriz kısaca. Bu yazımda bu işlemi Join Transformation ile yapalım.

Target ile source u joinleyebilmek için target ı source olarak ekliyorum. Source belirleme işlemimdeki gibi Source Designer ekranından TRG_Employee yi seçiyoruz. Source olarak belirlediğimiz TRG_Employee i de Mapping ekranına sürükleyip bırakıyoruz.

Join Transformation ı mapping e ekliyoruz. Employees ve TRG_Employees in çıkış portlarını Join in giriş portu olarak sürükleyip bırakıyoruz. TRG_Employees ten gelen portları TRG_, source tan gelenleri SRC_ ön eki ile isimlendiriyorum.

flag-4.PNG

Aynı zamanda Join lediğimiz tablolardan hangisinin Detail, hangisinin Master tablo olduğunu belirtmemiz gerekmekte. Otomatik olarak Join Transformation a ilk olarak Employees tablosunun portunu sürüklediğimiz için Detail tablo olarak onu seçiyor. Detail ya da Master tablo olarak seçmenin önemini şöyle açıklayabiliriz: SQL deki Left outer join mantığını düşünelim. Left Join condition un soluna yazdığınız tablonun tüm kayıtları, sağında yazdığınız tablonun eşleşen kayıtları gelir, eşleşmiyorsa null olur. Power Center da da Detail tablo nun tamamı Master tablonun eşleştiği kadarı döner, eşleşmeyen satırları null olur. Örneğimizdeki amacımız “source ta olan EmployeeID ler target ta var mı yok” u bulmak olduğu için Source ve target tabloyu Left Join le birleştirmemiz, Source tabloyu Detail tablo olarak seçmemiz gerekmekte.

flag-7.PNG

Condition tabından da EmployeeID ler üzerinden verinin target tabloda olup olmadığını kontrol etmek istediğimi söylüyorum.

flag-5.PNG

Önemli bir nokta Join Type ımın ne olacağı belirmek olacak. Properties tabına geldiğimizde,  4 tane Join çeşidi karşımıza gelmekte.

Normal Join: SQL deki inner join

Master Outer Join: SQL deki Left Join gibi düşünebilirsiniz.. Detail tablonun tüm kayıtları, master tablonun eşleşen kayıtları gelir, Detail ile eşleşmeyenlere null insert edilir

Detail Outer Join: SQL deki Right Join gibi düşünebilirsiniz, Master  Outer Join in tam tersi yani. Master ve Detail tablonun eşleşen kayıtları ve Master tablonun tüm kayıtları döner.

Full Outer Join: SQL deki full join le aynı. Eşleşen ve eşleşmeyen tüm satırları getirir, eşleşmeyenlerin karşısına null yazılır.

Biz Detail tablonun tüm kayıtlarını, Master tablonun eşleştiği kayıtlarını istediğimiz için Master Outer Join seçiyoruz. Önceki adımda Employees tablosunu Detail tablo olarak seçmiştik.

flag-8.PNG

Source ve target veri setlerimizi yan yana getirdik diyebiliriz. Veri target ta yoksa insert, eğer varsa ve city değişmişse eski city nin bulunduğu satırın flag ini 0 olarak update, yeni city nin bulunduğu satırı insert yapabilmemiz için, insert ve update olma koşullarını belirtmemiz gerekiyor. Bunun için Expression Transformation ekliyoruz.

Source tan gelen kolonların tamamını, Target tan gelen kolonlardan EmployeeID, City, kolonlarını Expression Transformation a ekliyorum. Bunun sebebi target taki diğer kolonların değişimi ile ilgilenmediğim için gereksiz port ları bağlamıyorum. Best Practise te gereksiz port ları bağlamayın denmekte.

Insert koşulu, update koşulu, yeni veri insert indeki flag, veri update olduğundaki flag i belirtmek üzere 4 Port oluşturuyorum. Bunlar çıkış portu olacağı için Input tiklerini kaldırmayı unutmayın.

Insert koşulu target ta EmployeeID yoksa yeni bir employee gelmiş demektir. Yani TRG_EmployeeID null ise insert yapmalıyız anlamına gelmekte.

Bir önceki örnekten farklı olarak insert ve update koşullarını tek bir port ta yazalım. İç içer IIF le koşulumuzu aşağıdaki gibi yazıyoruz.

flag-9.PNG

Her yeni kayıt için Current_Flag e 1 olarak insert, eski veri için 0 olarak update işlemi yapmak üzere Flag lerimi belirtiyorum. Son durumda şu şekilde Port larımı oluşturmuş oluyorum.

flag-10.PNG

Insert ve update olarak iki farklı işlemi yaptırabilmek için 2 Filter transformation ekliyorum. Insert ve update olaak isimlendiriyorum. Insert ile yeni kayıt girişi, update ile ilgili EmployeeID ye ait eski kayıdın Flag ini 0 olarak update etme işlemini yapacağım.

Insert Filter Transfromation a aşağıdaki gibi ilgili port ları sürükleyip bırakıyorum.

flag-11.PNG

Filter transformationa çift tıklayıp hangi koşulu sağlayan dataları filtreleyip, Target a insert etmemize imkan sağlayacağını belirtiyoruz. Yeni ve update olmuş kayıtları insert yapmak istediğimiz için, insert ya da update koşulunu sağlayan verileri yeni kayıt olarak insert edeceğimizi belirtiyoruz.

flag-12.PNG

Daha sonra Target ın giriş portu ile bağlıyoruz.

Sıra geldi ilgili EmployeeID ye ait city güncellendiğinde eski city ye karşılık gelen Current_Flag i 0 olarak update etmeye.

Eklemiş olduğum Filter Transformation a ilgili portları bağlıyorum.

v1.PNG

Filter transformation un filtreleme koşulunu belirtiyorum.

flag-14.PNG

Update işlemi yapacağımız için Update Strategy Transformation ekliyoruz.  DD_Update olarak  Update Strategy Expression i belirtiyorum.

v2

EmployeeId e göre Current_Flag i update yapacağımız için iki port u Target a bağlıyoruz.

Mapping imizi kaydedip, valid olduğundan emin olduktan sonra Workflow Manager a geçip mapping imizi çalıştırabiliriz.

Workflow da nasıl işlemler yaptığımı şu makalemde anlattığım için ayrıntıya girmiyorum. Workflow u çalıştırıyorum. Workflow Monitor dan data akışını kontrol ediyorum.

flag-15.PNG

106 satır veri varmış source Employee tablomda, target tablom boş olduğu için 106 satır veri aktarıldı. Tekrar çalıştırdığımızda hiçbir veri akışı olmayacaktır target.

flag-16

Yukarıdaki görselde görebileceğiniz üzere 86499 kodu employee nin City sini Sinop olarak update ediyorum. Bu update işlemini source tablomda olan Employee de yapıyoruz tabiki.

Tekrar workflow u çalıştırıyorum. 1 kaydın güncellendiğini görüyoruz.

flag-17.PNG

Bu şekilde verimiz güncellendiğinde eski kayıtları saklamak için Flag leme yöntemi ile hem verinin yeni halini hem de eski versiyolarını saklayabiliriz.

Bu yazımda Incremental süreçlerde kullanılan SCD Type-2 Current Flag yöntemini inceledik. Bir sonraki yazımda Version Number yöntemi ile Incremental süreçlerimizi nasıl yönettiğimizi inceleyeceğiz.

Keyifli okumalar…

Şeydanur Sandıkçı

Reklamlar

Etiketler:, , , , , , , , , , , , , , , , , , , , , , ,

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s

%d blogcu bunu beğendi: