Skip to main content

תלות טרנזיטיבית במסד נתונים

ארז שיינר מציג - יחסי שקילות (יוני 2026)

ארז שיינר מציג - יחסי שקילות (יוני 2026)
Anonim

תלות טרנזיטיבית במסד נתונים היא מערכת יחסים עקיפה בין ערכים באותו טבלה שגורמת לתלות פונקציונלית. כדי להשיג את תקן הנורמליזציה של טופס רגיל שלישי (3NF), עליך לבטל כל תלות טרנזיטיבית.

מטבעו, תלות טרנזיטיבית דורשת שלוש תכונות או יותר (או עמודות מסד נתונים) בעלות תלות פונקציונלית ביניהן, כלומר, עמודה A בטבלה נשענת על עמודה B באמצעות עמודה C ביניים.

בואו נראה איך זה יכול לעבוד.

דוגמת תלות טרנזיטיבית

מחברים

מחבר_IDמחברספרמחבר_לאומיות
Auth_001אורסון סקוט קארדהמשחק של אנדרארצות הברית
Auth_001אורסון סקוט קארדהמשחק של אנדרארצות הברית
Auth_002מרגרט אטוודסיפורו של המשרתת /קנדה

בדוגמה AUTHORS שלמעלה:

  • ספר → מחבר : הנה ה ספר תכונה קובע את מחבר תכונה. אם אתה יודע את שם הספר, אתה יכול ללמוד את שם המחבר. למרות זאת, מחבר אינו קובע ספר , כי סופר יכול לכתוב ספרים מרובים. לדוגמה, רק בגלל שאנחנו יודעים את שמו של המחבר אורסון סקוט כרטיס, אנחנו עדיין לא יודעים את שם הספר.
  • מחבר → מחבר_לאומיות : כמו כן, מחבר תכונה קובע את מחבר_לאומיות , אבל לא להיפך; רק בגלל שאנחנו יודעים את הלאום לא אומר שאנחנו יכולים לקבוע את המחבר.

אבל טבלה זו מציגה תלות טרנזיטיבית:

  • ספר → Author_Nationality: אם אנחנו יודעים את שם הספר, אנחנו יכולים לקבוע את הלאום באמצעות טור המחבר.

הימנעות תלות טרנזיטיבית

כדי להבטיח צורה שלישית רגילה, הבה נסיר את התלות הטרנזיטיבית.

אנו יכולים להתחיל על ידי הסרת העמודה 'ספר' מתוך הטבלה 'מחברים' ויצירת טבלה נפרדת 'ספרים':

ספרים

Book_IDספרמחבר_ID
Book_001המשחק של אנדרAuth_001
Book_001ילדי הנפשAuth_001
Book_002סיפורו של המשרתת /Auth_002

מחברים

מחבר_IDמחברמחבר_לאומיות
Auth_001אורסון סקוט קארדארצות הברית
Auth_002מרגרט אטוודקנדה

האם זה לתקן את זה? כעת נבחן את יחסי התלות שלנו:

טבלאות ספרים:

  • Book_ID → ספר: ה ספר תלוי ב Book_ID .
  • אין עוד תלות בטבלה זו, אז אנחנו בסדר. שים לב כי המפתח הזר מחבר_ID מקשר את הטבלה לטבלה AUTHORS באמצעות המפתח הראשי שלה מחבר_ID . יצרנו מערכת יחסים כדי למנוע תלות טרנזיטיבית, עיצוב מפתח של מסדי נתונים יחסיים.

טבלאות מחברים:

  • מחבר_ID → מחבר: ה מחבר תלוי ב מחבר_ID .
  • מחבר → Author_Nationality: את האזרחות ניתן לקבוע על ידי המחבר.
  • מחבר_ID → Author_Nationality: ניתן לקבוע את הלאום מן מחבר_ID דרך ה מחבר תכונה. עדיין יש לנו תלות טרנזיטיבית.

אנחנו צריכים להוסיף טבלה שלישית כדי לנרמל את הנתונים האלה:

מדינות

מדינה_IDמדינה
Coun_001ארצות הברית
Coun_002קנדה

מחברים

מחבר_IDמחברמדינה_ID
Auth_001אורסון סקוט קארדCoun_001
Auth_002מרגרט אטוודCoun_002

עכשיו יש לנו שלושה שולחנות, תוך שימוש במפתחות זרים לקשר בין השולחנות:

  • המפתח החיצוני של שולחן הספר מחבר_ID מקשר ספר למחבר בטבלה AUTHORS.
  • המפתח החיצוני של הטבלה של AUTHORS מדינה_ID מחבר המחבר לארץ בטבלה COUNTRIES.
  • לטבלה COUNTRIES אין מפתח זר מכיוון שאין לה צורך לקשר לטבלה אחרת בתכנון זה.

למה תלות טרנזיטיבית הם רע עיצוב מסד נתונים

מהו הערך של הימנעות תלות טרנזיטיבית כדי לעזור להבטיח 3NF? הבה נבחן את הטבלה הראשונה שלנו ונראה את הבעיות שהיא יוצרת:

מחברים

מחבר_IDמחברספרמחבר_לאומיות
Auth_001אורסון סקוט קארדהמשחק של אנדרארצות הברית
Auth_001אורסון סקוט קארדילדי הנפשארצות הברית
Auth_002מרגרט אטוודסיפורו של המשרתת /קנדה

סוג זה של עיצוב יכול לתרום אנומליות נתונים חוסר עקביות, למשל:

  • אם מחקת את שני הספרים "ילדי הנפש" ו"משחק של אנדר ", היית מוחקת את המחבר" ​​אורסון סקוט קארד "ואת אזרחותו לחלוטין ממסד הנתונים.
  • לא ניתן להוסיף מחבר חדש למסד הנתונים, אלא אם כן גם להוסיף ספר; מה אם המחבר עדיין לא פורסם או שאתה לא יודע את שמו של ספר שהיא מחברת?
  • אם "אורסון סקוט קארד" שינה את אזרחותו, היית צריך לשנות את זה בכל הרשומות שבהן הוא מופיע. רישום מספר רשומות עם אותו מחבר יכול לגרום לנתונים לא מדויקים: מה אם אדם הזנת נתונים אינו מבין שיש מספר רשומות עבורו ומשנה את הנתונים ברשומה אחת בלבד?
  • אתה לא יכול למחוק ספר כמו "הסיפור של מעשה ידיה" גם מבלי למחוק את המחבר לחלוטין.

אלה הן רק כמה סיבות מדוע נורמליזציה, הימנעות תלות טרנזיטיבית, להגן על הנתונים ולהבטיח עקביות.