חוקי הנרמול הם שישה כללים לארכיטקטורה תקינה של מסד נתונים יחסי. הם נבנים אחד על גבי השני וקובעים איך לארגן טבלאות ושדות. המטרה היא אחסון אמין, יעיל וחסכוני של המידע, ומניעת תופעות בעייתיות בתפעול.
טבלאות שאינן מנורמלות עלולות ליצור אנומליות: כפילויות, עדכונים מסורבלים, בעיות בהכנסה ובמחיקה ובזבוז מקום. לדוגמה, טבלה עם השדות (מספר זהות, שם, כתובת, מספר מכונית, שנת ייצור) תגרום לשכפול שם וכתובת אם לאותו אדם יש כמה מכוניות. עדכון כתובת יחייב שינוי של מספר רב של שורות. קשה גם להכניס פרטי מכונית בלי בעלים או להשאיר מכונית אחרי מחיקת בעליה.
בעיות כאלה נגרמות כששדות שמתארים ישות אחת (כמו אדם) מעורבבים עם ישויות אחרות (כמו חשבונות בנק או מכוניות). הפתרון הרגיל הוא לפצל טבלאות ולקשר ביניהן.
מונחים חשובים שיופיעו: טבלה, שדה, מפתח ראשי (שדה שמזהה באופן ייחודי שורה), ותלות פונקציונלית (כאשר ערך אחד קובע ערך אחר).
טבלה ב-1NF דורשת שכל שדה יכיל ערך אטומי אחד בלבד. כלומר, אין רשומות שבהן שדה מחזיק רשימה של ערכים.
טבלה ב-2NF אינה מכילה "תלויות חלקיות" של שדות שאינם חלק מהמפתח על חלק מהמפתח. במילים פשוטות: אם המפתח מורכב, שדה שאינו מפתח אסור להיות תלוי רק בחלק מהמפתח. האלגוריתם הפשוט: אם הסכמה היא (X,Y,Z,A) והמפתח הוא (X,Y) אבל Z תלוי רק ב-X, מפרידים לטבלאות (X,Y,A) ו-(X,Z).
טבלה ב-3NF היא ב-2NF ועוד אין בה תלות טרנזיטיבית (תלות עקיפה) בין שדות שאינם מפתח. למשל, אם שם מגרר את מספר האותיות בשם, וזה תלוי בעקיפין בתעודת זהות, צריך להפריד ולהעביר נתונים תלויים לטבלאות מתאימות.
BCNF מחזקת את 2NF ו-3NF במקרים גבוליים. בתנאי הזה כל שדה שגורר שדה אחר חייב להיות מפתח אפשרי. לדוגמה: (סטודנט, תחום, מרצה) יכול להפר את BCNF אם תחום נקבע על ידי המרצה בלבד.
4NF עוסקת בתלות רב־ערכית: מצב שבו לאותה ישות יש סדרות בלתי תלויות של ערכים (כמו שפות וילדים לעובד). הפתרון הוא לפצל טבלה לטבלאות נפרדות עבור כל תלות רב־ערכית, למשל (עובד,שפה) ו-(עובד,ילד).
5NF היא הכללה של הקודמות ומתאימה למקרים של חוקים מיוחדים על הנתונים. טבלה ב-5NF לא ניתנת לפירוק לטבלאות קצרות יותר מבלי לאבד מידע, או שהטבלאות בפירוק יישאו את אותו מפתח.
חוקי הנרמול אינם מוחלטים. לפעמים מפרידים פחות כדי לשפר ביצועים. דוגמה מקובלת היא אחסון מיקוד לצד הכתובת בטבלה אחת, במקום לשאוב אותו מטבלת מיקודים בכל פעם, כדי להאיץ שאילתות יקרות.
נרמול הוא סידור נכון של טבלאות במסד נתונים. הטבלה היא מקום שבו שומרים מידע בשורות ובשדות. המטרה היא שהמידע יהיה מדויק וחסכוני.
טבלאות שלא מסודרות טוב יוצרות בעיות. למשל טבלה עם (מספר זהות, שם, כתובת, מספר מכונית, שנת ייצור) תצריך לחזור על השם והכתובת בכל מכונית. זה מיותר וקשה לעדכן.
פתרון פשוט הוא לחלק את המידע לטבלאות קטנות יותר. לדוגמה: טבלת אנשים וטבלת מכוניות שמקושרות ביניהן.
כל שדה צריך להכיל ערך אחד בלבד. לא רשימות בתוך תא אחד.
אם המפתח כולל כמה שדות, שדה רגיל אסור להיות תלוי רק בחלק מהמפתח.
שדה רגיל לא יכול להיות תלוי בעקיפין בשדה אחר שאינו מפתח.
BCNF חזק יותר. כל תכונה שקובעת תכונה אחרת חייבת להיות מפתח אפשרי.
כשיש כמה רשימות בלתי קשורות לאותה ישות (כמו שפות וילדים), מפצלים לטבלאות שונות.
5NF אומרת שאי אפשר לפרק את הטבלה ליותר טבלאות בלי לאבד סדר.
לפעמים שומרים יחד נתונים כדי שהמסד יעבוד מהר יותר. זה קורה כשחלוקה גורמת לשאילתות איטיות.
תגובות גולשים