הצבת מסד נתונים בטופס רגיל שלישי (3NF)

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

שלישית דרישות טופס רגיל

ישנן שתי דרישות בסיסיות עבור מסד נתונים להיות במצב השלישי הרגיל:

על תלות המפתח הראשי

בואו לחקור עוד למה אנחנו מתכוונים על ידי העובדה כי כל העמודות צריך לסמוך על המפתח הראשי.

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

האם שני LastName ו- FirstName תלויים רק בערכו של EmployeeID? ובכן, האם LastName תלוי ב- FirstName? לא, מכיוון ששום דבר הטמון ב- LastName לא יציע את הערך של FirstName. האם FirstName תלוי ב- LastName? לא עוד, כי זה נכון: לא משנה מה שם LastName, זה לא יכול לספק רמז לגבי הערך של FirstName. לכן, זה טבלה 3NF תואם.

אבל לשקול את זה כלי רכב טבלה:

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

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

לוח כלי רכב

בטבלה שלהלן, ה- ModelID הוא מפתח זר לטבלת המודלים :

טבלת מודלים

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

שדות נגזרים במודל 3NF

טבלה עשויה להכיל שדה נגזר - אחד המחושב בהתבסס על עמודות אחרות בטבלה. לדוגמה, שקול את הטבלה הבאה של פקודות widget:

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

למעשה, מכיוון שהוא נגזר, עדיף לא לאחסן אותו באתר בכלל.

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

בחר מספר הזמנה, סה"כ מתוך WidgetOrders

כעת אנו יכולים להשתמש בשאילתה הבאה:

בחר סדר, מספר יחידה * כמות AS סך הכל מתוך WidgetOrders

כדי להשיג את אותן תוצאות מבלי להפר את כללי הנורמליזציה.