הצטרפו לקבוצות שלנו לקבלת עדכונים מרוכזים פעם בשבוע:

ווטסאפ:
http://wa.dwh.co.il
טלגרם:
http://telegram.dwh.co.il

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

דוגמא לטבלה שכזאת אפשר לראות בתמונה הבאה:

dimtable.jpg

 

 

 

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

 

לטבלת זמן יש שלוש מטרות עקריות:

 

-המטרה הראשונה היא האפשרות לבצע מניפולציות רבות של נתונים בקלות. לדוגמא, אם יש לנו תאריך מסויים, נוכל להוצא בקלות את החודש, רבעון , שנה, תאריך התחלת השבוע וכו' וכל זה בקלות ללא שימוש במניפולציות כגון to_char באורקל או convert בSql Server. מטרה זאת מקבלת משני חשיבות כאשר מדובר בשדה בfact או ב Dim אשר עליו מוגדר אינדקס. שימוש בטבלה כזאת, חוסך את הצורך בהגדרת אינדקסים נוספים.

 

-מטרה נוספת היא שימוש בטבלה זאת כמימד משותף לחיבור מספר  Fact בסכמת גלקסיה. דוגמא למצב שכזה אפשר לראות בדוגמא הבאה:

הסבר: מימד הזמן מאפשר לנו חיבור נוח של שתי טבלאות הfact. חיבור ישיר של שתי טבלאות הfact היה מסובך, לא יעיל ואף בלתי אפשרי.

 

 galaxy.gif

 

 

הערה: תמונה זאת נלקחה מ"מחסני נתונים ושאר ירקות"

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

 

מבנה טבלת הזמן

 

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

 

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

 

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

 

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

 

מפתח הטבלה וקישור לטבלאות אחרות

 

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

 

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

 

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

 

באותה הזדמנות יש לציין נושא חשוב שמשום מה ברבים מהפרוייקטים מתעלמים ממנו והוא ערך ברירת המחדל. רבים מהתאריכים הם תאריכי חובה, לדוגמא: תאריך מכירה בfact מכירה, אך ישנם שדות תאריכים רבים שאינם חובה ולכן יכולים להכיל NULL. דוגמא לשדה כזה יכול להיות תאריך ביטול של פוליסה אשר יכיל ערך רק בפוליסות אשר בוטלו. מכיוון שאנו צריכים להשתמש בטבלת הזמן כדי לפענח שדות כאלה נתקלת בבעיה. אם נשתמש בjoin רגיל בין שדה זה לטבלת הזמן "יפלו" כל הרשומות אשר בהם השדה מכיל NULL. מצד שני, אם נשתמש ב Outer Join , דבר שאינו נהוג במערכות מסוג זה נקבל ביצועים ירודים.

 

כדי להמנע ממקרים אלו וכדי לפתור את הבעיה בצורה אלגנטית, מכניסים ערך נוסף לטבלת הזמן עם תאריך שאינו קיים בנתונים. לדוגמא  1.1.1920  (יש לבדוק נושא זה היטב בבסיסי נתונים ישנים אשר לא הותאמו ל Bug2000) אשר מכיל בכל שדות הטקסט  את הערך "לא ידוע". ומכניסים לשדות שאותם רוצים לפענח (לדוגמא כמו תאריך ביטול) את אותו תאריך במקום NULL וכך נקבל join רגיל וטוב.

כיצד יוצרים טבלת זמן

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

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