210 likes | 338 Views
תחשיב רלציוני על תחומים Domain Relational Calculus. DRC הוא הצהרתי, כמו SQL : מבטאים בו רק מה רוצים שתהיה התוצאה, ולא איך לחשב אותה. כל שאילתה ב- DRC היא מהצורה {<x 1 ,x 2 ,…x i > | F(x 1 ,x 2 ,…x i )} , כאשר F(y 1 ,y 2 ,…y i ) היא נוסחא בלוגיקה מסדר ראשון. משמעות:
E N D
תחשיב רלציוני על תחומיםDomain Relational Calculus • DRC הוא הצהרתי, כמו SQL: מבטאים בו רק מה רוצים שתהיה התוצאה, ולא איך לחשב אותה. • כל שאילתה ב-DRC היא מהצורה {<x1,x2,…xi> | F(x1,x2,…xi)}, כאשר F(y1,y2,…yi) היא נוסחא בלוגיקה מסדר ראשון. • משמעות: כל הnיות <c1,c2,…ci> כך שתחת ההשמהx1= c1, x2 = c2, …xi = ci בF- יהיה ערכה של FTrue. • המשתנים בפרדיקט אינם מייצגים רשומות, אלא ערכי שדות בודדים מהתחום D שמתוכו נלקחים ערכי מסד הנתונים. • רשומה מיוצגת ע"י רשימה של משתנים המוקפת בסוגריים זוויתיים, לדוגמא <a,b,c>. DBMS 236363 שפות שאילתה - DRC
כללים ליצירת נוסחאות DRC • הנוסחה חייבת להיות בנויה לפי הכללים הבאים: נוסחאות אטומיות: • שייכות של רשומה <x1,x2,…xi> לרלציה r: <x1,x2,…xi>r או r(x1,x2,…xi) • יחס בין שדה x לשדה או קבוע y: xy, כאשר הוא אחד מסימני היחס =, , >, <, , נוסחאות מורכבות: אם F2, F1נוסחאות, גם הביטויים הבאים הם נוסחאות: F1 ⋀ F2 F1 ⋁ F2 F1 F1 F2 t(F1) t(F1) DBMS 236363 שפות שאילתה - DRC
תזכורת: מסד שתייני הבירה • drinker(dname, dcity) - שם שתיין ועיר מגוריו. • pub(pname, pcity) - שם של פאב והעיר שבה הוא נמצא. • beer(bname, btype) - שם של בירה והסוג שלה . • frequents(dname, pname) – שתיין נוהג לבקר בפאב • serves(pname, bname) – פאב מגיש בירה. • likes(dname, bname) - שתיין אוהב בירה. DBMS 236363 שפות שאילתה - DRC
דוגמאות • דוגמא 1: אלו בירות יוסי אוהב? {<dn, bn> | <dn, bn> likes ⋀ dn = ‘Yossi’} או: {<dn, bn> | likes(dn, bn) ⋀ dn = ‘Yossi’} או: likes(dn, bn) ⋀ dn = ‘Yossi’ • כדי לקבל רק את שמות הבירות, בלי Yossi: {<bn> | dn(<dn, bn> likes ⋀ dn = ‘Yossi’)} DBMS 236363 שפות שאילתה - DRC
דוגמאות - המשך • דוגמא 2:שמות השתיינים וסוגי הבירה שהם אוהבים: {<dn, bt> | bn (likes(dn, bn)⋀ beer(bn, bt))} • דוגמא 3: באלו ערים מגישים בירה שיוסי אוהב? {<pc> | pn, bn, dn(pub(pn, pc) ⋀ serves(pn, bn)⋀likes(dn, bn) ⋀ dn = ‘Yossi’)} DBMS 236363 שפות שאילתה - DRC
דוגמאות - המשך • דוגמא 4: מי הם השתיינים שבכל פאב (המגיש בירה) יש בירה שהם אוהבים? • ניסיון 1: {{<dn> |pn bn (serves(pn, bn)⋀ likes(dn, bn) ) • נקבל רלציה ריקה! יש ערך אפשרי ‘xxx’ למשתנה pn שמפיל את כולם. • ניסיון 2: {<dn> |pn bn’ (serves(pn, bn’) bn( serves(pn, bn) likes(dn, bn) )) } • נקבל את כל התחום! תמיד נוכל למצוא ערך למשתנה bn’ שייתן False עבור serves(pn, bn’). • הפתרון: {<dn> |pn, bn’ (serves(pn, bn’) bn ( serves(pn, bn) likes(dn, bn) ) dc (drinker(dn, dc)))} DBMS 236363 שפות שאילתה - DRC
בטיחות • הבעיה:DRC "חזק" מדי – ניתן לכתוב שאילתה המחזירה תוצאה לא חסומה (כל הערכים האפשריים בתחום). • דוגמא: מה תחזיר השאילתא אם נשמיט את החלק השני שלה? {<dn> | pn, bn’ (serves(pn, bn’) bn( serves(pn, bn) likes(dn, bn) ))} אם טבלת serves ריקה, אזי נקבל את קבוצת כל הערכים האפשריים עבור dn. DBMS 236363 שפות שאילתה - DRC
תחשיב רלציוני על רשומותTuple Relational Calculus • TRC דומה ל-DRC עם מספר הבדלים. • כל שאילתא ב-TRC היא מהצורה {t | P(t)}, כאשר P(t)הוא פרדיקט שאומר האם רשומה t עונה על תנאי השאילתא. • לעיתים מציינים את שמות השדות ב-t בסוגרייםמרובעים, לדוגמא {t[A,B,C] | P(t)}. • הערכים עבור השדות של רשומות אלה נלקחים, כאמור, מתוך התחום D. לדוגמא, במסד שתייני הבירה, D הוא תחום המחרוזות. DBMS 236363 שפות שאילתה - DRC
כללים ליצירת נוסחאות TRC • בתוך הנוסחה מתייחסים לשדות של רשומה t ע"י [שם שדה] t. הנוסחה חייבת להיות בנויה לפי הכללים הבאים: נוסחאות אטומיות: • שייכות של רשומה t לרלציה r: t r או r(t) • יחס בין שדה x לשדה y או קבוע : t[x]s[y] אוt[x], כאשר הוא אחד מסימני היחס =, , >, <, , נוסחאות מורכבות: אם F2, F1נוסחאות, גם הביטויים הבאים הם נוסחאות: F1 ⋀ F2 F1 ⋁ F2 F1 F1 F2 t(F1)t(F1) DBMS 236363 שפות שאילתה - DRC
דוגמאות • דוגמא 1: אלו בירות יוסי אוהב? {t | t likes ⋀ t[dname] = ‘Yossi’} • כדי לבחור רק את שמות הבירות, בלי לחזור על Yossi כל פעם: {t[bname] | u (u likes ⋀ u[dname] = ‘Yossi’ ⋀ u[bname] = t[bname])} DBMS 236363 שפות שאילתה - DRC
דוגמאות - המשך • דוגמא 2: שמות השתיינים וסוגי הבירות שהם אוהבים: {t[dname,type] | u,v (u likes ⋀ v beer ⋀ u[bname] = v[bname] ⋀ u[dname] = t[dname] ⋀ t[type] = v[type])} • דוגמא 3: באלו ערים מגישים בירה שיוסי אוהב? {t[pcity] | u,v,w(u pub ⋀ u[pcity] = t[pcity] ⋀ v serves⋀ v[pname] = u[pname] ⋀ w likes ⋀ w[bname] = v[bname] ⋀ w[dname] = ‘Yossi’)} DBMS 236363 שפות שאילתה - DRC
שאלה ממבחן – חורף 08/09 מועד א' • נתונות טבלאות היחסים הבאות. שימו לב לכך שטבלאות אלו מייצגות מידע על קורסים, סטודנטים ומרצים. • Courses(Cid, Number, Title, Semester) • CourseInfo(Cid, Tid, Room, Time, TeacherInCharge) • Teachers(Tid, Name, Status) • Students(Sid, Name) • Enrollment(Sid, Cid, Tid) DBMS 236363 שפות שאילתה - DRC
שאלה 1 • כתבו מה מחשבת השאילתה הבאה: {t[Semester] | uCourses(u[Semester]=t[Semester] v,wCourses( (v[Semester] = u[Semester] w[Semester] = u[Semester] v[Cid]w[Cid]) i,jCourseInfo (i[Cid]=v[Cid] j[Cid]=w[Cid] i[Room]=j[Room] i[Time]=j[Time]) )) } DBMS 236363 שפות שאילתה - DRC
פתרון • השאילתה מחזירה את כל הסמסטרים כך שקיים קורס בסמסטר ואין 2 קורסים שונים הניתנים באותו הסמסטר כך שזמן ההרצאה והכיתה בה הם ניתנים הוא זהה. DBMS 236363 שפות שאילתה - DRC
שאלה 2 • כתבו שאילתה בתחשיב היחסים (DRC) המוצאת זוגות של שם קורס (Title) וסמסטר, כך שבסמסטר היו רשומים לקורס בדיוק שני סטודנטים. • שם קורס וסמסטר – נמצאים בטבלת courses • רישום לקורס של סטודנטים – נמצא בטבלת enrollment • קישור בין הטבלאות – ע"י השדה cid DBMS 236363 שפות שאילתה - DRC
פתרון {<title,semester> | cid,number(Courses(cid,number, title,semester) tid1,tid2,sid1,sid2 (sid1 sid2 Enrolment(sid1,cid,tid1) Enrolment(sid2,cid,tid2) sid3,tid (Enrolment(sid3,cid,tid) (sid3=sid1 ⋁ sid3=sid2))))} DBMS 236363 שפות שאילתה - DRC
בטיחות – המשך • מוטיבציה: הגבלת DRC לנוסחאות "טובות" – אשר לא תלויות בתחום הערכים של המשתנים, אלא רק בתוכן המסד (domain independent). • בעיה נוספת: קשה לדעת האם נוסחה נתונה תלויה בתחום. • פתרון: הגדרת כללים סינטקטיים, אשר יבטיחו כי הנוסחה היא בלתי תלויה בתחום: • קל לבדוק האם נוסחה בטוחה (סינטקטית) או לא • כל נוסחה בטוחה (סינטקטית) היא בלתי תלויה בתחום • נוסחה שאינה תלויה בתחום אינה דווקא בטוחה, אבל תמיד קיימת נוסחה אחרת שקולה לה, שהיא כן בטוחה (סינטקטית). DBMS 236363 שפות שאילתה - DRC
בטיחות – SafeDRC • ביטוי Safe-DRC הוא ביטוי שנוצר לפי הכללים הבאים: • נוסחאות אטומיות בטוחות: • R(x1,…xi) • xi = aכאשר a הינו קבוע. • סגור: • אם F בטוחהו-x משתנה חופשי שלה, אז x F הינה נוסחה בטוחה. • אם F1, F2 בטוחות עם אותם משתנים חופשיים המופיעים במפורש, אז F1 F2 בטוחה. DBMS 236363 שפות שאילתה - DRC
SafeDRC – המשך • סגור (המשך): • אם כל אחת מ- F1 ,F2 ,... Fm ( m > 1)היא אחת מהבאים: • בטוחה • מהצורה Giעבור Gi בטוחה • נוסחאאטומית (בטוחה או לא) אז F1 F2 ... Fm בטוחה אם כל המשתנים החופשיים המופיעים בה הםמתוחמים. DBMS 236363 שפות שאילתה - DRC
SafeDRC – המשך משתנה x הוא מתוחם ב- F1 F2 ... Fm אם הוא מקיים אחד מהתנאים: • x מופיע חופשי ב- Fi שהיא עצמה נוסחא בטוחה (לא בשלילה) • x מופיע ב- Fi, שהיא מהצורה x=y או y=x, כאשר y מתוחם דוגמאות: • הנוסחה x=y איננה בטוחה, כי אין כלל היוצר אותה. • הנוסחה x=12 x=y בטוחה, כי שני המשתנים מתוחמים. DBMS 236363 שפות שאילתה - DRC
SafeDRC – דוגמאות • דוגמא: • הנוסחה r(x,y,z) (p(x,y) q(y,z)) איננה בטוחה, כי ה- מתבצע על נוסחאות עם משתנים חופשיים שונים. • הנוסחה שקולה לנוסחה: r(x,y,z) p(x,y) q(y,z), שהיא בטוחה, ולכן הנוסחה המקורית גם בלתי תלויה בתחום. • דוגמא: מי הם השתיינים שבכל פאב יש בירה שהם אוהבים? {<dn> | pn,bn’ (serves(pn, bn’) dc (drinker(dn, dc)) bn( serves(pn, bn) likes(dn, bn) ) ) dc (drinker(dn, dc))} DBMS 236363 שפות שאילתה - DRC