510 likes | 981 Views
236363 מערכות מסדי נתונים. 3. אלגברה יחסית (רלציונית) (מבוסס על השקפים של אלדר פישר). שפת שאילתות. שאילתה – ביטוי המאפשר שליפת מידע ממסד הנתונים שפת שאילתות – שפה לניסוח שאילתות. התנאים בביטוי WHERE בשפת SQL מנוסחים בצורה לוגית. שפה למשתמש אנושי. שפות לוגיות. תרגום.
E N D
236363מערכות מסדי נתונים 3. אלגברה יחסית (רלציונית) (מבוסס על השקפים של אלדר פישר)
שפת שאילתות • שאילתה – ביטוי המאפשר שליפת מידע ממסד הנתונים • שפת שאילתות – שפה לניסוח שאילתות התנאים בביטוי WHERE בשפת SQL מנוסחים בצורה לוגית שפה למשתמש אנושי שפות לוגיות תרגום שפה לניסוח ביטויים פשוטים לחישוב מעל מסד הנתונים אופרטורים (אלגברה)
אלגברה של יחסים (רלציונית) • אלגברה של יחסים (Relational Algebra) היא שפה המאפשרת לנסח שאילתות עבור נתונים המאורגנים בטבלאות (יחסים). • התחביר מזכיר תחביר של ביטויים אלגברים, רק שכאן הפעולות הן על טבלאות שלמות, ולא על נתונים בודדים. • התוצאה של ביטוי אלגברי (שאילתה) היא טבלה (יחס) בעצמה. כל עוד לא נאמר אחרת, נניח כי יחסים הם קבוצות ופעולות האלגברה הן פעולות על קבוצות
פעולות האלגברה (אופרטורים) • חמש פעולות בסיסיות ועוד שתי פעולות טכניות: • פעולות אונריות: הטלה (Projection), בחירה (Selection). • פעולות בינאריות: מכפלה קרטזית, הפרש ואיחוד. • שינוי שמות תכונות: פעולה טכנית לצורך הרכבת פעולות. • השמה: פעולה טכנית לצורך ביצוע ביטוי בשלבים. • פעולות מרוכבות שניתנות לביטוי באמצאות הפעולות הבסיסיות:חיתוך, צירוף (Join) בגרסאותיו השונות, חילוק, וכו'. • לעיתים ברמת המימוש כדאי לממש באופן ישיר גם חלק מהפעולות המרוכבות, ולא להסתמך על מימושי הפעולות הבסיסיות בלבד.
הטלה (Projection) • הטלה היא פעולה של הורדה של חלק מהתכונות של רשומות היחס. • במושגים של טבלאות: מוחקים את העמודות שאינן מופיעות באינדקס של הטלה, ואז מסירים כפילויות של שורות בטבלה הנוצרת לאחר המחיקה.
בחירה (Selection) • תהי T=T[A1, ... ,Am] טבלה בעלת סכמה עם תכונות A1,...,Am. • עבור ביטוי , T תהיה קבוצת הרשומות ב-T המספקות את התנאי המובע ב-. • מה יכול להכיל ? • השוואות (עם האופרטורים =, , >, <, , ) בין תכונה לבין קבוע או בין שתי תכונות. עבור תכונות מסוגים מסוימים (למשל קבוצות) יתכנו גם סימני יחס אחרים (למשל "" ). • פעולות בוליאניות. למשל: ( A1 2 ) (A3 = “cat” ).
איחוד, הפרש וחיתוך • פעולות אלו מתבצעות רק בין זוג יחסים בעלי אותה סכמה, והן זהות לפעולות המקבילות מתורת הקבוצות. • איחוד ST─ מכיל את כל הרשומות שנמצאות ב-S או ב-T. • הפרש S\T─ מכיל את כל הרשומות שנמצאות ב-S אך לא נמצאות ב-T. • חיתוך ST─ מכיל את כל הרשומות שנמצאות גם ב-S וגם ב-T. • חיתוך אינו אופרטור בסיסי - ניתן לבטא אותו בעזרת הפרש S \ ( S \ T ). • דוגמא:
מכפלה קרטזית (Cartesian Product) • עבור שני יחסים ─ ניקח את קבוצת כל הזוגות האפשריים של רשומה מהיחס הראשון ורשומה מהיחס השני. • במושגים של טבלאות: לוקחים את כל ה"שרשורים" האפשריים של שורה מ-S ושורה מ-T. • אם יש תכונות בעלות שם זהה ל-S ו-T, נבדיל ביניהן באמצעות סימון שם היחס המקורי (למשל "T.Num", "S.Num"), או באמצעות תוספת של מספר סידורי (למשל "Num2", "Num1"). מה תהיה התוצאה אם אחד היחסים יהיה ריק?
שינוי שם תכונות • למעשה זו אינה פעולה באלגברה של יחסים, אלא פעולת עזר שנועדה לאפשר כתיבת ביטויים מורכבים (בעיקר אלו המערבים איחוד, חיסור וחיתוך, וכן צירופים טבעיים – ראו בהמשך). • אם T=T[A1, ... ,Am] היא טבלה בעלת סכמה עם התכונות A1,...,Am, אז A1→B1,…, Am→Bm(T) יחזיר אותה טבלה בדיוק לאחר החלפת שמות התכונות ל- B1,…,Bm בהתאמה.
הפעולות הבסיסיות • חמש הפעולות הטלה, בחירה, מכפלה קרטזית, הפרש ואיחוד מוגדרות כפעולות בסיסיות: • לא ניתן לבטא אף אחת מהן בעזרת הארבע האחרות. • ניתן לבטא פעולות לא בסיסיות (כגון חיתוך, צירוף, חילוק) בעזרתן (לעיתים תוך שימוש בשינוי שם תכונות). • כיצד מראים כי פעולה בסיסית היא אכן בסיסית? • מוצאים תכונה שהיא מקיימת ושלא מתקיימת באף צירוף של הארבע האחרות.
כיצד להראות כי פעולות הן בסיסיות • טענה: לא ניתן לבטא הטלה בעזרת הפעולות בחירה, מכפלה קרטזית, • הפרש ואיחוד. • הוכחה (קווי מתאר): יהי R יחס בעל n>1 עמודות: R[A1,...,An]. • בהטלה A1R מתקבל יחס בעל פחות מ-n עמודות. • כעת ניתן להראות כי כל ביטוי המכיל את R (אפשר עם יחסים נוספים) • ומורכב מהפעולות בחירה, מכפלה קרטזית, הפרש ואיחוד, יוצר יחס • בעל לכל הפחות n עמודות. • ניתן להראות זאת באינדוקציה על מספר האופרטורים בביטוי. • כיצד נשנה את ההוכחה כדי להראות שמכפלה קרטזית היא פעולה • בסיסית?
-צירוף (-Join) • צירוף לפי ביטוי (-Join):בהינתן יחסים S[A1,...,An] ו- T[B1,...,Bm], וביטוי במושגים של A1,...,An,B1,...,Bm, נסמן ב-S ⋈ T את תוצאת הביטוי האלגברי (ST) . • דוגמה:
צירוף טבעי (Natural Join) • פעולה נפוצה מאוד במסדי נתונים. • עבור היחסיםS[A1,...,An,B1,...,Bm] ו- T[B1,...,Bm,C1,...,Ck], נסמן ב-S ⋈ T את היחס הבא: כל הצירופים של רשומה מ-S ורשומה מ-T המסכימות ביניהן על התכונות המשותפות, כאשר מכל זוג תכונות משותפות מותירים עמודה אחת בלבד. • בניסוח אחר: • S ⋈ T= A1,...,An,S.B1,...,S.Bm,C1,...,Ck(S ⋈(S.B1=T.B1) ... (S.Bm=T.Bm) T)
צירוף למחצה (Semi-join) • עבור S[A1,...,An,B1,...,Bm] ו- T[B1,...,Bm,C1,...,Ck], נסמן ב-S ⋉ T את כל הרשומות ב-S שעבורן קיימות רשומות ב-T המסכימות איתן על התכונות המשותפות.בניסוח אחר:S ⋉ T= A1,...,An,B1,...,Bm(S ⋈ T) • במקרים רבים כדאי להשתמש במימוש ישיר של צירוף למחצה, להקטנת תוצאות הביניים בעת מימוש ביטוי באלגברה יחסית.
חילוק (Division) • בהינתן שני יחסים S[A1,...,An,B1,...,Bm] ו- T[B1,...,Bm], (ז"א כאשר תכונות T מוכלות בתכונות S), נסמן ב-ST את היחס R[A1,...,An] המכיל כל רשומה שעבורה יש רשומות ב-S לכל הקומבינציות האפשריות עם רשומות מ-T. • במילים אחרות: R היא הקבוצה המקסימלית עבורה TR S. • הגדרה באמצעות פעולות בסיסיות: • ST= A1,...,AnS \ A1,...,An (((A1,...,AnS) T) \ S )
B pno P2 sno דוגמא נוספת לחילוק A נרצה לקבל את רשימת הספקים מ-A המספקים את כל החלקים המופיעים ברשימה B. S1S2S3S4 =
B pno P2 P4 sno דוגמא נוספת לחילוק A נרצה לקבל את רשימת הספקים מ-A המספקים את כל החלקים המופיעים ברשימה B. S1S4 =
B pno P1 P2 P4 sno דוגמא נוספת לחילוק A נרצה לקבל את רשימת הספקים מ-A המספקים את כל החלקים המופיעים ברשימה B. S1 = מה תהיה התוצאה אם אחד היחסים יהיה ריק?
S_Name T_Num A_Time D_Time S_Type Days Height Arrives Station Train Serves Gives Km Platform Line Service L_Type Direction T_Category Food L_Num Class אלגברה יחסית ─ דוגמא מסכמת • ניזכר בדיאגרמת ה-ER עבור מפעיל הרכבות.
אלו טבלאות יתקבלו מהדיאגרמה ? • אלו עמודות יהיו בטבלה עבור טיפוס הקשרים Serves ? • המפתח S_Name (של טיפוס הישויות Station) • תכונות המפתח Direction, L_Num (של Line) • שלוש העמודות הנ"ל ישמשו כמפתח של Serves • בנוסף תהיה עמודה עבור התכונה Km • אלו עמודות יהיו בטבלה עבור טיפוס הקשרים Arrives ? • המפתח T_Num של טיפוס הישויות Train • תכונות המפתח של טיפוס הקשרים (המקובץ) Serves─ אלו הן Direction, L_Num, S_Name • שלוש התכונות של טיפוס הקשרים Arrives─Platform, D_Time, A_Time
הסכמות • מהשקף הקודם (קווים תחתיים מציינים את המפתח הראשי): • Serves(S_Name, L_Num, Direction, Km) • Arrives(T_Num, S_Name, L_Num, Direction, Platform, • D_Time, A_Time) • עבור הדוגמאות כאן נהפוך את התכונה הרב-ערכית לרלציה נפרדת: • Station(S_Name, Height) • Station_Type(S_Name, S_Type)
דוגמאות לשאילתות • אלו תחנות נמצאות על הקו 1-דרום ? • המידע הנ"ל נמצא כולו בטבלת Serves. השאילתה: • S_Name((L_Num=1)(Direction=“south”)(Serves)) • לאלו קווים יש תחנות מתחת לפני הים ? • כאן נדרש לצרף את Serves ל-Station. השאילתה המלאה: • L_Num,Direction(Height<0(Station⋈Serves)) • או (תוך שימוש בחצי צירוף): • L_Num,Direction(Serves⋉S_Name(Height<0(Station)))
דוגמאות לשאילתות • תחנות שמשרתות יותר מקו אחד? • נרצה לבחון שתי שורות מטבלת Serves בו זמנית. השאילתה: • S_Name((S_Name=S)((L_NumL)(DirectionD))( S_Name→S, L_Num→L, Direction→D, Km→K (Serves) Serves)) • מה אם לא נרצה להחשיב כיוונים שונים של אותו קו? • S_Name((S_Name=S)(L_NumL)( S_Name→S, L_Num→L, Direction→D, Km→K (Serves) Serves)) • כיצד נמצא תחנות המשרתות קו אחד (במספר כיוונים) בדיוק? • S_Name(Serves) \S_Name((S_Name=S)(L_NumL)( S_Name→S, L_Num→L, Direction→D, Km→K (Serves) Serves))
דוגמאות לשאילתות • מהו שם התחנה הגבוהה ביותר? • יותר קל למצוא את התחנות שאינן הגבוהות ביותר: • R = S_Name((Height<H)(Station S_Name→N, Height→HStation)) • עתה קל להשלים את השאילתה: • S_Name (Station) \ R
דוגמא לשימוש בחילוק • אלו רכבות (לפי מספר) מגיעות לכל התחנות ? • T_Num,S_Name(Arrives)S_Name(Station) • ומה אם יש תחנות שלא נמצאות על אף קו פעיל ? איך נמנע מלהתחשב בהן ? • T_Num,S_Name(Arrives)S_Name(Serves) • ומה אם יש תחנות הנמצאות על קו פעיל אולם אף רכבת אינה מבצעת עצירה בהן ? • T_Num,S_Name(Arrives)S_Name(Arrives)
דוגמא לשאילתה מורכבת יותר • נניח עתה שנרצה למצוא את כל הזוגות של קווים שיש ביניהם תחנת חילוף, כולל את סוגי הקווים. • ראשית נבחר צירופי "משרת-קו" שעבורם התחנה היא תחנת חילוף: • R = (Line ⋈ Serves)⋉S_Name(S_Type =“change” (Station_Type)) • עתה במכפלה RR יהיו כל הזוגות האפשריים של צירופי "משרת-קו" עבורם המדובר בתחנת חילוף ─ נניח שעל מנת להבדיל בין התכונות הוספנו להם אינדקסים, למשל S_Name1, S_Name2, … • נרצה לבחור מהמכפלה רק זוגות החולקים ביניהם אותה תחנת חילוף: • S = (S_Name1=S_Name2) (L_Num1L_Num2) (RR) • לבסוף, לקבלת השאילתה השלמה נבצע הטלה על התכונות המעניינות אותנו: T = L_Type1,L_Num1,Direction1,L_Type2,L_Num2,Direction2(S)
אלו שאילתות לא ניתן לבטא באלגברה יחסית? • ישנם מספר סוגים של שאילתות טבעיות שאין עבורן ביטויים מתאימים באלגברה יחסית (RA). • פונקציות הקבצה (Aggregate functions): שאילתות מהצורה:"כמה קווים יש בכיוון צפון ?""מה ממוצע המרחקים בין שתי תחנות על קו 1-דרום?""כמה רכבות עוצרות ביום שני בכל תחנה?"שאילתות אלו דורשות הפעלה של פונקציות בעלות מספר לא קבוע של משתנים (כגון ספירה, סכום, ממוצע...) על קבוצת ערכים המתקבלים מהיחס. • ישנן הרחבות של RA המאפשרות שאילתות מסוג זה, וכן ניתן לשאול אותן בשפת SQL הנלמדת בתרגול.
שאילתות שאי אפשר לבטא (המשך) • סגור טרנזיטיבי:האם ניתן לשאול את השאילתה הבאה ב-RA ?"מהן כל התחנות שאליהן ניתן להגיע מתחנה S במספר סופי (כלשהו) של חילופי רכבת?" • לכל k קבוע אפשר לשאול ב-RA את השאילתה: "מהן כל התחנות שאליהן ניתן להגיע מתחנה S ב-k או פחות חילופי רכבת?"אבל את השאילתה ללא הגבלה על k לא ניתן לבטא באלגברה רלציונית. • גם ב-ANSI SQL סטנדרטי (ללא התערבות של שפה המארחת) אי אפשר לבטא שאילתה מעין זו.להשוואה, שפת השאילתות Datalog מאפשרת את ניסוח שאילתות המכילות רקורסיה ובפרט את ניסוח השאילתה הנ"ל.
יחסים חסרי תכונות • על מנת לאפשר שאילתות "כן/לא", וכן על מנת לפשט במקרים מסוימים את ביטוי השאילתה, נהוג להרחיב במעט את האלגברה היחסית לטיפול ב"טבלאות" חסרות עמודות. • מה יחס חסר תכונות יכול להכיל? • יחס כזה יכול להיות ריק. • היחס יכול להכיל שורה אחת בדיוק שהיא "שורה ריקה" (לעיתים מתייחסים אל השורה הריקה כאל ערך אמת "true" או כמייצג מצב "קיים", בניגוד למצב "לא קיים" המיוצג ביחס ריק).
הכללת פעולות האלגברה • הטלות: עבור יחס R, גם הקבוצה הריקה תחשב כתת-קבוצה של קבוצת התכונות שלו, וההטלה המתאימה תסומן ב-πλR. • תוצאת הביטוי תהיה יחס ריק אם R יחס ריק, ותכיל את השורה הריקה (כשורה יחידה) אם R לא היה ריק. • מכפלה קרטזית: איך נגדיר את R S אם S יחס חסר תכונות? • התוצאה תהיה ריקה אם S ריק, וזהה ל-R אם S מכיל את השורה הריקה. • חלוקה: אם ל-R ול-S אותן תכונות, אז RS יכיל את השורה הריקה אם S⊆R, ויהיה ריק אחרת.
שקילות שאילתות • שני ביטויים הם שקולים אם מעל כל תוכן אפשרי של מסד הנתונים הם מחזירים אותה תוצאה. • מדוע חשוב לדעת אם ביטויים הם שקולים? • אופטימיזציה – עבור ביטוי נתון, נרצה להפוך אותו לביטוי שקול יעיל יותר לחישוב. • דוגמה: עבור היחס R(A,B,C) הביטויים הבאים שקולים: • A (R) A (A,B(R)) A (A,C(R)) • מי יותר יעיל לחישוב?
דוגמה • נתונים היחסים R(A,B), S(A,B), ונרצה להראות ש-A R A Sשקול ל- A (R S). • א. נראה ש- A R A S A (R S). • ב. נראה ש-A R A S A (R S).
דוגמה • א. נראה ש- A R A S A (R S). • אם tAR AS, אז t שייך או ל-AR או ל- ASמהגדרת האיחוד. • לכן, קיים uR כך ש-u[A]=t[A], או קיים uS כך ש-u[A]=t[A]. • לכן, קיים uRS כך ש-u[A]=t[A]. • או במילים אחרות, tA(RS).
דוגמה • ב. נראה ש-A R A S A (R S). • אם tA (R S), אז קיים uRS כך ש-u[A]=t[A]. • לכן, קיים uR כך ש-u[A]=t[A], או קיים uS כך ש-u[A]=t[A]. • לכן, או ש- tA R או ש-tA S. • או במילים אחרות, t A R A S.
חשיבות השקילות • שאילתת SQL טיפוסית SELECT DISTINCT A FROM R,S WHERE R.B=S.B AND C=5; תרגום ישיר A ((R.B=S.B)(C=5)(R S)) חשוב לוודא שהאופטימיזציה לא גורמת לחישוב שגוי אופטימיזציה A (R⋉B ( C=5S)))
צירוף חיצוני Outerjoin • צירוף טבעי גורם לאיבוד חלק מהמידע – רשומות "מתנדנדות" לא יופיעו בתוצאה. בצירוף חיצוני (outerjoin) מרפדים את הערכים החסרים בערכי null וכך לא זורקים תוצאות: • עבור היחסיםS[A1,...,An,B1,...,Bm] ו- T[B1,...,Bm,C1,...,Ck], נסמן ב-S ⋈outer T את היחס הבא: הצירוף הטבעי של S ו-T כשכל רשומה מ-S שאין רשומה מ-T שניתן לצרף לה מרפדים בערכי null ומוסיפים לתוצאה, וכנ"ל לגבי רשומות T שאין להן צירוף ב-S. • בניסוח אחר: • S ⋈outer T= (S ⋈ T) ((S \ (S⋉T)) C1,...,CkTnull) (A1,...,AnSnull (T \ (T⋉S))) • כאשר Tnullיחס בעל סכמה זהה לזו של T והמכיל שורה של ערכי null • ו- Snullיחס בעל סכמה זהה לזו של S והמכיל שורה של ערכי null.
דוגמה • צירוף חיצוני של S ו-T מה תהיה התוצאה אם אחד היחסים יהיה ריק? קיימים צירוף חיצוני ימני (right outer join) וצירוף חיצוני שמאלי (left outer join) שבהם מרפדים ב-null רק את היחס הימני או השמאלי, בהתאמה
ערכי null • למעשה, ברגע שאנו מאפשרים את הערך המיוחד "null" אשר מציין תכונה עם ערך חסר, עלינו גם להכליל את משמעות פעולות האלגברה של יחסים גם עבור המקרים שערכים אלו מופיעים בקלטים (למשל, איך מבצעים צירוף טבעי כאשר יש רשומות עם null בחלק מהתכונות המשותפות?) • הכללה זו קשה להגדרה והיא מחוץ למסגרת הקורס.
סמנטיקת שקים (Bag, multi-set) • עד כה, הנחנו כי יחסים הם קבוצות. • בפועל, עבור חישוב שאילתות כמו שאילתות SQL נדרש לאפשר • כפילויות (מדוע?) • בסמנטיקת שקים (רבי-קבוצה), יחס עשוי להכיל כפילויות, כלומר • אותה רשומה עשויה להופיע ביחס יותר מפעם אחת. • יש לשנות את האופרטורים האלגברים בהתאם.
אופרטורים בסמנטיקת שקים • הטלה – מורידים עמודות בלי למחוק כפילויות. • בחירה – משאירים את השורות המקיימות את התנאי, כולל כפילויות. • מכפלה קרטזית R S – אם רשומה t מופיעה n פעמים ב-R ורשומה u מופיעה m פעמים ב-S אזי השרשור של t ו- u יופיע mn פעמים ב-R S. • איחוד R S – אם רשומה t מופיעה n פעמים ב-R ו-m פעמים ב-S אזי t תופיע m+n פעמים באיחוד. • הפרש R \ S – אם רשומה t מופיעה n פעמים ב-R ו-m פעמים ב-S אזי t תופיע max{0,n-m} פעמים בהפרש. • חיתוך R S – אם רשומה t מופיעה n פעמים ב-R ו-m פעמים ב-S אזי t תופיע min{n,m} פעמים בחיתוך. • אופרטור δ – אופרטור חדש להסרה מפורשת של כפילויות. בקורס זה, כשלא נאמר אחרת נניח כי מדובר בסמנטיקת קבוצות