Skip to main content

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

Python Web Apps with Flask by Ezra Zigmond (אַפּרִיל 2025)

Python Web Apps with Flask by Ezra Zigmond (אַפּרִיל 2025)
Anonim

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

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

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

  • מסד הנתונים חייב כבר לעמוד בדרישות של 1NF ו 2NF.
  • כל עמודות מסד הנתונים חייבות להיות תלויות במפתח הראשי, כלומר ניתן להפיק את הערך של כל עמודה מהמפתח הראשי בלבד.

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

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

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

  • כרטיס עובד
  • שם פרטי
  • שם משפחה

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

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

  • כל מצ
  • יצרן
  • דגם

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

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

לוח כלי רכב

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

  • כל מצ
  • יצרן
  • ModelID

טבלת מודלים

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

  • ModelID
  • יצרן
  • דגם

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

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

  • מספר הזמנה
  • מספר לקוח
  • מחיר ליחידה
  • כמות
  • סך הכל

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

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

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

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

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

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

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