מה לעשות כאשר מפתח המימד מגיע באיחור

By | 27 באוקטובר 2011

פעמים רבות, מאפיינים של רשומה מסויימת מגיעים בזמנים שונים. למשל בעת הכנסת לקוח למערכת לא ציינו האם הוא זכר או נקבה ורק לאחר חודש הוסיפו פרט זה. במקרה זה אין בעיה ומבצעים עדכון למימד. אך מה קורה כאשר דוקא המפתח של המימד מגיע באיחור?

נתחיל בדוגמה:

חברת ליסינג מבצעת עסקאות שונות. יצרנו Fact Table עם מדדים המתארים את העסקה: מחיר רכב, תשלום חודשי וכו'. הפקט מחובר למימד רכבים על פי מספר רכב (בפועל כמובן עם מפתח פנימי – Generated Key) אך לצורך הדיון נתייחס למספר הרכב. אל מימד העסקאות מחובר הפקט באמצעות מספר העסקה.

באופן זה ניתן לראות כמה עסקאות למכירת סיטרואן היו בחודש מסויים.

האתגר: בין חתימת עסקה וקבלת מספר עסקה חדשה לבין חיבור רכב לעסקה יכולים לעבור מספר חודשים. לפעמים הלקוח מבקש רכב אשר אינו במלאי היבואן ויש להמתין עד שיגיע לארץ. במצב זה ישנה עסקה בלי מספר רישוי בתוכה. אנו נכניס את העסקה אל הפקט עם מספר רישוי שיחבר לרשומת ה"לא מוגדר" במימד הרכבים כדי שהעסקה לא תושמט מהמימד עקב JOIN לא קיים למימד הרכבים.

פתרון זה לא השביע את רצון הלקוח כיוון שלמרות שאין רכב (מספר רישוי) מסויים בעסקה, כבר יודעים שהיא תהיה עסקה אליה יכנס בבוא הזמן רכב מסוג יגואר. כיצד עם כן נציג את דגם הרכב בעסקה בה עדיין לא הוגדר רכב (מספר רישוי) מסויים.

ישנן שתי אפשרויות לפתרון הבעיה:

פתרון פשוט: הפרדה למימדים שונים את דגם הרכב ומספר הרישוי של הרכב. פתרון זה נפסל בגלל שהיררכיה דגם ß מספר רישוי הינה טבעית (לכל מספר רישוי דגם בודד( ולכן זה גם היה פוגע בביצועים וגם יותר ממשק עבודה פחות נוח למשתמש.

לבעיה זו ביצעתי פתרון הכולל מספר שלבים:

  1. הוספת רכבים חדשים למימד רכבים בצורה הרגילה ועסקאות עם מספר רישוי רכב שאינו אפס (כלומר יש רכב בעסקה) אל הפקט בצורה הרגילה.
  2. לגבי עסקאות להן יש דגם רכב אך עדיין לא הוגדר רכב (מספר רישוי) מסויים, מבוצעים הצעדים הבאים:
    1. מגדירים טבלה חדשה בבסיס הנתונים Staging. טבלה זו תכיל את השדות דגם רכב, מספר רכב אשר ייוצר בתוך המערכת באמצעות Identity. כדי לא לבלבל יוגדר המספר הראשון (Seed) של ה- Identity כמינוס אחד (1-) עם ירידה (Increment) של מינוס אחד . כלומר תהיה ספירה למטה.
    2. נוסיף רכבים מלאכותיים אלו אל מימד הרכבים.
    3. עתה, נרשום שאילתה אשר לוקחת מנתוני המקור רק את העסקאות שלא הוגדר להן רכב (מספר רישוי אפס או NULL) ואותן נחבר אל מימד הרכבים באמצעות JOIN על הדגם ולא על מספר הרישוי. נקבל בפקט מספר רישוי מלאכותי (קטן מאפס על פי המתווה של סעיף 2.א) . הערה חשובה: יש לשים לב שב- JOIN אל מימד הרכבים נוסיף גם את התנאי מספר רישוי קטן מאפס במימד. במידה ולא נוסיף תנאי זה נקבל מכפלה קרטזית כיוון שלכל דגם יש הרבה רכבים (אך רק רכב אחד עם מספר רישוי קטן מאפס).

קיבלנו טבלת עובדות המכילה את כל ההזמנות. להזמנות להן עדיין לא הוגדר מספר רישוי של רכב מסויים, יש קישור למימד הרכבים עם מספר רישוי מלאכותי ולכן רואים את הדגם המקושר להזמנה ובירידה לרמת מספר רישוי רואים מספר רישוי שלילי אשר מבהיר למשתמש שלא מדובר במספר רישוי מסויים.

הערות:

לצורך פישוט המאמר לא התייחסתי בפתרון לנושא המפתח המלאכותי (Surrogate / Generated Key). בעולם האמיתי לא נקשר בדרך כלל את מימד הרכבים אל טבלת העובדות באמצעות מספר הרישוי אלא באמצעות מפתח מלאכותי אשר אותו ניתן לייצר על ידי הגדרת שדה מפתח מלאכותי במימד הרכבים עם Identity (כלומר מונה רץ). במצב זה כאשר נרצה לבצע Insert לטבלת הרכבים אם מפתח זר שהוכן בטבלה אחרת נצטרך לאפשר זאת באמצעות פקודה מקדימה: SET IDENTITY_INSERT Table_Name ON .  

במידה ויש מדד לספירת רכבים ונרצה (כמובן) למנות רק רכבים קיימים בפועל, נוכל להעזיר בשיטה המתוארת כאן: http://www.olap.co.il/?p=543 עם התאמה לספירת רק ערכים גדולים מאפס.

תרשים זרימה לנתונים המגיעים באיחור

 

Share

כתיבת תגובה

האימייל לא יוצג באתר.