- אין תלותים טרנסיטיביות: כלל זה מרכזי. בטבלת 3NF, עמודת לא מפתח חייבת להיות תלוית רק במפתח הראשי, ולא באופן עקיף דרך עמודת לא מפתח נוספת.
בואו נסתכל על מה משמעות זה בפועל.
איחוד טבלאות כדי להשיג 3NF
בואו נבצע את התהליך של איחוד טבלאות כדי להגיע ל-3NF. נשתמש בנתוני דוגמה מקורסי DataCamp כדי להמחיש כל שלב.
שלב 1: זיהוי תלותים טרנזיטיביות
להתחיל, נחפש כל תכונות בטבלה שתלויות באופן עקיף במפתח הראשי. ככלל, אם תכונה מתלויה במשהו שאינו המפתח הראשי, זה מציין תלות טרנזיטיבית. זה אומר שהגיע הזמן לפצל את הטבלה שלכם.
תסתכל בשלושת הטבלאות למטה. איזו מהן מכילה תלות טרנזיטיבית?
טבלה 1: קורס
Course ID | Course Name | Difficulty |
---|---|---|
201 | יסודות SQL | מתחיל |
202 | מבוא לפייתון | מתחיל |
203 | הבנת מדע הנתונים | אמצעי |
טבלה 2: מדריכים
Instructor ID | Instructor Name | Expertise |
---|---|---|
1 | שרה ג'ונסון | מדע הנתונים |
2 | תום ויליאמס | למידת מכונה |
3 | אמילי בראון | פייתון |
טבלה 3: הרשמות
Enrollment ID | Student Name | Course ID | Course Name |
---|---|---|---|
1001 | Alice Smith | 201 | יסודות SQL |
1002 | Bob Green | 202 | מבוא ל-Python |
1003 | Charlie Blue | 201 | יסודות SQL |
התשובה היא… טבלה 3!
בטבלה זו, שם הקורס תלוי ב מזהה הקורס, אך לא ישירות ב מזהה ההרשמה (המפתח הראשי). התלות העקיפה הזאת גורמת ל שם הקורס להיות תלות טרנזיטיבית.
שלב 2: הפרדת נתונים לטבלאות חדשות
כדי לטפל בתלות עבורית, נפרק את טבלה 1 לשתי טבלאות. כל טבלה תתמקד בנתונים התלויים ישירות.
טבלת רישום מתוקנת
Enrollment ID | Student Name | Course ID |
---|---|---|
1001 | אליס סמית | 201 |
1002 | בוב גרין | 202 |
1003 | צ'ארלי בלו | 201 |
טבלת קורסים
Course ID | Course Name |
---|---|
201 | יסודות SQL |
202 | מבוא לפייתון |
כעת, כל טבלה מכילה רק מידע שתלוי ישירות במפתח הראשי שלה: מזהה קורס הוא כעת מפתח הראשי עבור שם הקורס בטבלת הקורסים, ומזהה ההרשמה הוא המפתח הראשי בטבלת ההרשמות.
עם הפיצול הזה, הטבלאות עומדות כעת בדרישות של 3NF, מסירות כפילויות ווודאות שכל טבלה מאכילה רק מידע ישירות רלוונטי.
אם ברצונך להתחיל לידיים וליצור בעצמך מסדי נתונים, כדאי לך לבדוק את הקורס יצירת מסדי נתונים ב־PostgreSQL שלנו. אם אתה מתקדם קצת יותר, תוכל לנסות את היכרות עם עיצוב נתונים ב־Snowflake, שכולל רעיונות כמו יחסי ייחוס ועיצובים ממדיים.
יתרונות ומגבלות בשימוש בצורה הסטנדרטית השלישית
אז, למה לעבור דרך רב כל כך רבה כדי להגיע ל־3NF? הנה היתרונות העיקריים:
- שיפור אינטגריטיות הנתונים: על ידי הסרת תלות טרנזיטיבית, 3NF עוזר לוודא שעדכונים ומחיקות לא גורמים לנתונים סותרים או מיושנים בטבלאות.
- הפחתת חזרה: פחות חזרה מביאה לכך שבסיס הנתונים שלך יותר קל לתחזק, ושימוש באחסון מתקן.
- תחזוקת נתונים פשוטה יותר: שמירת מידע דומה בטבלאות מיועדות עוזרת לעדכן רשומות בקלות יותר בלי לעקוב אחר רשומות כפולות.
עם זאת, בעוד מבני 3NF תומכים בדיוק של הנתונים, הם יכולים גם להוביל לנתונים מפוצלים יותר, לעיתים קרובות מאטים שאילתות מורכבות יותר בגלל שרשורי טבלאות נוספים. במקרים בהם צורך במהירות עולה על צורך בתיקון, BCNF או 4NF עשויים להיות אפשרויות פרקטיות יותר.
השוואה: צורות תקניות ראשונה, שנייה, שלישית ו-BC
בואו נסתכל על ההבדלים בין הצורות.
טבלת השוואה: צורות תקניות ראשונה, שנייה ושלישית
זו טבלת השוואה שתעזור לך להבין את דרישות ה-1NF, 2NF ו-3NF.
BCNF היא צורת "מחמירה" של 3NF שמבטלת אנומליות שקורות עם מפתחות מועמדים המתנפצים. זה יכול להיות שימושי במיוחד במקרים מורכבים שבהם 3NF לבד לא מסיר באופן מלא תלותים. BCNF חל כאשר מאפיין לא-ראשי תלוי במאפיין המהווה חלק ממפתח מועמד מרוכז. אני יודע שזה נשמע מורכב, אז בואו נפרט זאת באמצעות דוגמה.
מבנה נוכחי (ב-3NF)
לאחר הפירוק כדי להשיג 3NF, היו לנו שני טבלאות אלו:
טבלת הרשמות
טבלת קורסים
Course ID | Course Name |
---|---|
201 | יסודות SQL |
202 | הקדמה לפייתון |
במבנה זה, כל טבלה נמצאת ב-NF3 ללא תלותים טרנזיטיביות, והנתונים מנורמלים באופן הולם.
הצגת דרישה חדשה
כעת, בואו נוסיף מאפיין חדש ל-קורסים: ה-כיתה בה מתקיים כל קורס. מאפיין זה עשוי לדרוש BCNF.
טבלת קורסים מעודכנת (3NF)
Course ID | Course Name | Classroom |
---|---|---|
201 | יסודות SQL | חדר 101 |
202 | מבוא ל-Python | חדר 102 |
203 | הבנת מדע הנתונים | חדר 101 |
כאן, מזהה הקורס עדיין המפתח הראשי, וכל המאפיינים האחרים תלויים ישירות בו. אך נניח ישנה כלל חדש שכל כיתה יכולה להכיל רק נושא אחד בכל פעם. נניח גם כי ה-שם של הקורס "יסודות SQL" יכול להיות מוצע תחת מזהי קורס שונים (כמו 201, 204, וכו'), אם הם נקבעו בזמנים שונים. במקרה כזה, כל הצעה של "יסודות SQL" תתרחש בכל עת ב"כיתה 101," ללא קשר ל-מזהה הקורס הספציפי. כתוצאה, ה-שם של הקורס מקבע גם באופן ייחודי את ה-כיתה.
זה אומר שיש לנו כעת שני מפתחות מועמדים:
- מזהה קורס
- שם הקורס
עם שני המפתחות המועמדים, יש לנו כעת בעיה שלא נטפל בה 3NF: כיתה תלויה ב-שם הקורס במקום מספר קורס.
מיושם BCNF
כדי להסיר את בעיה זו של תלות, נצטרך לפרק עוד יותר את הטבלה קורסים לשתי טבלאות נפרדות שמתאימות יותר ל-BCNF:
- טבלת קורסים חדשה, הכוללת רק את מזהה הקורס ו את שם הקורס.
- טבלת CourseDetails, המאחסנת את ה-Course Name ואת ה-Classroom המשויכים.
כך זה נראה:
טבלת קורסים מתוקננת (BCNF)
טבלת פרטי קורס (BCNF)
Course Name | Classroom |
---|---|
יסודות SQL | כיתה 101 |
מבוא לפייתון | כיתה 102 |
הבנת מדע הנתונים | כיתה 101 |
- בטבלת קורסים, מזהה קורס הוא המפתח הראשי, וכל התכונות תלויות בו בלבד.
- בטבלת פרטי קורס, שם הקורס הוא המפתח הראשי, וכיתה תלויה רק בשם הקורס.
ההתקנה הזו מסירה כל בעיות התלות שנגרמות על ידי מפתחות מועמד מתקנים, מבטיחה מבנה מקונן בצורה מדויקה.
מסקנה
צורת צד שלישי היא כלי ערך למעצבי מסדי נתונים שמטרתם לשמור על ניקיון הנתונים, העקביות והחופש מהתלויות בעיה. בעזרת 3NF, תוכנה הנתונים משתפרת, מה שהופך את ניהול המידע לקל ומוריד את הכפילויות. זכור, בזמן ש-3NF עובדת טוב ברוב המקרים, מסדי נתונים מורכבים יוכלו להרוויח מצורות נוספות כמו BCNF או 4NF.
אם מצאתם את המאמר הזה מועיל, שקלו לקחת את הצעד הבא ולקבל את תעודת השכר SQL המוסמכת שלנו. זהו דרך נהדרת לאמת את הכישורים שלכם ב-SQL ובניהול מסדי נתונים ולהדגים את המומחיות שלכם למעסיקים פוטנציאליים!