נרמול בסיס נתונים

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

צורה נורמלית שנייה - 2NF

טבלה נמצאת בצורה נורמלית שנייה אם אין תלויות פונקציונליות של שדות שאינם כלולים במפתח הראשי בחלק משדות המפתח. למשל, הטבלה עם הסכמה (תעודת זהות, שם אדם, כתובת, מס' מכונית, שנת ייצור המכונית) אינה בצורה נורמלית שנייה. זאת משום שיש תלות פונקציונלית של שם האדם בתעודת זהות.
שם האדם אינו כלול במפתח ואילו תעודת הזהות מהווה רק חלק מהמפתח (תעודת זהות, מס' מכונית). אותה בעיה נוצרת גם מקיום תלות פונקציונלית של שנת ייצור המכונית (תכונה שאינה כלולה במפתח) במס' מכונית (חלק מהמפתח).
אלגוריתם הנרמול:
אם הסכמה היא (X,Y,Z,A), ואם (X,Y) הם המפתח ו-Z תלוי ב-X, יש להפריד את הטבלה לשתי טבלאות נפרדות: (X,Y,A) ו-(X,Z). כלומר יש ליצור טבלה נפרדת שתכלול את התלות הפונקציונלית, ולהשמיט מהטבלה המקורית את המרכיב שיש לו תלות פונקציונלית בחלק מהמפתח.

צורה נורמלית שלישית - 3NF

טבלה נמצאת בצורה נורמלית שלישית אם היא בצורה נורמלית שנייה ולא קיימת תלות פונקציונלית בין שני מרכיבים שאינם חלק מהמפתח הראשי. ובלשון אחרת, כל שדה שאיננו שדה מפתח, אסור שיהיה תלוי בשדה שאיננו שדה מפתח.
למשל בסכמה (תעודת זהות, שם, מס' אותיות בשם) תעודת הזהות לבדה היא המפתח, שהרי היא מבטיחה מילוי חד ערכי של יתר השדות. מצד שני, מס' האותיות בשם זהו שדה שתלוי ישירות בשם, ותלותו בתעודת זהות היא עקיפה - טרנזטיבית בלבד. דוגמה אחרת הוא שדה מיקוד בטבלה (אדם, כתובת, מיקוד). לשדה המיקוד יש תלות עקיפה במפתח - השדה אדם. הפתרון הוא, ליצור טבלת מיקוד נפרדת לפי עיר, רחוב ומספר בית.
אלגוריתם הנרמול:
יש להפריד את הטבלה לשתי טבלאות נפרדות. אם הסכמה היא (X,Y,Z,A) ואם X הוא מפתח ו-Y גורר את Z, נפריד לטבלאות עם הסכמות: (X,Y,A) ו-(Y,Z).

צורה נורמלית בויס-קוד - BCNF

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

למשל, בסכמה (סטודנט, תחום לימוד, מרצה), ייתכן שסטודנט ותחום לימוד נלקחו כמפתח ראשי (זהות המרצה תוסק מהם). עם זאת, עדיין נדרש נירמול על פי BCNF. הבעיה היא שניתן להסיק את תחום הלימוד מזהות המרצה לבדו. כלומר קיימת תלות פונקציונלית של תחום הלימוד במרצה, אף שהמרצה כשלעצמו אינו מפתח אפשרי.
אלגוריתם הנרמול:
אם (X,Y,Z,A) היא הסכמה, ואם X,Y הוא מפתח אפשרי ו-Y,Z מפתח אפשרי ו-Z גורר את X, נפריד למרכיבים (Y,Z,A) ו-(Z,X).

צורה נורמלית רביעית - 4NF

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

צורה נורמלית חמישית - 5NF

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

יוצאים מהכלל

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