מהו הצורה התקנית השלישית (3NF)?

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

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

Third Normal Form (3NF) Definition

Third normal form הוא מושג מרכזי בנורמליזציה של מסדי נתונים שמסיר תלויות לא רצויות. 3NF בונה על יסודות first normal form (1NF) וsecond normal form (2NF), ולכן הוא מוריש את חוקיהם: 1NF מחייבת ערכים אטומיים (בלתי ניתנים לחלוקה) בכל תא, ו-2NF מסיר תלויויות חלקיות במפתח ראשי מרכב. 3NF הולך צעד נוסף ומסיר תלויויות חוצות, מצב בו תכונות לא מפתח תלויות באופן עקיף במפתח הראשי.

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

בשנות ה-1970, אדגר פ. קוד הציג את 3NF כדי לפורמליזציה את התנאים להשגת מבנה מסד נתונים מנורמלי לגמרי. חידוש של קרלו זאניולו מאוחר יותר סיפק הסבר ברור יותר על ההבדל בין 3NF "קלאסי" וגרסה יותר מגבילה, Boyce-Codd normal form (BCNF). אל תדאגו יתר על BCNF לעכשיו, נחזור אליו מעט מאוחר יותר.

הבנת התנאים לגבי Third Normal Form

אז, מה בדיוק דרוש כדי להשיג 3NF? כדי שטבלה תספק את התנאים הנדרשים, עליה לעמוד בכמה תנאים:

  • תהיה ב-2NF: זה אומר שהיא כבר אטומית, ללא קבוצות חוזרות וללא תלותים חלקיות בכל מפתחות מרוכבים.

3NF כוללת בתוכה את 2NF ו-1NF. תמונה מאת המחבר

  • אין תלותים טרנסיטיביות: כלל זה מרכזי. בטבלת 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.

Feature 1NF 2NF 3NF
נתונים אטומיים
אין תלות חלקית
אין תלות טרנזיטיבית

צורת תקן שלישית נגד צורת תקן של Boyce-Codd (BCNF)

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

מבנה נוכחי (ב-3NF)

לאחר הפירוק כדי להשיג 3NF, היו לנו שני טבלאות אלו:

טבלת הרשמות

Enrollment ID Student Name Course ID
1001 אליס סמית 201
1002 בוב גרין 202
1003 צ'ארלי בלו 201

טבלת קורסים

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," ללא קשר ל-מזהה הקורס הספציפי. כתוצאה, ה-שם של הקורס מקבע גם באופן ייחודי את ה-כיתה.

זה אומר שיש לנו כעת שני מפתחות מועמדים:

  1. מזהה קורס
  2. שם הקורס

עם שני המפתחות המועמדים, יש לנו כעת בעיה שלא נטפל בה 3NF: כיתה תלויה ב-שם הקורס במקום מספר קורס.

מיושם BCNF

כדי להסיר את בעיה זו של תלות, נצטרך לפרק עוד יותר את הטבלה קורסים לשתי טבלאות נפרדות שמתאימות יותר ל-BCNF:

  1. טבלת קורסים חדשה, הכוללת רק את מזהה הקורס ו את שם הקורס.
  2. טבלת CourseDetails, המאחסנת את ה-Course Name ואת ה-Classroom המשויכים.

כך זה נראה:

טבלת קורסים מתוקננת (BCNF)

טבלת פרטי קורס (BCNF)

Course Name Classroom
יסודות SQL כיתה 101
מבוא לפייתון כיתה 102
הבנת מדע הנתונים כיתה 101

עם מבנה חדש כזה, כל טבלה מקיימת תנאי BCNF:

  • בטבלת קורסים, מזהה קורס הוא המפתח הראשי, וכל התכונות תלויות בו בלבד.
  • בטבלת פרטי קורס, שם הקורס הוא המפתח הראשי, וכיתה תלויה רק בשם הקורס.

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

מסקנה

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

אם מצאתם את המאמר הזה מועיל, שקלו לקחת את הצעד הבא ולקבל את תעודת השכר SQL המוסמכת שלנו. זהו דרך נהדרת לאמת את הכישורים שלכם ב-SQL ובניהול מסדי נתונים ולהדגים את המומחיות שלכם למעסיקים פוטנציאליים!

Source:
https://www.datacamp.com/tutorial/third-normal-form