נרמול ודה-נירמול של נתונים

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

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

תוכן עניינים

מהו נרמול (Normalization)?

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

יתרונות הנרמול

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

חסרונות הנרמול

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

שלבי נרמול (Normal Forms)

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

צורה נורמלית ראשונה (1NF)

  1. כל שדה בטבלה חייב להכיל ערך בודד (לא רשימה או מערך).
  2. כל רשומה חייבת להיות ייחודית, כך שלא יהיו כפילויות בשורות.

דוגמה לצורה 1NF

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

לקוחמוצרים שנרכשו
יוסימחשב, טלוויזיה

 

כדי להפוך טבלה זו לצורה 1NF, נצטרך להפריד את רשימת המוצרים, כך שלכל מוצר תהיה רשומה נפרדת:

לקוחמוצר שנרכש
יוסימחשב
יוסיטלוויזיה

 

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

לאחר שהטבלה מקיימת את הכללים של 1NF, עלינו לוודא שהיא גם עומדת בדרישות של 2NF. 

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

דרישות 2NF

  1. הטבלה חייבת לקיים את כל הכללים של 1NF.
  2. כל עמודה שאינה חלק מהמפתח הראשי חייבת להיות תלויה במלוא המפתח הראשי ולא רק בחלק ממנו.

דוגמה לצורה 2NF

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

מספר לקוחמספר הזמנהעיר לקוח
1101תל אביב
1102תל אביב
2103חיפה

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

  1. טבלת "לקוחות" שתכיל את מספר הלקוח ושם העיר.
  2. טבלת "הזמנות" שתכיל את מספר הלקוח ומספר ההזמנה.
 
לקוחות
מספר לקוחעיר לקוח
1תל אביב
2חיפה

הזמנות

מספר לקוחמספר הזמנה
1101
1102
2103

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

הצורה הנורמלית השלישית מתמקדת בבעיה של תלות מעברתית (Transitive Dependency). לאחר שהטבלה עומדת בתנאי 2NF (כלומר, כל עמודה תלויה בכל המפתח הראשי), 3NF מוודאת שאין תלות בין עמודות לא-מפתחיות. כלומר, עמודה שאינה חלק מהמפתח הראשי לא יכולה להיות תלויה בעמודה אחרת שאינה חלק מהמפתח הראשי.

דוגמה לצורה 3NF

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

שם מוצרשם יצרןטלפון יצרן
מחשבדל03-1234567
טלוויזיהסוני04-7654321

כדי להגיע לצורה 3NF, נפריד את הטבלה לשתיים:

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

יצרנים

שם יצרןטלפון יצרן
דל03-1234567
סוני04-7654321

דוגמה מסכמת לנרמול

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

מספר לקוחשם לקוחעירמיקודמספר הזמנה
1יוסיתל אביב61000101, 102
2נועהחיפה32000103

 

כדי להימנע מכפילויות, נבצע תהליך נרמול:

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

 

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

הטבלה לאחר נרמול ל-1NF

מספר לקוחשם לקוחעירמיקודמספר הזמנה
1יוסיתל אביב61000101
1יוסיתל אביב61000102
2נועהחיפה32000103
  1. לפני הנרמול: בעמודת "מספר הזמנה" יש רשימה של מספרי הזמנה (101, 102) באותה רשומה עבור לקוח 1.
  2. אחרי הנרמול ל-1NF: אנו מפרידים את הרשומות כך שכל רשומה תכיל רק ערך בודד בעמודה "מספר הזמנה". כעת יש רשומות נפרדות עבור כל הזמנה של הלקוח יוסי, וזה עומד בדרישות ה-1NF.

נרמול ל-2NF

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

לקוחות

מספר לקוחשם לקוחעירמיקוד
1יוסיתל אביב61000
2נועהחיפה32000

הזמנות

מספר הזמנהמספר לקוח
1011
1021
1032

נרמול ל-3NF

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

לקוחות

מספר לקוחשם לקוחמספר עיר
1יוסי1
2נועה2

ערים

מספר עירשם עירמיקוד
1תל אביב61000
2חיפה32000

מהו דה-נירמול (Denormalization)?

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

יתרונות הדה-נירמול

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

חסרונות הדה-נירמול

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

דוגמה לדה-נירמול

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

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

מתי להשתמש בנרמול ומתי בדה-נירמול

  1. נרמול מתאים כאשר המערכת דורשת שמירה על עקביות בנתונים, ומאוחסנים בה נתונים רבים המתעדכנים לעתים קרובות. זה חשוב במיוחד במערכות OLTP (Online Transaction Processing), כמו מערכות ניהול עסקיות ומערכות בנקאיות, שבהן יש עדכונים תכופים.

  2. דה-נירמול מתאים כאשר המערכת דורשת גישה מהירה לנתונים ושאילתות מורכבות שדורשות איחוד טבלאות רבות. זה נכון במיוחד במערכות OLAP (Online Analytical Processing), כמו מחסני נתונים (Data Warehouses), שבהם מתבצעים ניתוחים על נתונים היסטוריים.

לסיכום

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

המדריך למפתח ה-BI
מהבנה בסיסית של בינה עסקית ועד לבניית ETL, מידול נתונים, שימוש בכלים שונים ועוד.
בואו לבקר במאגר המידע המקיף ביותר בעברית על עולם פיתוח ה-BI!​

דברו איתנו