הצורה הרגילה השלישית

Hzwrh Hrgylh Hslysyt



זהו חלק שלישי של הסדרה, חמש צורות נורמליות. הכותרות של שני החלקים הראשונים (הדרכות) הן First Normal Form, ואחריו Second Normal Form. בחלק זה של הסדרה מוסבר צורה נורמלית שלישית.

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







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



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



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





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

מוצרים (מזהה מוצר, מזהה קטגוריה, מוצר)
קטגוריות (מזהה קטגוריה, קטגוריה)



מכירות (מזהה מכירה, לקוח, עובד, תאריך)
פרטי מכירה (מזהה מכירה, מזהה מוצר, מספר נמכר, מחיר מכירה)

הזמנות (מזהה הזמנה, ספק, עובד, תאריך)
פרטי הזמנה (מזהה הזמנה, מזהה מוצר, מספר קנוי, מחיר מחיר)

המקשים הבודדים או המרוכבים מסומנים בקו תחתון.

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

'מה לגבי מספרי טלפון, כתובות וכו' ללקוחות ולעובדים?

מה לגבי כמות במלאי, רמת הזמנה חוזרת וכו' למוצרים?
האם הם צריכים שולחנות נפרדים משלהם, או שצריך להתאים אותם לשולחנות הנוכחיים?'

אתה, מפתח מסדי הנתונים, עונה:

'מזל טוב, בעל הבית! הצגתם בעקיפין את נושא הצורה הרגילה השלישית'.

אתה ממשיך.

עמודות נחוצות אחרות

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

לכל הפחות, טבלת הקטגוריות צריכה לכלול את העמודות הבאות:

קטגוריות (מזהה קטגוריה, שם קטגוריה, תיאור)

התיאור הוא פסקה קצרה המתארת ​​את הקטגוריה. טבלת הקטגוריות הזו כבר נמצאת ב-1NF, 2NF ו-3NF. ה-3NF מוסבר להלן:

לכל הפחות, טבלת המוצרים צריכה לכלול את העמודות הבאות:

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

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

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

טבלת המוצרים הזו כבר נמצאת ב-1NF, 2NF ו-3NF. ראה מדוע זה נמצא ב-3NF להלן:

לכל הפחות, טבלת SaleDetails צריכה לכלול את העמודות הבאות:

פרטי מכירה (מזהה מבצע, מזהה מוצר, מחיר יחידה, כמות, הנחה)

ערך ההנחה צפוי להיות אפס רוב הזמן. הנחה היא ההנחה שהחנות נותנת ללקוח.

לכל הפחות, הטבלה OrderDetails צריכה לכלול את העמודות הבאות:

פרטי הזמנה (מזהה הזמנה, מזהה מוצר, מחיר יחידה, כמות, הנחה)

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

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

בזמן הוספת עמודות, טבלת המכירות תהיה:

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

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

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

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

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

טבלת מכירות – 2NF – ללא זיהוי לקוח

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

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

טבלת מכירות – 2NF – עם מזהה לקוח

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

שים לב שמספר מזהי לקוחות ותלוייהם חוזרים על עצמם.

כללים לטופס רגיל שלישי

טבלה היא בצורה רגילה שלישית אם היא עומדת בכללים הבאים:

  1. זה כבר אמור להיות בצורה הרגילה השנייה.
  2. וזה לא אמור להיות תלות טרנזיטיבית.

ואז שואל אחד הפקידים (העובדים) 'מהי תלות טרנזיטיבית?'. ואתה, מפתח מסד הנתונים, עונה, 'זו שאלה טובה!'

תלות טרנזיטיבית

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

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

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

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

טבלת מכירות מ-2NF ל-3NF

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

טבלת מכירות סופית ב-3NF

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

סימון הטבלה עבור טבלת המכירות הסופית הזו ב-3NF הוא:

מכירות (מזהה מכירה, תאריך נמכר, מזהה לקוח, מזהה עובד)

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

הערה: זיהוי מכירה, מזהה לקוח וזיהוי עובד אינם יוצרים מפתח מורכב. saleID תלוי במזהה הלקוח ובמזהה העובד.

הקשר בין saleID ל- customerID הוא רב לאחד.

טבלת הלקוחות ב-3NF

בטבלה זו יש שלוש שורות במקום 9 שורות בטבלת מכירות 2NF. בטבלה זו, מזהה לקוח הוא מפתח ראשי. זה זהה למפתח הזר בטבלת המכירות, אך ללא חזרות. המפתח הזר בטבלת המכירות והמפתח הראשי בטבלת הלקוח מקשרים בין שתי הטבלאות.

השורות החוזרות ונשנות בטבלת הלקוח הוסרו כדי לא להפר את 1NF.

כפי שהקורא יכול לראות, הצבת טבלה ב-3NF תפתור גם את הבעיה של שורות חוזרות (יתירות).

סימון הטבלה עבור טבלת לקוחות הוא:

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

טבלת המוצרים נבדקה מחדש

טבלת המוצרים המופיעה לעיל בצורת סימון היא:

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

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

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

כל השולחנות

כל הטבלאות נמצאות כעת ב-3NF. הם מוצגים כ:

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

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

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

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

הזמנות (מזהה הזמנה, תאריך נמכר, מזהה ספק, מזהה עובד)
פרטי הזמנה (מזהה הזמנה, מזהה מוצר, מספר קנוי, מחיר מחיר)

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

בדיקת הצוות

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

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

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

העתיד הקרוב והרחוק

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

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

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

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

לכן, אם כולם יעברו את המבחן, תבקשו מהפקידים ללכת ולהמשיך לעבוד. כמו כן, תייעץ להם לחסוך חלקים ממשכורתם כדי שיוכלו להחזיק בחנויות הנוחות שלהם. תמשיך מחר להכשיר רק את הבעלים ב-4NF ו-5NF. עם הידע של 4NF ו-5NF, כל הפגיעויות הידועות מוסרות.

הַעֲרָכָה

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

אז כל הכבוד לכולכם: המורה והתלמידים.

אין מה לעשות במדריך זה מלבד לסיים.

סיכום

טבלה היא בצורה רגילה ראשונה, אם היא אינה מפרה אחד מהכללים הבאים:

  1. לכל העמודות בטבלה צריך להיות שמות כותרות ייחודיים.
  2. לכל תא חייב להיות ערך בודד בלבד.
  3. ערכים המאוחסנים בעמודה צריכים להיות מאותו סוג.
  4. השורות צריכות להיות ברורות.
  5. סדר העמודות או השורות אינו משנה.

טבלה היא בצורת שניה רגילה, אם היא אינה מפרה אחד מהכללים הבאים:

  1. הטבלה חייבת להיות כבר בצורת First Normal.
  2. אסור שתהיה תלות חלקית.

טבלה היא בצורה רגילה שלישית, אם היא אינה מפרה אחד מהכללים הבאים:

  1. זה חייב להיות כבר בצורה הרגילה השנייה.
  2. ואסור שיהיה לו תלות טרנזיטיבית.

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

קבעתם פגישה עם הבעלים בלבד, שתתקיים מחר במשרדו להדרכה על 4NF ו-5NF.