300 likes | 577 Views
מודל היחסים. The Relational Model. למה דווקא מודל זה?. מודל היחסים הינו ביסוד של כל DBMS בשימוש כיום הדברים שנלמד בהרצאות הינם נצר כ ים לשימוש בכל DBMS סיבות להצלחה של מודל היחסים : מודל פשוט: כל הנתונים בטבלאות מאפשר להביע שאילתות בשפה בעלת פשטות ועצמה: SQL
E N D
מודל היחסים The Relational Model
למה דווקא מודל זה? • מודל היחסים הינו ביסוד של כל DBMS בשימוש כיום • הדברים שנלמד בהרצאות הינם נצרכים לשימוש בכל DBMS • סיבות להצלחה של מודל היחסים: • מודל פשוט: כל הנתונים בטבלאות • מאפשר להביע שאילתות בשפה בעלת פשטות ועצמה: SQL • מאפשר ביצוע שאילתות מתוחכמות תוך זמנים קצרים
דוגמה של בסיס נתונים במודל היחסים • שבוע שעבר ראינו דוגמה פשוטה של בסיס נתונים במודל היחסים: • עכשיו נראה דוגמה יותר מפותחת עם ארבע טבלאות • יש לטבלה מֻנָּח פורמלי הבא מתורת הקבוצות: יחס (באנגלית: Relation) • מכאן מודל היחסים שפירושו מודל הטבלאות
נתונים וסכמה במודל היחסים Data and Schema in the Relational Model
סכמה לעומת נתונים • סכמה מתארת את מה הנתונים מיצגים: • סוגי ישויות בעולם • למשל: סטודנטים, מחלקות, קורסים • קשרים בין סוגי ישויות שונים • למשל: קיים קשר בין סטודנט לבין הקורסים שהוא לומד • אילוצים שצריכים להתקיים תמיד • למשל: סטודנט לא יכול ללמוד קורס שלא קיים • וכו' (נלמד יותר פרטים בהמשך) • על פי רוב, מגדירים את הסכמה בהתחלה (לפני שמכניסים נתונים ראשונים) והיא לא משתנה הרבה • בניגוד לזה, הנתונים משתנים הרבה. דוגמאות הנתונים: • יוסי הינו סטודנט של שנה ב' • יוסי לומד בסיסי נתונים
נתונים במודל היחסים • הנתונים שמורות בשורות ועמודות של הטבלה • לשורות מכנים רשומות (באנגלית: Tuples) • לעמודות מכנים אטריבוטים (באנגלית: Attributes) אושדות • כל שורה בטבלה מתארת: • ישות (קורס בדוגמה) ו\או • קשר בין שתיים או יותר ישויות (קשר בין קורס למחלקה בדוגמה) • כל פריט ברשומה נקרא ערךשל אטריבוט • למשל, הערך של אטריבוט "מס' נקודות" עבור בסיסי נתונים הוא 3
ערכים צריכים להיות אטומיים • כלל: שאילתות לא יכולות לחפש נתונים לפי קריטריונים המתייחסים לחלקים של ערכים • דוגמה: עם יש אטריבוט "רשימת קורסים שהסטודנט למד", אז אין אפשרות להגיש שאילתה "האם סטודנט ראובן למד קורס בסיסי נתונים?" • במילים אחרות: ערכים צריכים להיות אטומיים • כלומר, ביצוע שאילתות עף פעם לא יחייב בדיקת חלק של ערך אטריבוט • יש יציאות מכלל זה ונראה אותם בהמשך הקורס • בדיקת הבנה: האם רשימה של קורסים שהסטודנט למד יכולה להיות ערך אטומי?
-- ערך מיוחדNULL • NULL הינו ערך מיוחד שמתאים לכל טיפוס • לכן הוא יכול להופיע בכל אטריבוט (חוץ מהמקרים שנפרט בהמשך) • לערך NULL יש אחת משתי משמעויות: • הערך האמתי לא ידוע • דוגמה: הסטודנט עדיין לא נבחן ולכן הציון הסופי בקורס לא ידוע • האטריבוט אינו בר-יישום (not applicable) לרשומה הספציפית • דוגמה: אין מבחן אמצע בקורס • רושמים לפעמים (null)
סכמה במודל היחסים • לכל טבלה יש שם מתאים • יש נוהגים לתת שם בלשון יחיד (כמו COURSE). • לכל אטריבוט יש שם וטיפוס ("POINTS" הינו integer)
אילוצים בסכמה • חלק חשוב בסכמה הינו אילוצים • אילוצים משקפים חוקים בתחום או מדיניות הארגון שעבורו מעצבים את בסיס הנתונים • דוגמאות האילוצים: • אף קורס לא יכול להעניק יותר מ-4 נקודות • לא יכולים להיות שני קורסים עם שם אחד באותה מחלקה • כל קורס שייך למחלקה • שני סוגי אילוצים האחרונים הינם מאד חשובים ונדבר אליהם בנפרד
אילוצי מפתח מפתח, מפתח ראשי מפתח זר
מפתח ומפתח ראשי • מפתח הינו קבוצה של אטריבוטים כזאת שנתינת ערכים לכל האטריבוטים בקבוצה מזהה את הרשומה באופן ייחודי • דוגמה: הקבוצה {Student ID}הינה מפתח • אנחנו נדבר בדרך קצרה ופחות פורמלית: "Student ID" הינו מפתח
דוגמה של מפתח בן כמה אטריבוטים • מה הוא המפתח של טבלת הקורסים? במה תלויה התשובה? • אם קורס עם אותו שם יכול להימסר בשתי מחלקות אז... • אם כל קורס נמסר רק במחלקה אחת אז...
מפתח לעומת מפתח ראשי • מה הם המפתחות בטבלת המחלקות: • תמיד בוחרים מפתח אחד בשם מפתח ראשי • מסמנים ע"י קו תחתי • בדוגמה שלנו זה "DEPT_ID" • אטריבוטים של מפתח ראשי לא יכולים לקבל ערך של NULL
שמושים של מפתח ראשי • למפתח ראשי יש כמה שימושים חשובים: • בהינתן ערכים של אטריבוטים במפתח ראשי, DBMS יכולה למצוא את הרשומה המתאימה מאד מהר. • למשל: אם ידוע מס' סטודנט, אפשר מאד מהר לשלוף את כל המידע עבור סטודנט זה. • אפשר לקשר רשומות בשתי טבלאות על ידי מפתח ראשי. על זה נדבר בשקופית הבאה.
מפתח זר • נשים לב איך שתי הטבלאות הבאות קשורות: • קורס מקושר למחלקה על ידי מפתח ראשי של מחלקה • למשל: C++ הינו קורס של מחלקת CS • אפשר בקלות לדעת את כל השאר דברים על מחלקת CS, כי DEPT_ID הינו מפתח ראשי של טבלת המחלקות • האטריבוטDEPT_ID בטבלת הקורסים הינו מפתח זר המצביע לטבלת המחלקות (טבלת אב) (טבלת בן)
הערות חשובות על מפתח זר • חשוב: יש צורך להודיע ל-DBMS שאטריבוט או אטריבוטים מסוימים הינם בעצם מפתח זר המצביע לטבלה אחרת. • כי בלי זה ה-DBMS לא תבדוק אילוץ מפתח זר ויתאפשרו טעויות מסוג זה: D
הערות חשובות על מפתח זר • אם מפתח ראשי בטבלת אב מורכב מכמה אטריבוטים, אז מפתח זר גם צריך להיות מורכב מכמה אטריבוטים במקביל
הפרות של אילוץ מפתח זר • קיימים כמה סוגי הפרה של אילוץ מפתח זר. נסביר אותם דרך דוגמה: • בקשה להוסיף רשומה חדשה לטבלת ציונים ובה ערך של Student_ID שלא מופיע בטבלת סטודנטים. • בקשה לשנות ערך של Student_ID ברשומה קיימת בטבלת ציונים כך שהערך החדש לא מופיע בטבלת סטודנטים • בקשה למחוק סטודנט או לשנות ID של סטודנט בטבלת סטודנטים וקיימים ציונים עבור אותו סטודנט. • תוצאה: רשומה אחת או יותר בטבלת ציונים "תלויים באויר" (dangling” tuples") יטופל באחד הדרכיםהבאות... DBMS לא תרשה!
דרך א': RESTRICT (למנוע שינוי) • אם נבחר בדרך זו: • ה-DBMS יסרב למחוק סטודנט אם יש ציונים עבורו • ה-DBMS יסרב לשנות ID של סטודנט אם יש ציונים עבורו
דרך ב': CASCADE (אפקט האשד) • אם נבחר בדרך זו: • ה-DBMS ימחק את כל הציונים עבור סטודנט הנמחק • ה-DBMS ישנה ID של סטודנט בכול רשומות הציונים שלו • האופציה הזאת לא קיימת ב-ORACLE
דרך ג': ) SET NULLלשים (NULL • אם נבחר בדרך זו: • ה-DBMS ישים Student_ID של NULL בכול רשומות הציונים של סטודנט הנמחק • ה-DBMS ישים Student_ID של NULL בכול רשומות הציונים של סטודנט שID- שלו השתנה • האופציה הזאת לא קיימת ב-ORACLE
קשרים: יחידלרבים ורבים לרבים One-To-Many and Many-To-Many Relationships
קשר יחיד לרבים • נתבונן שוב פעם על הקשר בין קורסים ומחלקות: • זהו קשר יחיד לרבים: בכל מחלקה יכולים להיות הרבה קורסים, אבל כל קורס שייך למחלקה אחת • היה מספיק להוסיף מפתח זר בצד של רבים
קשר רבים לרבים • נתבונן על הקשר שבין סטודנטים לקורסים • כל סטודנט יכול ללמוד הרבה קורסים • בכל קורס לומדים הרבה סטודנטים • זהו קשר רבים לרבים • האם נוכל להביע את הקשר בטבלאות אלו עצמם? • כן, אבל נצטרך לשכפל הרבה מידע וזה תמיד לא טוב (על זה נדבר בעומק בהרצאה אחרת) • אנחנו צריכים ליצור טבלה מיוחדת בשביל הקשר • בבסיס נתונים של הדוגמה טבלה כזאת קיימת: ציונים! • בטבלת הציונים יש מפתח זר עבור סטודנט ומפתח זר עבור קורס. • בעצם, כל רשומה היא קשר בין סטודנט לקורס!
עוד דוגמה של קשר רבים לרבים • נניח שדרוש בסיס נתונים לשמור נתונים על בקשות קבלה לישיבה גדולה: • עבור כל ישיבה שומרים את שם הישיבה, עיר, ומספר המקומות שנשארו • עבור כל תלמיד שומרים מס' זהות, שם, טלפון ולאילו ישיבות הוא רוצה להתקבל • אילו טבלאות ניצור בהנחה שיכולות להיות כמה ישיבות עם אותו שם בערים שונות, אבל לא באותה עיר? • תשובה: • {"Z_T"} הינו מפתח זר המצביע לטבלת TALMID • {"NAME_Y", "CITY_Y"} הינו מפתח זר המצביע לטבלת YESHIVA
בסיסי נתונים לעומת גיליונות אלקטרוניים Databases versus Spreadsheets
מתי משתמשים בגיליונות אלקטרוניים • היעודים של בסיסי נתונים (כמו ב-ORACLE) ושל גיליונות אלקטרוניים (כמו ב-EXCEL) הינם מאד שונים • חשוב לדעת לבחור את הכלי הנכון עבור המשימה שלפנינו • נשתמש בגיליונות אלקטרוניים כאשר: • יש לנו נתונים שנכנסים לאחת או כמה טבלאות בלי קשרים ביניהם • יש לנו מודל עם פרמטרים של איזו תופעה או תהליך ואנחנו רוצים לדעת מהר תשובה לשאילה מסוג: "מה יהיה אם נגדיל פרמטר פלוני?" • למשל: המכונה מיד אחרי טיפול מייצרת 1000 חלקים כל יום. כל חלק נמכר ב 3 ₪. אם לא מטפלים במכונה, הייצור יורד ב-50 חלקים ביום כל חודש. הטיפול עולה 20,000 ₪. נכון לעכשיו מבצעים טיפול פעם בחצי שנה. יש לנו רשימת רווחים ל-5 שנים אחרונות. איך ובכמה הרווחים ישתנו אם נטפל במכונה כל חודשיים?
מתי משתמשים בבסיסי נתונים • נשתמש בבסיסי נתונים כאשר: • הנתונים מצריכים הרבה טבלאות עם קשרים ביניהם • נצטרך לעבד כמויות גדולות של נתונים • נצטרך לאפשר גישה לנתונים בו-זמנית למספר רב של משתמשים • נצטרך לבצע שאילתות מסובכות כדי לשלוף או לעדכן נתונים