Slowly Changing Dimension چیست؟
Dimension ها به آهستگی در طول زمان تغییر می کنند. خیلی اوقات نیاز داریم تا گزارشات را بر اساس تاریخچه داده ایجاد کنیم. لذا نیاز به ساز و کاری که در نگه داری تاریخچه داده به ما کمک کند ضروری به نظر می رسد. این امر با SCD ( Slowly Changing Dimension ) قابل دست یابی است.
در مورد Fact و Dimension مطالب زیر را مطالعه نمایید.
مساله
برای اینکه با صورت مساله و ساز و کار Slowly changing Dimension به خوبی آشنا شوید در مورد مثال های زیر اندکی تامل کنید.
فرض کنید که شخصی به نام حسین وثوقی ساکن در شهر تهران تا کنون از ما 20 میلیون تومان کالا خریداری نموده است. حال از امروز این شخص نام خود را تغییر داده و نام بهروز وثوقی را برای خود انتخاب نموده است. این شخص بعد از تغییر نام 10 ملیون از ما خریداری کرده است. حال در گزارشات ما چه تغییری حاصل می شود؟ آیا باید خریدهای حسین وثوقی را جدا از خرید های بهروز وثوقی محاسبه کنیم؟! البته که خیر. ما باید کل خرید های قبل از تغییر نام و بعد از تغییر نام را به بهروز وثوقی اختصاص دهیم. در واقع بهروز وثوقی 30 میلیون تومان از ما کالا خریداری کرده است. در این مثال کافی است ما نام حسین را در داده ها به بهروز تغییر دهیم و نیازی به نگه داری تاریخچه تغییرات نداریم.
حال فرض کنید شخصی به نام پوریا بغدادی تا سال 1390 ساکن شهر تهران بوده و تا پایان سال 1390، 15 میلیون تومان از ما کالا خریداری نموده است. این شخص از ابتدای سال 1391 تصمیم به تغییر محل سکونت خود گرفته است. ایشان از ابتدای سال 1391 به شهر کرج نقل مکان کرده است. از ابتدای سال 1391 تا امروز ایشان 10 میلیون تومان از ما کالا خریداری کرده است.
حال مدیریت از ما می خواهد 2 گزارش تهیه کنیم. یکی گزارش فروش به تفکیک مشتری و دوم گزارش فروش به تفکیک شهر. اگر بخواهیم میزان فروش به تفکیک مشتریان را نمایش دهیم، چه میزان از فروش ما به پوریا بغدادی بوده است؟ درست حدس زدید! 25 میلیون تومان.
حال می خواهیم بر اساس شهرهای مختلف میزان فروش را نمایش دهیم. بدیهی است که فروش به شخص پوریا بغدادی تا سال 1390 متعلق به شهر تهران و پس از آن متعلق به شهر کرج است.
حال فرض کنید ما هر تغییر در داده را با داده قبلی جایگزین کنیم و تاریخچه آن را نگه داری نکنیم. در این صورت با تغییر مکان پوریا بغدادی به کرج، محل سکونت او را در داده ها به کرج تغییر می دهیم و تمام فروش این شخص به کرج اختصاص می یابد. در واقع 25 میلیون تومان فروش به پوریا بغدادی به کرج اختصاص می یابد و این گزارش غلط خواهد بود. لذا در این مثال ما به ساز و کاری نیاز داریم که تاریخچه تغییرات را نگه داری کنیم.
نگه داری تاریخچه تغییرات با Slowly Changing Dimension قابل دستیابی است. توجه کنید که همان طور که گفته شد برای تمام ویژگی ها نگه داری تاریخچه تغییرات لازم نیست. نگه داری تاریخچه تغییرات بسته به نیاز کسب و کار و گزارشات شما تعیین می گردد. به طور مثال، احتمالا برای ویژگی هایی مثل نام، نام خانوادگی، کد ملی و ویژگی هایی از این دست نیازی به نگه داری سابقه تغییرات نداریم. کافی است با تغییر این ویژگی ها، آن را به روز رسانی کنیم و مقدار قبلی را با مقدار جدید جایگزین کنیم. مثلا بهروز را جایگزین حسین کنیم.
اما برای برخی ویژگی ها مثل شهر محل سکونت، مدرک تحصیلی و ویژگی هایی از این دست ممکن است نیاز داشته باشیم که سابقه تغییرات را نگه داری کنیم. در این صورت نیاز ما با جایگزین کردن داده قدیمی با داده جدید رفع نخواهد شد. با تغییر محل شهر سکونت از تهران به کرج، نه تنها نیاز ما رفع نخواهد شد بلکه گزارشات ما غلط خواهند بود.
انواع رویکرد ها
رویکرد اول
در اولین رویکرد که به Type 0 شناخته می شود، اجازه هیچ تغییری به ویژگی مورد نظر داده نمی شود. به طور مثال اگر برای کد ملی Type 0 را در نظر بگیریم تنها داده ای که اولین بار درج شده اعتبار دارد و اجازه هیچ گونه تغییری داده نمی شود.
رویکرد دوم
در این رویکرد که به Type 1 معروف است، داده قدیمی با داده جدید جایگزین می شود. برای ویژگی هایی که ممکن است در طول زمان تصحیح شوند و تغییر کنند و تغییرات آن ها در گزارشات ما اهمیتی ندارد این رویکرد مناسب به نظر می رسد. مانند نام و نام خانوادگی که ممکن است اشتباه وارد شده باشد یا واقعا توسط شخص تغییر داده شود. در این رویکرد مقدار جدید جایگزین مقدار قبلی می شود و تاریخچه نگهداری نمی شود. استفاده از این رویکرد نیز مانند رویکرد اول به سادگی صورت می پذیرد.
همان طور که در تصویر مشاهده می کنید نام مشتری حسین وثوقی بوده و بعد از تغییر به سادگی به روز رسانی شده و با نام بهروز جایگزین گشته است.
جدول مشتریان را بعد از به روز رسانی و استفاده از Type 1 مشاهده می کنید.
رویکرد سوم
رویکرد سوم که به Type 2 معروف است با تغییر در یک ویژگی یک رکورد به جدول اضافه می شود و ردیف قبلی بدون تغییر باقی می ماند. بدیهی است این عمل نباید برای تمامی ویژگی ها انجام شود. این عمل تنها برای ویژگی هایی که نگه داری تاریخچه تغییرات آن برای ما حیاتی است انجام می شود. در این رویکرد جدول به کلید جدیدی نیاز خواهد داشت. همچنین در این رویکرد 3 ستون تاریخ شروع، پایان و وضعیت نیز به جدول اضافه می شود.
تصویر زیر وضعیت جدول را قبل و بعد از تغییر نمایش می دهد. ما برای شهر محل سکونت مشتری ویژگی Type 2 را در نظر گرفته ایم. لذا با تغییر محل سکونت مشتری از تهران به کرج یک رکورد دیگر برای آن مشتری درج می شود. جدول اول وضعیت قبل از تغییر را نشان می دهد. حسین هنوز در تهران زندگی می کند. لذا تاریخ شروع برای این رکورد وجود دارد اما تاریخ پایان درج نشده است و وضعیت با Y نشان داده می شود که نشان دهنده این است که این ردیف آخرین وضعیت مشتری را نمایش می دهد.
اما جدول دوم که پس از تغییر را نمایش می دهد، 2 رکورد برای حسین ثبت شده است. اولین رکورد که نشان می دهد از سال 1385 تا سال 1390 در شهر تهران زندگی کرده است و N نشان دهنده این است که این رکورد آخرین تغییرات این مشتری را نمایش نمی دهد. رکورد سوم این جدول پس از تغییر محل سکونت اضافه شده است که نشان می دهد حسین از ابتدای سال 1391 به کرج نقل مکان کرده است و Y نشان دهنده این موضوع است که این رکورد آخرین وضعیت او را نمایش می دهد.
استفاده از این روش بسیار پرهزینه است. لذا تا زمانی که نیاز به آن را حس نکرده اید از انجام آن پرهیز کنید.
رویکرد چهارم
در این روش که به Type 3 معروف است جدول دارای دو ستون مقدار قبلی و مقدار فعلی است. در هر ردیف مقدار قبلی و فعلی نگهداری می شود.
همان طور که در تصویر مشاهده می کنید برای حسین مقدار قبلی تهران و مقدار فعلی کرج درج شده است.
رویکرد پنجم
در این روش که به type 4 معروف است جدول مشتریان به روال عادی نگه داری می شود و تاریخچه تغییرات در جدول دیگری نگه داری می شود. در واقع در جدول اصلی آخرین وضعیت و در جدول دوم تاریخچه تغییرات نگه داری می شود.
رویکرد ششم
رویکرد ششم که از آن به عنوان Type 6 یاد می شود، ترکیبی از رویکردهای نوع اول، دوم و سوم می باشد (1+2+3). در این رویکرد مقدار قبلی، مقدار فعلی، تاریخ شروع و پایان و در نهایت وضعیت رکورد ذخیره می شود. جدول زیر وضعیت ابتدایی رکورد نمایش می دهد. این رکورد نشان می دهد حسین ساکن تهران است و تا به حال تغییری در محل سکونت او ایجاد نشده است. تاریخ شروع اولین مراجعه او به شرکت ما و تاریخ پایان نشان دهنده این است که او همچنان ساکن تهران است. و ستون آخر نمایش دهنده این است که این رکورد آخرین وضعیت او را نشان می دهد.
حال پس از تغییر مکان او به تهران و به روز رسانی آن، جدول به صورت زیر در می آید. همان طور که مشاهده می کنید رکورد ابتدایی باطل شده که با عدد 0 در ستون آخر نمایش داده شده است. عدد 1 برای رکورد آخر نمایانگر این است که این رکورد وضعیت نهایی این مشتری را نمایش می دهد.
جمع بندی
گاهی لازم است که تاریخچه داده نگه داری شود. برای این منظور از یک امکان به نام Slowly Changing Dimension استفاده می شود که تغییرات در Dimension ها را ذخیره می کند. این امکان در ابزار های یکپارچه سازی مثل SSIS قابل پیاده سازی است. انواع رویکرد های پیاده سازی Slowly Changing Dimension در این مطلب شرح داده شد که متناسب با نیاز می توان از آن استفاده نمود.
درباره حسین وثوقی
دانش آموخته مهندسی صنایع و مدیریت فناوری اطلاعات دانشگاه تهران، علاقه مند به تحلیل و ارائه راه حل برای مسائل و بهینه سازی راه حل ها هستم ...
نوشته های بیشتر از حسین وثوقی
سپاسگزارم
مطلب خوبی بود
سلام … ممنون که ما رو دنبال می کنید
تشکر ، بسیار جامع و عالی بود
ممنون از همراهی شما
سلام استاد .خیلی عالی بود . فقط میخواستم بدونم که کدوم روش از همه بهتره ؟ آیا میشه گفت؟.یا اینکه بستگی به شرایط داره
بهترین روش وجود نداره
اما معمولا از روشی استفاده میشه که 2 ستون شروع و پایان برای مشخص کردن انقضای رکورد اضافه میشه به جدول
سلام
ببخشید می تونم در مورد SDC TYPE 3 و SCD TYPE 6 در SSIS کمک بخوام لطفا
با تشکر
سلام …
بفرمایید …
فقط بگم که معمولا خود ssis این موضوعات رو هندل می کنه و شما کافیه از 3 نوع ممکن یکی رو انتخاب کنید…
معمولا از روشی که startdate و enddate به ابعاد اضبافه میشه استفاده می کنیم