נוצר קשר בין שתי טבלאות מסד נתונים כאשר טבלה אחת משתמשת במפתח זר המפנה למפתח הראשי של טבלה אחרת. זהו הרעיון הבסיסי מאחורי המונח מסד נתונים יחסי.
איך מפתח זר עובד כדי ליצור מערכת יחסים
מפתח ראשי מזהה באופן ייחודי כל רשומה בטבלה. זהו סוג של מפתח מועמד שהוא בדרך כלל העמודה הראשונה בטבלה וניתן להפיק אותו באופן אוטומטי על ידי מסד הנתונים כדי להבטיח שהוא ייחודי. מפתח זר הוא מפתח מועמד אחר (לא המפתח הראשי) המשמש לקישור רשומה לנתונים בטבלה אחרת.
לדוגמה, שקול את שתי הטבלאות האלה שמזהות איזה מורה מלמד איזה קורס. כאן, המפתח הראשי של טבלת הקורסים הוא Course_ID. המפתח הזר שלו הוא Teacher_ID:
Course_ID | Course_Name | Teacher_ID |
---|---|---|
Course_001 | ביולוגיה | Teacher_001 |
Course_002 | מתמטיקה | Teacher_002 |
Course_003 | אנגלית | Teacher_003 |
אתה יכול לראות שהמפתח הזר בקורסים תואם למפתח ראשי במורים:
Teacher_ID | Teacher_Name |
---|---|
Teacher_001 | Carmen |
Teacher_002 | ורוניקה |
Teacher_003 | Jorge |
אנו יכולים לומר שמפתח הזר Teacher_ID עזר ליצור קשר בין הקורסים לטבלאות המורים.
סוגי קשרי מסד נתונים
באמצעות מפתחות זרים, או מפתחות מועמדים אחרים, ניתן ליישם שלושה סוגים של קשרים בין טבלאות:
אחד לאחד
סוג קשר זה מאפשר רק רשומה אחת בכל צד של הקשר. המפתח הראשי מתייחס לרשומה אחת בלבד (או אף אחת) בטבלה אחרת. לדוגמה, בנישואין, לכל אחד מבני הזוג יש רק בן זוג אחד אחר. סוג זה של קשר יכול להיות מיושם בטבלה בודדת ולכן אינו משתמש במפתח זר.
אחד לרבים
קשר של אחד לרבים מאפשר לרשומה בודדת בטבלה אחת להיות קשורה לרשומות מרובות בטבלה אחרת. שקול עסק עם מסד נתונים הכולל טבלאות לקוחות והזמנות.
לקוח בודד יכול לרכוש מספר הזמנות, אך לא ניתן היה לקשר הזמנה בודדת למספר לקוחות. לכן טבלת ההזמנות תכיל מפתח זר שתואם למפתח הראשי של טבלת הלקוחות, בעוד שלטבלת הלקוחות לא יהיה מפתח זר המצביע לטבלת ההזמנות.
רבים-לרבים
זהו קשר מורכב שבו רשומות רבות בטבלה יכולות לקשר לרשומות רבות בטבלה אחרת. לדוגמה, העסק שלנו כנראה זקוק לטבלאות לקוחות והזמנות, וכנראה גם צריך טבלת מוצרים.
שוב, הקשר בין טבלת הלקוחות וההזמנות הוא אחד לרבים, אך קחו בחשבון את הקשר בין טבלת ההזמנות והמוצרים. הזמנה יכולה להכיל מספר מוצרים, ומוצר יכול להיות מקושר למספר הזמנות מכיוון שמספר לקוחות עשויים להגיש הזמנה המכילה חלק מאותם מוצרים. קשר מסוג זה דורש לפחות שלוש טבלאות.
למה חשובים קשרי מסד נתונים?
יצירת קשרים עקביים בין טבלאות מסד נתונים עוזרת להבטיח שלמות הנתונים, ותורמת לנורמליזציה של מסד הנתונים. לדוגמה, מה אם לא קישרנו שום טבלאות באמצעות מפתח זר ובמקום זאת שילבנו את הנתונים בטבלאות הקורסים והמורים, כך:
Teacher_ID | Teacher_Name | קורס |
---|---|---|
Teacher_001 | Carmen | ביולוגיה, מתמטיקה |
Teacher_002 | ורוניקה | מתמטיקה |
Teacher_003 | Jorge | אנגלית |
עיצוב זה אינו גמיש ומפר את העיקרון הראשון של נורמליזציה של מסד הנתונים, First Normal Form, הקובע שכל תא טבלה צריך להכיל פיסת נתונים בודדת ובדידה.
או אולי החלטנו להוסיף שיא שני לכרמן, כדי לאכוף את 1NF:
Teacher_ID | Teacher_Name | קורס |
---|---|---|
Teacher_001 | Carmen | ביולוגיה |
Teacher_001 | Carmen | מתמטיקה |
Teacher_002 | ורוניקה | מתמטיקה |
Teacher_003 | Jorge | אנגלית |
זה עדיין עיצוב חלש, שמציג כפילות מיותרת ומה שנקרא חריגות בהכנסת נתונים, מה שאומר שהוא עלול לתרום לנתונים לא עקביים.לדוגמה, אם למורה יש מספר רשומות, מה קורה אם יש צורך לערוך נתונים, אך האדם שמבצע את עריכת הנתונים אינו מבין שקיימים מספר רשומות? לאחר מכן, הטבלה תכיל נתונים שונים עבור אותו אדם, ללא כל דרך ברורה לזהות אותו או להימנע ממנו.
פיצול טבלה זו לשתי טבלאות, מורים וקורסים, יוצר את הקשר הנכון בין הנתונים ולכן עוזר להבטיח עקביות ודיוק נתונים.