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

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

footage_mini Contexts מהווים אחד מהפתרונות הנפוצים ביותר, במיוחד בעולמות הבנויים על DWH, לפתרון בעיית Loop.

בואו נסתכל על הסכמה הבאה:

 

 

 אם נסתכל על הסכמה, נוכל לראות שישנו רק loop אחד והוא נמצא בין הטבלאות E וC, כלומר, הדרך לכל שתי טבלאות, יכולות להמצא באחד מהמסלולים הבאים:

 

 

 

או

 

 

 

 Context הוא מסלול של SQL. בדוגמא שנתנו, ישנם שני contexts , אך במקרים אחרים יכולים להיות הרבה יותר, תלוי כמובן במורכבות של הסכמה.

יש להגדיר את הContexts בעולם וזאת כדי למנוע loops.

הגדרת Context
הגדרה אוטומטית

למזלנו יש בכלי מספר אפשרויות שיעזרו לנו לבצע את המשימה ביתר קלות:

כדי לאתר האם יש בעולם loops , יש להכנס לtoolsàautomated detectionàdetect loops (דרך אלטרנטיבית, ע"י לחיצה על מקש  בסרגל הכלים Editing).

נקבל מסך המתאר את הloops הקיימים בעולם ואת הcontexts הפותרים אותם (שימו לב : מבחינת הBO, הדרך לפתור loops היא באמצעות ה contexts, דבר שלא לגמרי נכון במציאות)

 

 

במקרה זה, לא הוגדרו contexts ולכן רשימת הcontexts ריקה. כך או כך, כל loop יסומן על המסך עצמו בכחול.

 

 

כדי להגדיר context לפי הloop ולפי המלצת הBO, יש:

  1. להקיש על .
  2. יפתח המסך הבא:
    שימו לב: ניתן להגיע למסך זה באופן ישיר על ידי:
    tools->automated detection->detect contexts
    או ע"י דרך אלטרנטיבית
    , מסרגל כלים Editing.
  3. מצד שמאל, אנו רואים את רשימת הcontexts האפשריים (Candidate Contexts) ומצד ימין את רשימת הContexts שנבחרו בפועל (Accepted contexts).
  4. לחיצה על , תעביר את הContexts מ Candidate Contexts אל Accepted contexts.
  5. לחיצה על , תעביר את הContexts מ Accepted contexts אל Candidate Contexts.
  6. כאשר Context  נבחר ברשימת הAccepted Context, ניתן לשנות את שמו באמצעות .
  7. בסיום יש להקיש .

 

לאחר שנחזור למסך ה loop detection, נראה את הcontexts מוגדרים:

הערה: לפני שנוכל להשתמש  בdetect loops , יש לסמן את הcardinalities בכל הjoins . 

הגדרה ידנית

כדי להגדיר context בצורה ידנית, יש :

  1. לגשת לinsert->context. (דרך אלטרנטיבית:  מתפריט Editing)
  2. יפתח המסך הבא:

 

  1. תחת Context name יש לתת שם לוגי לcontext.
  2. תחת Current context join list, יש לבחור את הjoins בcontext. אפשר לבחור מספר contexts ללא שימוש בCtrl.
  3. כדי לבדוק שהContext לא מכיל loop בעצמו, יש להקיש על .
  4. אם נרצה לבדוק צורך בcontexts בדומה לDetect context, יש להקיש על .
  5. תחת Description, יש להכניס תיאור של הcontext.
  6. לסיום, הקישו .

 

דרך אלטרנטיבית:

  1. בממשק המשתמש , יש לסמן את הjoins השייכים לcontext :(בחירה מרובה באמצעות ctrl)
  2. לגשת לinsertàcontext
  3. לבחור שם לcontext, ליד context name.
  4. לסיום .

 אם נרצה להוסיף joins  לcontext קיים:

1.      נסמן את הcontext בlist mode  

2.      קליק ימני ונבחר context properties.

3.      תפתח התיבה המוכרת (אך מעט שונה):

כעת נוכל להוסיף ולהוריד joins ואף לשנות את שם הcontext.

4.      לבדיקה נקיש .

5.      לסיום .

 

דרך אלטרנטיבית:

  1. נסמן את הjoins בממשק
  2. קליק ימני ונבחר add to context
  3. ברשימה הנפתחת נוסיף את הcontext אליו נרצה להוסיף את הjoins.

 footage

 

 

פעולת הContext

ניקח את הדוגמא מקודם:

כמובן שישנו loop ואותו נפתור באמצעות שני Contexts:

01023-21

  

 

 

אם ניקח אובייקטים משתי טבלאות המחוברות באמצעות joins השייכים לכל הcontexts (לדוגמא C-I) , לא תהיה בעיה משום שאותו חלק מהעולם (בדוגמא:   joins:C-H-I) מבטיח לנו שבין שתי נקודות לא יהיה מצב של חוסר בהירות לגבי המסלול שבו הSQL צריך לעבור.

 

אם ניקח אובייקטים משתי טבלאות המחוברות באמצעות joins השייכים לכל הcontexts וגם ניקח טבלה שהjoins שלה בתוך context אחד אך לא בשני (לדוגמא IßàCßàB)  הBO ישתמש בcontext שבו אותה טבלה נמצאת (בדוגמא, Context B)

 

אם ניקח אובייקטים מ2 טבלאות אשר יש לפחות שני מסלולים אפשריים שנמצאים בשני contexts שונים (כמו לדוגמא CßàE או  IßàA  ) תהיה לכאורה בעיה, כי הרי באיזה מסלול הBO יבחר, האם דרך Context A או שמא Context B ? במקרה זה, הBO יאלץ לשאול את המשתמש לפי איזה context הוא רוצה שיריץ את השאילתא.

 המשתמש יקבל את המסך הבא:

 

אם ניקח אובייקטים מסוג measure אשר נמצאים בשתי טבלאות שונות אשר מופיעות בשני contexts שונים (לדוגמא B,F). כמו כן, ניקח  אובייקט מסוג dimension אשר נמצא בטבלה אשר מחוברת באמצעות join אשר נמצא בכל הcontext (לדוגמא H), יווצר משפט SQL אחד לכל context. בדוגמא שלנו 2 משפטים:

האחד

Select sum (b.measure), h.dimesnion

From b,c, h

Group by h.dimesnion

Where b.field=c.field and c.field=h.field  

השני:

 

Select sum (f.measure), h.dimension

From f,c, h

Group by h.dimension

Where f.field=c.field and c.field=h.field 

 

בגלל שנוצרו שתי שאילתות יוחזרו מהDB שתי קבוצות של נתונים, אחת לכל שאילתא .

לדוגמא:

 

קבוצה 1:

 

measure

dimension

312

Jim

12311

James

233

David

1313

George

2424

Mike

2121

Suzan

4343

Lynn

 

קבוצה 2:

measure

dimension

323

Jim

4679

James

23232

David

1367

George

5689

Mike

88878

Suzan

1212

Lynn

מכיוון שהdimensions זהים לחלוטין בין שתי השאילתות, הBO לוקח את הקבוצות של שני הנתונים ומאחד אותם לכדי קבוצה אחת של נתונים אותם הוא מחזיר מהDB.

בדוגמא שנתנו:

measure2

Measure1

dimension

323

312

Jim

4679

12311

James

23232

233

David

1367

1313

George

5689

2424

Mike

88878

2121

Suzan

1212

4343

Lynn

 

הערות: פעולת איחוד שתי הקבוצות לכדי קבוצה אחת זהה לחלוטין לפעולת איחוד שתי שאילתות באמצעות link בReporter של הBO.