
CourseID בטבלת התלמידים לא מתאים, כי תלמיד לומד כמה קורסים, ולא מכניסים מערך. עמודה של תלמידים בטבלת הקורסים לא מתאימה מאותה סיבה.StudentID ו-CourseID. מסמנים את שתיהן יחד כמפתח ראשי, כך שהצירוף ביניהן הוא המפתח ולא כל אחת לחוד. לא צריך עמודת מפתח נוספת. שם הטבלה בדוגמה: StudentCourses.Students אל StudentID, ומהמפתח של Courses אל CourseID. אצל התלמידים בוחרים Cascade, כך שמחיקת תלמיד מוחקת רק את הרישומים שלו בטבלת הקשר. אצל הקורסים משאירים No Action, כי לא הגיוני למחוק קורס שמישהו למד.הטקסט המלא של הדקות הראשונות בהרצאה «יצירת טבלת קשר רבים-לרבים ב-SQL» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אנחנו מגיעים לסוג הבא של הטבלאות שקיימות במסדי נתונים. בואו נגיד שאנחנו רוצים לשמור עוד פרט אינפורמציה במכללה שלנו.
יש לנו תלמידים, בואו נסתכל עליהם. הנה אנחנו רואים רשימה של תלמידים. יש לנו קורסים, בואו נסתכל עליהם, נשים אותם אולי רגע פה בצד, אחד ליד השני. הנה התלמידים מול הקורסים של המכללה.
מה אם המכללה באה ואומרת, תקשיבו, אנחנו רוצים גם לדעת איזה תלמיד למד איזה קורס או שעדיין לומד איזה קורס. מה אנחנו אמורים לעשות?
האם אנחנו אמורים ללכת לטבלת התלמידים ולהוסיף פה עוד עמודה שאומרת איזה קורס התלמיד ביצע? נניח עמודה שהיא נקראת קורס איי-די, אבל מה קורה אם התלמיד יכול ללמוד כמה קורסים?
התלמיד יכול ללמוד קורס אחד? לא הגיוני. תלמיד שילמד כמה קורסים, אז מה נכניס בדיוק פה? כל הקודים של הקורסים שהוא למד, הוא למד קורס אחד וקורס שלוש ואנחנו אמרנו שאנחנו לא מוסיפים מערך.
אולי נלך לטבלה הזאת ונעשה פה עוד עמודה של איזה תלמיד למד את הקורס, גם לא הגיוני כי כמובן הרבה תלמידים יכולים ללמוד את הקורס הזה. אז ניחשתם נכון, אנחנו רוצים טבלה נוספת.
הטבלה הזאת בעצם תגיד לנו איזה תלמידים למדו איזה קורס או איזה קורסים למד תלמיד, זה אותו דבר. זה הסוג הרביעי וזאת נקראת association table או join table.
ברוב המקרים קוראים לה association table. association table זו טבלה שבאה בעצם לבצע קשר של רבים לרבים. אנחנו ראינו קשר שנקרא יחיד לרבים, אבל במקרה הזה זה בעצם סוג של קשר שנקרא רבים לרבים.
למה? כי כל תלמיד יכול ללמוד כמה קורסים. אז כאילו שהיינו רוצים להגדיר פה את כל הקורסים שלו.
וקורס יכול להילמד על ידי כמה תלמידים, כאילו שפה היינו רוצים להגדיר את כל התלמידים שלו. אנחנו לא רוצים את העמודות האלה, אז אנחנו יוצרים טבלה נוספת ומקשרים אותה לשתי הטבלאות האלה.
זה קשר רבים לרבים, כאשר הקשר רבים לרבים הוא קשר רעיוני או קשר לוגי. הוא לא באמת קיים בין הטבלה הזאת לטבלה הזאת בצורה ישירה.
אנחנו מוסיפים טבלה נוספת, בואו נוסיף אותה. והטבלה הזאת, סך הכל מה שהיא אומרת לנו זה איזה תלמיד לומד איזה קורס.
איך היא אומרת את זה? על ידי שתי המפתחות studentid זה יהיה int, ובואו נגדיר שזה לא הלאו-נאו כמובן, מול קורס איי-די שזה גם כן אינט, נגדיר פה אינט וזה לא עלה או נעל ועכשיו אנחנו רוצים שיהיה לנו כאן בעצם את המפתח הראשי. אמרנו כל טבלה מכילה מפתח ראשי אבל סטודנט איי-די זה לא מפתח ראשי כי יכול להיות שאנחנו מגדירים פה סטודנט איי-די אחד כמה פעמים כי הוא עשה הרבה קורסים אז זה לא
יכול להיות מפתח ראשי. קורס איי-די לא יכול להיות מפתח ראשי מפני שמספר תלמידים למדו את אותו קורס איי-די. קורס איי-די 8 נלמד על ידי כמה תלמידים, אבל התשלובת ביניהם ביחד לא אמורה לחזור על עצמה.
כי אנחנו לא נגיד שתלמיד אחד למד קורס 8 ואז תלמיד אחד עוד פעם למד קורס 8. נניח שזה לא הגיוני, תלמיד לומד קורס פעם אחת. אז אנחנו מסמנים את שתיהם על ידי קונטרול ומגדירים פריימרי.
שניהם הופכים להיות פריימריקי. מה זה אומר? זה אומר שהתשלובת ביניהם היא מפתח ראשי. לא כל אחד מהם בנפרד, התשלובת ביניהם.
אנחנו לא צריכים להגדיר עוד עמודה שהיא מפתח ראשי. זה מספיק לנו עבור הטבלה והשם שלה כמובן יכול להיות כל שם. בואו נגדיר studentcourses כי זה בעצם קורסים שעשה תלמיד.
אז הרבה תלמידים יכולים להיות פה ולהגדיר את הדבר הזה. הדבר הבא שאנחנו רוצים לעשות זה את הקשרים עצמם. בואו ניגש לדיאגרם שלנו, מקש ימני, Add table, הנה הטבלה, בואו נוסיף אותה, נסגור את החלון, ומה שאנחנו רוצים טיפה אולי נזיז את זה ואת זה לפה,
והנה יש לנו קורסים, הנה יש לנו student courses ומה שאנחנו רוצים לעשות זה קשר בין students לסטודנט קורסס וקורסס לבין סטודנט קורסס מהטבלה שמחזיקה את המפתח הראשי במקרה הזה לדוגמה סטודנט מחזיקה סטודנט איי-די והוא הראשי ואנחנו גוררים אותו על סטודנט
איי-די הזה שכשדה בודד הוא לא מפתח ראשי הוא הופך להיות מפתח קליק, אני לא עוזב, גורר, ועכשיו אני עוזב. אז הוא שואל אותי כאן את השאלה, קודם כל הוא אומר לי פריימרי זה סטודנט, סטודנט איי-די, פורן זה סטודנט קורסס, סטודנט איי-די, נגיד לו אוקיי, ואז נגדיר לו את הקשר הזה.
והשאלה היא כזאת, אם אנחנו מוחקים תלמיד,