منوی دسته بندی

جدول فکت Fact Table چیست؟ بررسی 4 نوع فکت در انبار داده

مقدمه‌ای بر هوش تجاری، انبار داده و مدل کیمبال

برای اینکه بدانیم جدول فکت چیست ابتدا باید برخی مفاهیم دیگر را بررسی کنیم. در چند دهه اخیر، سازمان‌ها بیش از هر زمان دیگری برای تصمیم‌گیری‌های راهبردی به داده‌ها متکی شده‌اند. حجم عظیم اطلاعاتی که روزانه در سیستم‌های عملیاتی مختلف ذخیره می‌شود، اگر به شکلی منظم و ساختارمند مدیریت نشود، عملاً ارزش خاصی ایجاد نمی‌کند. اینجا است که مفهوم هوش تجاری یا همان BI اهمیت پیدا می‌کند. هوش تجاری مجموعه‌ای از ابزارها و روش‌هاست که داده‌ها را به بینش عملیاتی و مدیریتی تبدیل می‌کند. اما هوش تجاری نمی‌تواند مستقیماً بر داده‌های خام عملیاتی تکیه کند؛ چون این داده‌ها اغلب فاقد استاندارد، یکپارچگی و ساختار تحلیلی هستند.

برای این منظور، انبار داده یا Data Warehouse شکل گرفت؛ سیستمی که داده‌ها را از منابع مختلف جمع‌آوری، تمیز، تبدیل و یکپارچه می‌کند تا بتوان آن‌ها را تحلیل کرد. یکی از مهم‌ترین روش‌های طراحی انبار داده، مدل کیمبال است که در آن مدل داده یا Data Model بر اساس ساختار ستاره‌ای و استفاده از جدول فکت و جدول دایمنشن شکل می‌گیرد. این مدل تأکید می‌کند که برای تحلیل‌های دقیق، باید داده‌ها در قالب رویدادهای قابل اندازه‌گیری ذخیره شوند و توضیحات مرتبط با آن‌ها در جداول دایمنشن قرار گیرد.

در این مقاله تمرکز اصلی ما بر روی انواع جدول فکت است، اما پیش از رسیدن به این بخش لازم است ابتدا دقیقاً بدانیم جدول فکت چیست و چرا یکی از مهم‌ترین اجزای هر انبار داده محسوب می‌شود.

انبار داده

جدول فکت چیست و چه جایگاهی در مدل داده دارد؟

در مدل داده کیمبال، دو نوع جدول وجود دارد: Fact Table یا جدول فکت، و Dimension Table یا جدول دایمنشن. جدول دایمنشن معمولاً شامل ویژگی‌های توصیفی است؛ مانند نام مشتری، گروه محصول، نوع تراکنش، موقعیت جغرافیایی، واحد سازمانی، تاریخ و ده‌ها ویژگی مشابه. این ویژگی‌ها کمک می‌کنند تحلیلگران بتوانند داده‌ها را دسته‌بندی، فیلتر و گروه‌بندی کنند.

اما جدول فکت قلب انبار داده محسوب می‌شود. جدول فکت شامل داده‌های عددی، قابل محاسبه و قابل تحلیل است؛ داده‌هایی که مبنای محاسباتی گزارش‌ها و داشبوردهای هوش تجاری هستند. هر رکورد در جدول فکت نشان‌دهنده یک رویداد، یک اندازه‌گیری یا یک تراکنش در دنیای واقعی است. این جدول حاوی داده‌های عددی و قابل اندازه‌گیری است که فرآیندهای کسب‌وکار یک سازمان را نشان می‌دهند.

به بیان ساده، یک جدول فکت پاسخ به سؤال “چه اتفاقی افتاده است؟” را می‌دهد. برای مثال، “مشتری A، محصول B را به مقدار C، از فروشنده D، در تاریخ E و با قیمت F خریداری کرد.” هر سطر در یک جدول فکت معمولاً نمایانگر یک رویداد transactional است.

به‌عنوان مثال، اگر درباره فروش صحبت کنیم، هر ردیف در فاکتور فروش می‌تواند یک رکورد در جدول فکت باشد. اگر درباره تراکنش بانکی صحبت کنیم، هر انتقال وجه یک رکورد فکت است. اگر درباره موجودی صحبت کنیم، اندازه موجودی در یک روز یا یک ساعت تبدیل به رکورد فکت می‌شود.

ساختار یک جدول فکت از سه جزء اصلی تشکیل شده است:

  1. کلیدهای خارجی (Foreign Keys): این ستون‌ها، کلیدهای اصلی جدول دایمنشن مرتبط را reference می‌کنند و زمینه (Context) رویداد را فراهم می‌کنند. برای مثال، CustomerKey، ProductKey، TimeKey.

  2. اقلام سنجه (Measures): اینها مقادیر عددی و قابل محاسبه هستند که تحلیل می‌شوند. مانند SalesAmount، QuantitySold.

  3. کلیدهای جایگزین (Degenerate Dimensions): در برخی موارد، شناسه‌های عملیاتی (مانند شماره فاکتور یا شماره تراکنش) که به جدول دایمنشن مستقلی تعلق ندارند، مستقیماً در خود جدول فکت ذخیره می‌شوند.

این ساختار باعث می‌شود جدول فکت به نقطه اتصال تمام جدول دایمنشنها تبدیل شود و امکان تحلیل چندبُعدی داده‌ها را فراهم کند.

برای اینکه بتوانیم انواع جدول فکت را بهتر درک کنیم، لازم است ابتدا مفهوم ریزدانگی یا Granularity را توضیح دهیم.

ساختار جدول فکت

مفهوم ریزدانگی یا Granularity

ریزدنگی یکی از اساسی‌ترین مفاهیم در طراحی دیتا مدل است. Granularity به این اشاره دارد که هر رکورد جدول فکت چه میزان جزئیات را نشان می‌دهد. اگر ریزدانگی در سطح تراکنش باشد، یعنی هر رخداد واحد (مثلاً هر خرید مشتری) یک رکورد جداگانه دارد. اگر در سطح روز باشد، یعنی ممکن است اطلاعات فروش یک روز تجمیع شود.

در انتخاب ریزدانگی، دقت بسیار زیادی لازم است؛ زیرا ریزدانگی اشتباه می‌تواند باعث حجیم‌شدن غیرضروری جدول فکت شود یا برعکس، باعث از دست‌رفتن جزئیات ارزشمند گردد.

  • ریزدانگی بالا: به معنای جزئیات بسیار زیاد است. برای مثال، هر سطر نمایانگر یک خط خاص از یک فاکتور فروش (یک آیتم) است.

  • ریزدانگی پایین: به معنای خلاصه‌سازی داده‌ها است. برای مثال، هر سطر نمایانگر مجموع فروش یک محصول در یک ماه است.

مثال ساده برای درک ریزدانگی این است که فرض کنید یک فروشگاه قصد دارد میزان فروش خود را تحلیل کند. اگر ریزدانگی بر اساس تراکنش باشد، هر سطر رسید فروش یک رکورد فکت می‌شود. اما اگر ریزدانگی را روزانه انتخاب کنیم، دیگر نمی‌توانیم ببینیم در یک روز چه مشتریانی خرید کردند، چه محصولی بیشتر فروخته شد یا چه معامله‌ای سودآورتر بود. فقط می‌توانیم بدانیم که جمع کل فروش چه مقدار است.

این تفاوت باعث می‌شود که ریزدانگی تعیین‌کننده نوع تحلیل‌های ممکن باشد. پس Granularity یک عامل کلیدی در درک صحیح انواع جدول فکت محسوب می‌شود.

انواع جدول فکت در مدل کیمبال

حال می‌رسیم به مهم‌ترین بخش این مقاله، یعنی انواع جدول فکت. عبارت “انواع جدول فکت” در این متن چندین بار تکرار می‌شود تا علاوه بر توضیح دقیق، مقاله از نظر سئو نیز عملکرد بسیار مناسبی داشته باشد. در مدل کیمبال چهار نوع اصلی جدول فکت وجود دارد که هرکدام کاربرد خاص خود را دارند. این چهار نوع عبارت‌اند از جدول فکت تراکنشی یا Transactional، جدول فکت عکس لحظه‌ای دوره‌ای یا Periodic Snapshot، جدول فکت انباشتی یا Accumulating Snapshot و جدول فکت بدون مقدار یا Factless Fact Table.

در ادامه همه این موارد را با مثال‌های کاملاً واقعی و کاربردی بررسی می‌کنیم.

جدول فکت تراکنشی یا Transactional Fact Table

اولین و رایج‌ترین نوع در بین انواع جدول فکت، جدول تراکنشی است. این جدول هر رویداد واقعی را همان‌طور که اتفاق افتاده ثبت می‌کند. به‌عنوان مثال، اگر فروشگاه زنجیره‌ای دارای ۲۰۰ شعبه باشد و هر روز ده‌ها هزار تراکنش فروش ثبت کند، هر تراکنش یک رکورد در Fact Table خواهد بود.

برای درک بهتر، یک سناریوی واقعی در نظر بگیریم. فرض کنید مشتری یک فروشگاه آنلاین وارد سایت می‌شود و یک گوشی موبایل، یک قاب محافظ و یک پاوربانک می‌خرد. در سیستم عملیاتی سه سطر در فاکتور ثبت می‌شود، بنابراین سه رکورد در جدول فکت تراکنشی ایجاد خواهد شد. هر رکورد شامل کلید محصول، کلید مشتری، کلید تاریخ، تعداد محصول، قیمت واحد، تخفیف، مبلغ نهایی و سایر جزئیات است.

در اینجا ریزدانگی در پایین‌ترین سطح ممکن است؛ یعنی هر سطر فاکتور یک رکورد است. جدول تراکنشی معمولاً بزرگترین جدول انبار داده است چون تراکنش‌ها روزانه اتفاق می‌افتند و تعدادشان زیاد است. از این جدول برای تحلیل‌های دقیق مانند تحلیل رفتار مشتری، تحلیل سبد خرید، تحلیل فروش روزانه، تشخیص الگوها و ساخت مدل‌های پیش‌بینی استفاده می‌شود.

این نوع در میان انواع جدول فکت بیشترین عمق تحلیلی را ارائه می‌کند. در ادامه تصویری از یک جدول فکت تراکنشی را مشاهده می کنید.

جدول فکت تراکنشی

جدول فکت Snapshot دوره‌ای یا Periodic Snapshot Fact Table

نوع دوم در میان انواع جدول فکت، جدول Snapshot دوره‌ای است. این جدول برخلاف جدول تراکنشی، رویدادهای جداگانه را ثبت نمی‌کند، بلکه وضعیت سیستم را در یک بازه زمانی مشخص ثبت می‌کند.

اگر بخواهیم مثالی واقعی بزنیم، سیستم مدیریت موجودی را تصور کنید. موجودی انبار ممکن است در طول روز بارها تغییر کند. اما مدیریت سازمان نمی‌خواهد تک‌تک تغییرات را تحلیل کند. بیشتر اوقات کافی است بداند در پایان هر روز مقدار موجودی چه بوده است. بنابراین در پایان هر روز یک Snapshot گرفته می‌شود و در جدول فکت Snapshot ذخیره می‌شود.

فرض کنید انبار یک شرکت شامل ۸۰۰۰ نوع کالا است. اگر در پایان هر روز موجودی همه کالاها ثبت شود، هر روز ۸۰۰۰ رکورد وارد جدول Snapshot خواهد شد. این جدول معمولاً اندازه متوسطی دارد؛ بزرگ‌تر از جدول دایمنشن اما کوچک‌تر از جدول تراکنشی.

این نوع جدول برای تحلیل روندها بسیار مناسب است. مثلاً می‌توان رفتار موجودی را در ۶ ماه بررسی کرد، روند کاهش یا افزایش سفارش‌ها را دید، یا تعداد سفارش‌های باز در هر روز را تحلیل کرد.

در انواع جدول فکت، Snapshot بیشترین کاربرد را در گزارش‌های مدیریتی دارد، نه تحلیل‌های عمیق ریزتراکنشی.

فکت snapshot دوره ای

جدول فکت انباشتی یا Accumulating Snapshot Fact Table

سومین نوع از انواع جدول فکت، جدول انباشتی است که وقتی مورد استفاده قرار می‌گیرد که با فرآیندهایی سروکار داریم که از چند مرحله تشکیل شده‌اند. این نوع فرآیندها شامل چرخه‌های چندگانه هستند؛ مانند روند سفارش تا تحویل. در چنین فرآیندهایی ابتدا سفارش ثبت می‌شود، سپس تأیید می‌شود، بعد آماده‌سازی انجام می‌شود، سپس ارسال می‌شود و در نهایت کالا تحویل داده می‌شود.

در جدول انباشتی، برای هر سفارش تنها یک رکورد وجود دارد. اما این رکورد در طول زمان آپدیت می‌شود. یعنی مثلاً وقتی سفارش ثبت می‌شود، ستون تاریخ ثبت مقدار می‌گیرد. وقتی سفارش تأیید شد، ستون تاریخ تأیید نیز مقدار می‌گیرد. وقتی ارسال شد، ستون تاریخ ارسال مقدار می‌گیرد.

برای مثال، فرض کنید یک مشتری یک یخچال خریداری می‌کند. این سفارش ممکن است طی ۷ روز کامل شود. در جدول انباشتی تنها یک رکورد برای این سفارش وجود دارد. در روز اول فقط تاریخ ثبت مقدار می‌گیرد. در روز دوم که سفارش تأیید می‌شود، ستون مربوط به این مرحله مقدار می‌گیرد. در روز سوم کالا آماده می‌شود و ستون آماده سازی مقدار می‌گیرد. در روز چهارم کالا ارسال می‌شود و ستون ارسال مقدار می‌گیرد. نهایتاً در روز هفتم تحویل انجام می‌شود و فرآیند تکمیل می‌شود.

این نوع جدول برای تحلیل زمان چرخه، تحلیل سرعت عملیات، اندازه‌گیری SLA و بررسی کارایی بخش‌های مختلف سازمان مفید است. در ادامه تصویری از یک جدول فکت انباشتی را مشاهده می کنید.

جدول فکت snapshot انباشتی

جدول فکت بدون مقدار یا Factless Fact Table

آخرین نوع از انواع جدول فکت، جدول Factless است. این جدول برخلاف سه نوع قبلی، هیچ مقدار عددی (سنجه) ندارد. شاید عجیب به نظر برسد که جدول فکت بدون عدد چه ارزشی دارد، اما در انبار داده کاربردهای بسیار مهمی دارد.

جدول Factless برای ثبت اتفاقاتی استفاده می‌شود که هیچ اندازه‌گیری عددی ندارند. مثلاً حضور دانش‌آموزان در کلاس درس یک رویداد است اما مقدار عددی مشخصی ندارد. یا شرکت مشتریان در کمپین تبلیغاتی. یا ثبت اینکه یک محصول در یک فروشگاه موجود است یا نیست.

برای مثال، یک دانشگاه می‌خواهد تحلیل کند که کدام دانشجویان در کدام کلاس‌ها حضور داشتند. هر بار حضور دانشجو در یک کلاس می‌تواند یک رکورد در Factless Fact Table باشد. ستون‌های این جدول فقط کلیدهای خارجی هستند؛ مثلاً کلید دانشجو، کلید کلاس و کلید تاریخ. هیچ ستون عددی وجود ندارد.

Factless یکی از جالب‌ترین انواع جدول فکت است چون به تحلیل روابط بسیاری به بسیاری کمک می‌کند. در ادامه تصویری از جدول فکت Factless Fact را مشاهده می فرمایید.

جدول فکت factless fact

انواع سنجه ها (Measure) در جدول فکت: Additive، Semi-Additive و Non-Additive

یکی از مهم‌ترین مفاهیم در تحلیل انواع جدول فکت، درک انواع Measures است.

ستون‌های Additive ستون‌هایی هستند که در تمام ابعاد قابل جمع شدن هستند. مبلغ فروش، تعداد کالا، وزن فروش، و مقدار فروش همگی مثال‌هایی از این نوع هستند. مثلاً اگر بخواهیم فروش سال گذشته را تحلیل کنیم، می‌توانیم فروش همه ماه‌ها را جمع کنیم.

اما ستون‌های Semi-Additive فقط در برخی ابعاد قابل جمع هستند. موجودی انبار یک مثال واضح است. نمی‌توانیم موجودی امروز و موجودی دیروز را جمع کنیم؛ چون این عمل نتیجه اشتباهی دارد و مقدار موجودی را چند برابر نشان می دهد. اما می‌توانیم موجودی همه انبارها را در یک روز جمع کنیم.

نوع سوم ستون‌های Non-Additive هستند. این ستون‌ها اصلاً قابل جمع نیستند؛ مانند میانگین، نسبت، درصد یا نرخ تبدیل. مثلا نمیتوانیم میانگین درصد تخفیف دو کالا را با هم جمع کنیم اما میتوانیم میانگین آنها را محاسبه کنیم.برای این ستون‌ها معمولاً از توابع آماری مثل میانگین و ماکزیمم و مینیمم و صدک و … استفاده می‌شود.

نکات کلیدی عملکرد (Performance) در طراحی جدول فکت

از آنجایی که جدول فکت معمولاً بزرگ‌ترین جدول در یک انبار داده است، بهینه‌سازی عملکرد آن برای پاسخگویی سریع کوئری‌های هوش تجاری حیاتی است. مهم‌ترین نکته این است که ستون‌های Fact Table تا حد امکان باید عددی باشند. چون ستون‌های عددی هم فضای کمتری مصرف می‌کنند و هم بهتر ایندکس می‌شوند.

معمولاً استفاده از انواع داده‌هایی مانند integer، decimal و bigint رایج است.موارد زیر را میتوان برای بهینه سازی عملکرد جدول فکت در نظر گرفت.

  1. کاهش عرض جدول: هر چه تعداد ستون‌ها در یک جدول فکت کمتر باشد، داده‌های بیشتری در هر صفحه ذخیره می‌شوند و IO (ورودی/خروجی داده) کاهش می‌یابد. تنها ستون‌های کاملاً ضروری را نگه دارید.

  2. استفاده از انواع داده‌های بهینه: برای ستون‌های کلید خارجی و سنجه‌ها از کوچک‌ترین نوع داده ممکن استفاده کنید. به جای INT از SMALLINT یا TINYINT و به جای FLOAT از DECIMAL با دقت مشخص استفاده کنید. این کار حجم ذخیره‌سازی و memory مصرفی را drastically کاهش می‌دهد.

  3. ایجاد ایندکس‌های هوشمند: یک ایندکس کلسترد بر روی ترکیبی از کلیدهای خارجی پرکاربرد (مثلاً DateKeyProductKey) می‌تواند عملکرد کوئری‌های محدوده‌ای را بسیار بهبود بخشد. از ایندکس‌های غیرکلسترد بر روی ستون‌های پرکاربرد دیگر نیز استفاده کنید.

  4. پیاده‌سازی پارتیشن‌بندی (Partitioning): پارتیشن‌بندی یک جدول فکت بزرگ بر اساس یک کلید منطقی (معمولاً DateKey) یکی از قدرتمندترین تکنیک‌های بهینه‌سازی است. این تکنیک به مدیریت بهتر داده‌ها (مانند آرشیو کردن پارتیشن‌های قدیمی) و افزایش چشمگیر عملکرد کوئری‌ها (با حذف اسکن کل جدول) کمک می‌کند.

  5. اجتناب از عملیات UPDATE پرهزینه: سعی کنید طراحی جدول فکت به گونه‌ای باشد که عملیات INSERT غالب باشد. جدول در فکت تراکنشی معمولاً فقط INSERT انجام می شود. جدول فکت انباشته نیاز به UPDATE دارد، اما باید حجم آن را کنترل کرد. عملیات UPDATE در جداول بسیار بزرگ می‌تواند بسیار کند و باشد و Lock ایجاد کند.

جمع‌بندی

در این مقاله کامل‌ترین توضیح ممکن درباره انواع جدول فکت ارائه شد. از بررسی مدل داده، ریزدانگی، مثال‌های بسیار و تفسیر کاربرد هر نوع جدول گرفته تا مفهوم ستون‌های Additive، Semi-Additive و Non-Additive. شناخت دقیق انواع جدول فکت یکی از ضروری‌ترین مهارت‌ها برای تحلیلگران داده، طراحان انبار داده و متخصصان هوش تجاری است.

آیا این نوشته برایتان مفید بود؟

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *