תרשימי E-R ונורמליזציה
הוצג| English | משמעות |
|---|---|
| entity-relationship diagram/ˈentɪti rɪˈleɪʃənʃɪp ˈdaɪəɡræm/ | דיאגרמת אובייקט-מאפיין |
| normalisation/ˌnɔːməlaɪˈzeɪʃn/ | נורמליזציה |
| entity/ˈentɪti/ | אובייקט |
| cardinality/ˌkɑːdɪˈnælɪti/ | קרדינליות |
| one-to-many/wʌn tə ˈmeni/ | אחד-ל-rabim |
| many-to-many/ˈmeni tə ˈmeni/ | רב-לרב |
| link table/lɪŋk ˈteɪbl/ | טבלת חיבור |
| normal forms/ˈnɔːml fɔːmz/ | צורות נורמליות |
| atomic/əˈtɒmɪk/ | אטומי |
| transitive dependency/ˈtrænsɪtɪv dɪˈpendənsi/ | תלות מעבר |
ארבעים שורות לשנות מספר טלפון אחד
- בית ספר שומר את הרשומות שלו בספריית מחשב אחת. כל שורה היא תלמיד אחד בקורס אחד, וכל שורה כוללת גם את המדריך של התלמיד וגם את מספר הטלפון של המדריך.
- המדריך משנה את מספרה. ארבעים שורות צריכות לערוך. תשעים ושמונה עריכים. עבור שארית השנה, רשימת קורס אחת מתקשרת עם זר.
- לא טייפו דבר שגוי. התקלה הייתה בעיצוב: עובדה ששייכת למדריך אוכסה פעם אחת לכל רשומה, ולכן היא יכולה להיות נכונה במקום אחד ושגויה באחר.
- שיעור זה עוסק בכלי העיצוב שניים המונעים זאת: תרשים אישיות-יחסים, שמצייר את המבנה, ונורמליזציה, שמסירה את החזרות.
תרשימי אישיות-יחסים
- תרשים אישיות-יחסים (E-R diagram) תיעוד עיצוב מאגר נתונים: כל אישיות היא מלבן, כל יחס הוא קו בין שני מלבנים, ו-הקרדינליות מסומנת בקצה כל אחד.
- בסימון כף עורב קו יחיד פירושו "אחד" וכף בעלת שלושה פרקים פירושו "רבים". קראו כל קו בשתי הכיוונים: כל לקוח מניב רבות הזמנות; כל הזמנה מוגשת על ידי לקוח אחד.
- התרשים מצויר לפני שטבלה כלשהי נוצרת, והיחסים עליה הופכים למפתחות זרים.

מלבן אחד לכל אישיות, קו אחד לכל יחס

קו לאחד, כף לרבים
בתרשים E-R, המספר של אנטיות אחת שיכולות לקשר לאחת משני האחרות, המסומן בקצה כל קו, הוא ה-____.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
קרדינליות היא אחת או רבים בכל קצה; סימון הרגל עור (crow's-foot) מצייר מקש לאחד ורגל לרבים.
שלושה סוגי יחסים
- אחד-לאחד (1:1): כל חבר יש לו כרטיס אחד בספרייה וכרטיס אחד שייך לחבר אחד. נדיר; שתי האישיות לעיתים קרובות משולבות בטבלה אחת.
- אחד-לרבים (1:M): לקוח אחד מבצע הזמנות רבות; כל הזמנה שייכת ללקוח אחד. מיושם על ידי הכנסת המפתח הראשוני של צד "האחד" לתוך טבלת צד "הרבים" כמפתח זר.
- רבים-לרבים (M:N): סטודנט לומד קורסים רבים וקורס בעל סטודנטים רבים. אי אפשר לממש זאת ישירות; נדרשת טבלת חיבור.
לקוח אחד יכול לבצע הזמנות רבות, אך כל הזמנה שייכת ללקוח אחד. קשר זה הוא:
Difficulty 1/5 · 100 coins + a small bonus on first completion today
לקוח אחד → הזמנות רבות, כל הזמנה → לקוח אחד: יחס אחד-לרבים.
התאם כל יחס לקרדינליות המתאימה לו.
Difficulty 2/5 · 140 coins + a small bonus on first completion today
1:1 צד אחד יש לו אחד; 1:M צד אחד יש לו רבים; M:N לשני הצדדים יש רבים (נדרשת טבלת חיבור).
דוגמה פתורה: ציור דיאגרמת E-R
- בבית ספר יש מורים, כיתות וסטודנטים. כל מורה מורה לכיתות רבות; כל כיתה מודרכת על ידי מורה אחד. לכל כיתה יש סטודנטים רבים; כל סטודנט נמצא בכיתה אחת. סטודנטים עשויים להצטרף למועדונים רבים וכל מועדון כולל סטודנטים רבים.
- ארבעה מלבנים:
TEACHER,CLASS,STUDENT,CLUB.TEACHER—CLASSהוא אחד-לרבים, הקצה הרב ב-CLASS.CLASS—STUDENTהוא אחד-לרבים, הקצה הרב ב-STUDENT.STUDENT—CLUBהוא רבים-לרבים, קצה רב בשני הצדדים. - הסימנים: כל אנטיות קיימות, כל יחסים מצוירים, וסמל הקרדינליות הנכון בכל אחד מקצוות. קו ללא סימנים הוא חצי תשובה.
טבלות חיבור
- יחס רבים-לרבים מתפצל לשני יחסי אחד-לרבים באמצעות טבלת חיבור המחזיקה את שני המפתחים הזרים.
ENROLMENT(StudentID, CourseID, EnrolmentDate): סטודנט אחד יש לו רישום רבים, קורס אחד יש לו רישומים רבים, וכל שורה מייצגת סטודנט אחד בקורס אחד. המפתח הראשוני שלה הוא קומפוזיטי של שני המפתחים הזרים.- נתונים על ההתאמה עצמה, התאריך, ציון, נכנסים לטבלת החיבור; נתונים על הסטודנט או הקורס נשארים בטבלה שלהם.

יחס רבים-לרבים הופך לשני יחסי אחד-לרבים
כיצד מיישמים יחס רבים-לרבים במאגר נתונים יחסי?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
טבלת חיבור (צומת) מכילה מפתח חיצוני לכל צד, וממירה יחס M:N לשני יחסי 1:M.
ENROLMENT(StudentID, CourseID, EnrolmentDate) היא טבלת חיבור. אילו statements נכונים? סמן את כולם החלים.
Difficulty 2/5 · 140 coins + a small bonus on first completion today
טבלת הקשרים מכילה את הזוגיות ואת העובדות הקשורים אליה. הנתונים של הסטודנט עצמו נשארים ב-STUDENT, אחרת הם יחזרו בכל הרשמה.
נורמליזציה
- נורמליזציה מארגנת את הטבלות כך שכל עובדה מאוחסת בדיוק פעם אחת, ומפחיתה כפילות ואי-עקביות. היא עוברת דרך צורות הנורמליזציה בסדר: ראשונה, שנייה, שלישית.
- ההליך: למצוא את האנטיות והאטריבוטות שלהן; לבחור מפתח ראשוני לכל אחת; להסיר קבוצות חוזרות וערכים לא-אטומיים (1NF); להסיר אטריבוטות שתלויות רק בחלק ממפתח קומפוזיטי (2NF); להסיר אטריבוטות שתלויות באטריבוט אחר שאינו מפתח (3NF); להוסיף מפתחים זרים ליחסים.
- העלות היא יותר טבלות ויותר חיבורים (joins). בבחין נדרש 3NF.
מעבדת שירות בסיסי נתונים
צפה כיצד DBMS הופך שאלה לגישה במוגנת לשיתוף נתונים.
סדרו את הצורות הנורמליות לפי סדר היישום שלהן.
Difficulty 3/5 · 200 coins + a small bonus on first completion today
מגיעים ל-3NF על ידי מעבר דרך 1NF ואז 2NF — כל שלב נוסף על הקודם.
המטרה המרכזית של נורמליזציה היא:
Difficulty 1/5 · 100 coins + a small bonus on first completion today
נורמליזציה ל-3NF מאחסנת כל עובדה פעם אחת, ומסירה אנומליות עדכון/הכנסה/מחיקה (עלות זה ג'וינטים נוספים).
צורה נורמלית ראשונה
- טבלה נמצאת ב-1NF כאשר כל שדה מכיל ערך אטומי יחיד, אין קבוצות חוזרות, ויש מפתח ראשוני.
STUDENT(StudentID, Name, Phone)עםPhoneהמכיל0123, 0456אינו אטומי.STUDENT(StudentID, Name, Course1, Course2, Course3)מכיל קבוצה חוזרת.- לפתור את שניהם על ידי העברת הנתונים החוזרים לטבלה משלה עם שורה עבור כל ערך:
STUDENT_PHONE(StudentID, Phone),ENROLMENT(StudentID, CourseID).
שדה טלפון מכיל "0123, 0456" לסטודנט אחד. באיזה צורה נורמלית הכשל מתרחש?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
שתי ערכים בתא אחד הוא הכשל ב-1NF. העבירו את המספרים ל-STUDENT_PHONE(StudentID, Phone), אחד לכל שורה.
דוגמה פתורה: צורה נורמלית שנייה
ORDER(OrderID, CustomerID, CustomerName, ProductID, Quantity)יש מפתח ראשי מורכב(OrderID, ProductID). האם הוא בצורת 2NF?- בדיקה כל שדה שאינו מפתח מול המפתח כולו.
Quantityתלוי גם ב-OrderIDוגם ב-ProductID: איזה סדר, איזה מוצר. בסדר. CustomerIDו-CustomerNameתלויים רק ב-OrderID, שהוא רק חלק מהמפתח: תלות חלקית, ולכן הטבלה אינה בצורת 2NF. יש לפרק אותה:ORDER(OrderID, CustomerID, CustomerName)ו-ORDER_LINE(OrderID, ProductID, Quantity).
דוגמה פתורה: צורה נורמלית שלישית
- האם
ORDER(OrderID, CustomerID, CustomerName)בצורת 3NF? - טבלה היא בצורת 3NF כאשר היא בצורת 2NF וככל שדה שאינו מפתח תלוי רק במפתח הראשי, ולא בשדה שאינו מפתח אחר.
CustomerNameתלוי ב-CustomerID, שאינו המפתח: תלות מעבר, ולכן הטבלה אינה בצורת 3NF. - פירוק נוסף:
ORDER(OrderID, CustomerID)ו-CUSTOMER(CustomerID, CustomerName), כאשרCustomerIDהוא מפתח חיצוני. השם מאוחסן פעם אחת, בין אם הלקוח ביצע הזמנה אחת או עשרות.

כל צורה מסירה סוג אחד של תלות
נורמליזציה ל-3NF מאחסנת כל עובדה פעם אחת ומסירה אנומליות עדכון, בעלות של טבלאות וג'וינטים נוספים.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
הפיצול הזה — נתונים נקיים מול ג'וינטים נוספים — הוא הסיבה ש-3NF היא המטרה המקובלת.
הסבר מדוע טבלה היא או אינה בצורת 3NF
- לא בצורת 3NF: ציין את התלות. "
TEACHERאינו בצורת 3NF כי התכונה שאינה מפתחDepartmentNameתלויה בתכונה שאינה מפתחDepartmentID, ולא במפתח הראשי." - בצורת 3NF: כיסוי כל שלושת התנאים. "כל תכונה היא אטומית ללא קבוצות חוזרות; אין תלות חלקית בחלק מהמפתח; כל תכונה שאינה מפתח תלויה רק במפתח הראשי, ללא תלות מעבר."
- לאחר מכן, אם נשאל, נתן את הטבלות הנורמליות בסימון הסטנדרטי עם המפתחים החיצוניים מסומנים.
בטבלת TEACHER(TeacherID, Name, DepartmentID, DepartmentName), מדוע הטבלה אינה ב-3NF?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
זו תלות טרנזיטיבית. יש להפריד את DEPARTMENT(DepartmentID, DepartmentName) ולשמור על DepartmentID בטבלת TEACHER כמפתח זר.
סימונים נופלים מהיד
- 2NF היא שאלה רק כאשר המפתח הראשי הוא מורכב. מפתח בעל שדה אחד אינו יכול להיות בעל תלות חלקית.
- 3NF דורש 2NF. יש לציין את שניהם בהצדקה.
- אטומי פירושו ערך אחד לתא. "שני מספרי טלפון בשדה אחד" הוא כשל ב-1NF, ולא ב-3NF.
- קביעת שם הצורה הנורמלית אינה התשובה; קביעת ה-תלות היא. יותר טבלות לאחר הנורמליזציה הוא המטרה, ולא פגם.
הבנתך מושלמת
- דיאגרמת E-R מציגה אובייקטים כמלבונים ויחסים כקווים עם קרדינליות בכל קצה: 1:1, 1:M, M:N
- יחס רבים-לרבים מאוחסן באמצעות טבלת קישור של שני המפתחות הזרים, ומפתח היסוד שלה הוא ההרכבה שלהם
- 1NF ערכים אטומיים, ללא קבוצות חוזרות, מפתח ראשי · 2NF תלות חלקית נעדרת על חלק ממפתח הרכוב · 3NF תלות מעבר נעדרת בין מאפיינים שאינם מפתחים
- נמקו על ידי ציון שם התלות, ולאחר מכן ספקו את הטבלות המפורקות עם המפתחות הזרים שלהן