
הטקסט המלא של הדקות הראשונות בהרצאה «הדגמה של יצירת מסד נתונים» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
שלום, אנחנו נכנסים למודול שמלמד איך אנחנו ניגשים למסדי נתונים, איך אנחנו מעצבים את המידע, איך אנחנו בונים מסדי נתונים, ואיך אנחנו ניגשים לתוך מסד הנתונים מתוך אתר שאנחנו הולכים לבנות.
ראשית, בואו נבין מה זה מסד נתונים. מסד נתונים זה בעצם תוכנה חיצונית שהתפקיד שלה זה להחזיק את הנתונים שהתוכנה שלנו צריכה להשתמש בהם.
שם אחר למסד נתונים זה בסיס נתונים, וסך הכל המילה מסד זו מילה נרדפת למילה בסיס. בסיס נתונים ומסד נתונים זה אותו הדבר, תוכנה שמאגדת בתוכה נתונים.
לפעמים קוראים לזה גם מאגר נתונים. תוכנות נפוצות כאלה בשוק, בטח שמעתם עליהן, נקראות Access לדוגמה של מייקרוסופט, SQL Server של מייקרוסופט, Oracle Server של חברת Oracle, DB2 של IBM, FoxPro מסד נתונים מאוד ישן ששייך היה פעם למייקרוסופט, ועוד הרבה הרבה מסדי נתונים שונים שקיימים
בשוק, לדוגמה גם mysql מסד נתונים חינמי כל אחת מהן התפקיד שלה זה להחזיק את הנתונים שהתוכנה שלנו צריכה להשתמש בהם כשאנחנו בונים איזושהי תוכנה או איזשהו אתר אז כמובן ללקוח יש המון נתונים שהוא רוצה לשמור לדוגמה חנות ספרים צריכה לשמור מן הסתם מידע לגבי הספרים מידע לגבי הזמנות מידע לגבי לקוחות מידע
לגבי עובדים מידע לגבי מלאי כל המידע הזה זה כמות עצומה של נתונים שהתוכנה שלנו צריכה להשתמש איתם היתרון במסד נתונים שהוא שמור קודם כל בהרדיסק ולא בתוכנה עצמה בזיכרון וכך כאשר התוכנה נסגרת או האתר בעצם יורד מהאוויר עדיין הנתונים נשמרים לנו בהרדיסק אפשר לעשות
להם גיבוי ואנחנו יכולים שוב פעם בפעם הבאה שהתוכנה רצה להשתמש בנתונים האלה הם לא נעלמים. יתרון נוסף זה שמספר לקוחות יכולים לגשת לנתונים האלה בו זמנית כאשר אם היינו סתם שומרים את הנתונים בקבצים משלנו הייתה לנו בעיה לגשת אליהם בו זמנית ממספר מקומות ולכתוב ולקרוא מהם.
אז בואו נסתכל קודם כל על היסטוריה מסוימת שהייתה פעם לפני המצב שקיים היום. אז כמובן בראשית הדרך של תוכנות או יותר נכון של חברות לפני בכלל עידן המחשבים החברות שמרו את הנתונים בתוך כרטיסיות פיזיות מניירות וכמובן היה הדבר השלט בעבר חיסרון מאוד מאוד גדול ולא קשור לעולם המחשבים
תוכנה לא יכולה סתם לגשת לכרטיסייה ולקרוא ממנה. איזשהו יתרון שבוא נגיד גיבויים או יותר נכון קריסות של התוכנה עצמה או של מערכות מחשב לא היו פוגעות בנתונים האלה.
זה היה לפני עידן המחשבים. כאשר עידן המחשבים הגיע לעולם אז היו צריכים למצוא פתרון לכל מאגר הנתונים הזה ואז יצאו כל מיני מודלים ישנים מאוד שאפשרו לשמור את הנתונים בהם.
בואו נראה שני מודלים ישנים כאלה. מודל ראשון נקרא מודל הנתונים ההיררכי. בואו נראה מה המודל הזה נתן לנו בעבר. כשמו כן הוא בעצם מאפשר לי איזושהי היררכיה של נתונים.
לדוגמה בוא נניח שאני תוכנה לניהול מכללה מסוימת שמעבירה קורסים אז הייתה לי אפשרות להגדיר איזשהו פריט מידע פרט מידע לגבי קורסים.
הקורסים שהמכללה שלי בוא נניח העבירה היה קורס לבישול והיה קורס לתפירה וכך בעצם הנתונים היו מסודרים מהקורסים היה לנו בעצם קו לבישול קו לתפירה וככה בעצם ציינתי שיש לי שני קורסים אחד של בישול אחד של תפירה.
העיגול הזה שכתוב בתוכו בישול לא רק מציין את המילה בישול אלא היה לנו כל מיני נתונים נוספים בקשר לבישול לדוגמה חומרים שקשורים לבישול נושא תיאור וכולי אנחנו כרגע רק נרשום את הכותרת.
אוקיי, עכשיו יש תלמידים שלומדים בישול. אז מאגר הנתונים הזה החזיק את התלמידים שוב פעם בצורה של מעין אובייקטים כאלה. לדוגמה, חיים למד בישול וגם ריטה למדה בישול.
לכן מקורס בישול במאגר הנתונים היו קישורים לחיים ולריטה. בתפירה לדוגמה נרשם לנו יוסי לחוג תפירה. לכן מתפירה היה לנו בעצם איזשהו קישור ליוסי.
מה שאנחנו רואים כאן בעצם זה איזשהו מודל של היררכיה מסוימת. עכשיו, היו כמה בעיות עם המודל הזה. ראשית, לכל צומת במודל, צומת הכוונה עיגול, היה יכול להיות אבא אחד במודל הנתונים ההיררכי, ואז הייתה לנו בעיה שמה קורה אם ריטה רצתה ללמוד גם בישול וגם תפירה?
במודל הנתונים ההיררכי היו צריכים לשכפל שוב פעם את כל הפרטים של ריטה, ולומר שריטה לומדת גם תפירה. אוקיי, מה הבעיה עם זה? אז ראשית אני מזכיר לכם שאין פה רק את השם ריטה, יש פה עוד המון נתונים שקשורים לריטה, שם פרטי, שם משפחה, תעודת זהות, כתובת, כרטיס אשראי ועוד הרבה הרבה נתונים שקשורים
לריטה. כל הנתונים האלה עכשיו היו צריכים להיות משוכפלים לשני צמתים, שתי צמתים שמחזיקים רק את ריטה.
מה הבעיה עם הדבר הזה? ראשית, מה קורה אם אני עכשיו רוצה לעדכן את הכתובת של ריטה כי היא עברה דירה? הייתי צריך ללכת למודל הזה ולחפש בכל מקום ששנתי את ריטה ולבצע את העדכון.
מה קורה אם שלחתי לעדכן במקום אחד? בעיה נוספת, מה קורה אם אני עושה חיפוש לריטה? הייתי מוצא שני הגדרות שונות שבעצם שניהם זה ריטה.
הייתי מקבל את ריטה פעמיים בחיפושים. חיסרון נוסף שיש לנו במודל הזה זה המורכבות שלו. אנחנו רואים שזה די מורכב גם להתבונן על זה וגם לראות את כל התלמידים וגם לנהל את כל הדבר הזה ולתחזק אותו.
דבר נוסף, מאגר נתונים היה נראה אחרת לגמרי ממאגרי נתונים אחרים, ומי שבנה אותו היה צריך לדעת איך הוא בנוי בשביל להתעסק איתו.
לאחר מכן הגיע מודל אחר שבא לפתור חלק מהבעיות. המודל האחר נקרא מודל הנתונים הרשתי. בואו נשכפל את זה ונציין כאן את מודל הנתונים הרשתי.
מודל הנתונים הרשתי בא לפתור את בעיית השכפולים. במקום שריטה תופיע לנו פעמיים, בואו נמחק אותה מכאן, ריטה הופיעה פעם אחת, אלא היינו יכולים לקשר אותה לשתי צמתים אחרות.
וכך קיבלנו מעין רשת של נתונים, זה ממש נראה כמו רשת. פתרנו את הבעיה של השכפולים, ריטה מופיעה פעם אחת ויכולה להיות מקושרת למספר קורסים.
זאת אומרת שצומת אחת בתוך המודל הזה יכול להיות לה כמה אבות, וכמובן צומת יכול להיות לה כמה בנים. למרות שהשכפולים נפתרו וזה יצר לנו עכשיו נוחות מסוימת מבחינת החיפושים, כי גם פעם אחת הייתי מוצא את ריטה, עדיין רמת המורכבות לא קטנה עבור המודל הזה ואפילו נהיה טיפה יותר מורכב גם לתחזק את זה,
גם להבין מה קורה פה וגם כל הנושא של זה מותאם ספציפית לארגון מסוים. ואז באיזשהו שלב הבינו שצריכים מודל אחר לגמרי והגיע מודל הנתונים היחסי, רלציוני.
מודל הנתונים היחסי אמר דבר כזה, קודם כל אין לנו פיזור של כל מיני נתונים שהם מאוד דומים. לדוגמה קורס בישול וקורס תפירה שניהם קורסים והם מפוזרים לי בכל מיני מקומות שונים.
כנ"ל התלמידים, התלמידים מפוזרים בכל מיני מקומות שונים בכל מודל הנתונים הזה, בכל מאגר הנתונים. מודל הנתונים היחסי אמר דבר כזה כל סוג של נתונים חייב לשבת במקום אחד ויחיד והמקום הזה נקרא טבלה.
אז בואו נבנה טבלה ועכשיו אנחנו יודעים שכל מה שנמצא בטבלה הזאת בעצם מתאר לי סוג מסוים של נתונים. לדוגמה, טבלת קורסים. לטבלה יש בעצם כותרת מסוימת.
בואו נצבע את הכותרת הזאת בצבע אחר בכדי טיפה להבדיל אותה משאר הנתונים עצמם. מה יש לטבלת קורסים? מה שקורה זה דבר כזה: כל עמודה בטבלה מתארת לי סוג אחד מסוים של נתונים שהולכים לחזור על עצמו בכל העמודה.
לדוגמה העמודה הראשונה נקרא לה שם הקורס, העמודה השנייה תהיה נניח תיאור הקורס, העמודה השלישית לדוגמה תהיה חומר עזר, העמודה הרביעית תהיה לדוגמה הערות וכו'. אז מה יש בשורות עצמם?
השורות עצמם מכילות לי את המידע עצמו שאני רוצה לשמור לגבי קורסים. מקודם ראינו שהיינו שני קורסים, בישול והיינו תפירה שם הקורס לדוגמה עכשיו יכול להיות בישול תיאור כיצד לבשל בהצלחה בלה בלה בלה חומר עזר בישול וכיף הערות נפתח לראשונה בדצמבר 2011 בלה בלה בלה קורס הבא שיכול להיות לנו זה תפירה שוב
פעם קורס תופס לי שורה אחת בלבד בטבלה תיאור הקורס פור בהצלחה חומר עזר תפירה זה אחלה הערות ייפתח כאשר יש חמישה נרשמים וכולי. אז אנחנו רואים שטבלה מחזיקה אך ורק סוג אחד של נתונים, כמו זה אנחנו רואים שיש כותרת מסוימת לטבלה, או יותר נכון השמות של העמודות, וכל שורה מחזיקה לי נתונים לגבי קורס אחד, או נתונים לגבי דבר אחד שהטבלה אמורה לשמור,
כאשר בכל עמודה יש אך ורק את הסוג המסוים של הנתונים שאני מדבר עליהם. עכשיו, בנוסף אנחנו צריכים להוסיף לכל שורה איזשהו מזהה ייחודי בשביל אחר כך לאפשר לחפש את השורה הזאת לפי המזהה הזה.
המזהה הזה אמור להיות בדרך כלל איזשהו קוד מסוים שבדרך כלל לערך שלו אין כל כך משמעות הוא יכול להיות סתם איזשהו מספר רץ אבל עדיין חייבת להיות לטבלה איזשהו מזהה ייחודי עבור כל אחת מהרשומות שלה.
אז בואו נוסיף עוד עמודה נוסיף אותה כעמודה ראשונה והעמודה הזאת תהיה קוד קורס. המספרים עצמם פחות חשובים העיקר שמספר לא יחזור על עצמו פעמיים ואנחנו כרגע קיבלנו טבלה של קורסים.
הדבר הבא אנחנו יכולים לארגן טבלת תלמידים בואו נוסיף טבלת תלמידים גם כאן ראשית יש לנו קוד תלמיד לפעמים קוד יכול להיות אחד מהנתונים של התלמיד לדוגמה אם לתלמיד יש תעודת זהות הקוד יכול להיות תעודת הזהות בכל מקרה הקוד צריך להיות משהו שלא חוזר על עצמו שוב ושוב ושוב בתוך מסד הנתונים,
בתוך אותה טבלה. בדרך כלל אבל נהוג שיהיה איזשהו קוד שהוא מספרי אבל זה לא חובה. ובואו נחזור ונגדיר קוד תלמיד. לאחר מכן הנתונים של התלמיד, שם פרטי, שם משפחה, טובת, תעודת זהות וכולי.
ואז אנחנו יכולים להגדיר עכשיו את קוד התלמיד אחד, שם פרטי חיים, שם משפחה כהן, טובת הרצל 47 תל אביב, תעודת זהות ואת התלמיד הבא ריטה, לביא, הרצל, 38,
חיפה, תעודת זהות וכולי וכולי וכולי. יש לנו כרגע את כל הנתונים שאנחנו רוצים מסודרים בקבוצות.
קבוצה אחת זה טבלה והם לא חוזרים על עצמם פעמיים. כעת אנחנו צריכים רק לעשות איזשהו קישור ביניהם. בהמשך אנחנו נראה איך אנחנו קובעים איזה תלמיד לומד איזה קורס.
אבל עדיין יש לנו כאן את הפישוט הזה שכל הנתונים נמצאים במקום אחד ולא מפוזרים בכל מיני מקומות לפי המודלים הקודמים. אז המודל הזה של מודל הנתונים היחסי זה המודל שנשאר במשך כל השנים ועל פיו כתובים רוב מסדי הנתונים שקיימים היום בפלנטה.
זה המודל שאנחנו הולכים ללמוד, ודבר ראשון אנחנו הולכים ללמוד איך בעצם לבנות דבר כזה. אחרי שאנחנו ראינו שאנחנו צריכים טבלה, אחרי שאנחנו ראינו שכל עמודה בטבלה מציינת סוג אחד של נתונים, אחרי שאנחנו ראינו שהשורות עצמם מגדירות לנו את הנתונים עצמם כאשר כל שורה זה קורס או תלמיד או טלפון או כל מיני דברים כאלה
שלכל שורה יש את הנתונים משלה בקשר למידע. מבחינת מונחים טבלה זה טייבל באנגלית, עמודה זה קולום או פילד לפעמים קוראים לזה ושורה זה רואו או רקורד. בואו עכשיו נראה איך אנחנו בונים את הדבר הזה בתוך מסד נתונים מסוג SQL Server.
אז ראשית בואו נפתח את SQL Server ונבנה מסד נתונים חדש. SQL Server זה תוכנה שהיא בעצם מסד נתונים מבית מיקרוסופט שמסוגלת לשמור בתוכה הרבה מאגרי נתונים שונים.
אני רואה כאן שיש לי את חלונית Object Explorer ובה יש לי Databases. Database באנגלית זה מסד נתונים. בשביל לבנות מסד נתונים חדש, כל מה שאני צריך לעשות זה מכה שימני על דייטאבייסס, New Database.
אני נותן לו שם, בואו נניח שאנחנו רוצים לבנות מסד נתונים עבור קולג'. אז אני נותן לו את השם, קולג'.
אוקיי, המערכת יוצרת לי כרגע מסד נתונים חדש, בואו נסתכל עליו, שנקרא קולג'. בתוך מסד הנתונים אני רואה כל מיני תיקיות שאחת מהן זה טייבלס.
אז אני הולך ליצור עכשיו טבלה חדשה, New Table. בואו ניצור את הטבלה של הקורסים. אז ראשית, מה שאני מקבל כרגע זה איך השם של העמודה שאני רוצה שתתבצע.
העמודה הראשונה בדרך כלל תהיה איזשהו קוד ייחודי עבור המידע, ולכן בואו נקרא לקוד הזה CurseID. לאחר מכן אני צריך לומר מהו סוג הנתונים שנמצא בתוך העמודה הזאתי.
יש הבדלים בין סוגים שונים של נתונים. בדרך כלל קוד אמור להיות ערך מספרי שלם, ויש לנו כאן את הטיפוס int, ומגדיר לנו מספר שלם. עכשיו אני רוצה שהעמודה הזאת תהיה מזהה ייחודי עבור הטבלה, כך שכל ערך בה לא יחזור על עצמו פעמיים.
בשביל להגדיר את הדבר הזה, אני מגדיר שהעמודה הזאת היא עמודת מפתח. יש לי פה את האייקון של מפתח, ואני רואה אותו פה ליד. כעת העמודה הזאת נקראת מפתח ראשי, או באנגלית פריימרי-קי, והתפקיד שלה זה לזהות באופן חד-חד-ערכי את כל אחת מהרשומות שקיימות בטבלה.
אם אני רוצה שהמידע של העמודה הזאת תהיה מספר אוטומטי רץ, כך שמסד הנתונים ימציא לי כל פעם מספר חדש באופן רץ, כל מה שאני צריך לעשות זה לגשת לתכונות של העמודה שאני רואה פה למטה, לחפש תכונה שנקראת Identity Specification ולהגדיר Is Identity Yes.
אני יכול גם להגדיר מהו המספר הראשון Identity Seed שממנו הספירה מתחילה ובכמה קפיצות מסד הנתונים הולך לספק לי מספרים.
בי דיפולט זה 1-1, כלומר מספר מתחיל מ-1 וקופץ בקפיצות של 1. המספר הבא שהיא מצאה לי זה 2, אחר כך 3 וכו'. לאחר מכן אני נותן את התיאורים השונים שקיימים עבור הטבלה שלי, לדוגמה קורס ניים.
שם הקורס לא אמור להיות מספר אלא אמור להיות איזשהו מידע טקסטואלי. מידע טקסטואלי נקבע על ידי המאפיין nvarchar שאני יכול לתת גודל מקסימלי שבו אני רוצה שהמידע הזה יהיה.
עמודה נוספת קובעת לי האם מותר להכניס נאלס או אסור להכניס נאלס. מה זה אומר נאל? נאל זה בעצם מילה שמתארת כלום. כלומר אם כתוב לי פה allow null בעצם מותר לי לא להכניס כלום לתא הזה.
לא הגיוני שאני ארצה לבנות ולהכניס קורס חדש בלי שם ולכן אני מוריד את ה-v מאלאון נלז כך שמסד הנתונים יגיד לי אם אתה נותן לי קורס חדש אתה חייב לספק לי מידע לגבי הקורס הזה.
כלומר מידע לגבי השם הזה. לאחר מכן יש לנו קורס דסקריפשן גם הוא יכול להיות nvarchar אבל אני רוצה להכניס את המקסימום תווים שניתן ב-nvarchar.
nvarchar אני מזכיר לכם זה מידע טקסטואלי. מקס מציין לי סך הכל 4000 תווים שאני יכול להכניס לתוך השדה הזה. בואו נניח שאני לא חייב לציין תיאור עבור הקורס ולכן אני אשאיר את ה-allow null כ-true כך שלא חייבים להכניס איזשהו ערך.
העמודה הבאה תהיה רימרקס, הערות. בואו נגדיר גם כן nvarchar max, לא חייבים להכניס הערות ובואו נניח שסיימתי את מה שאני רוצה להגדיר עבור טבלת הקורסים. יש לי כאן מפתח ראשי שתפקידו לזהות באופן חד חד ערכי את פריטי הקורסים, יש לי צ'ם הקורס, יש לי תיאור עבור הקורס והערות אם אנחנו רוצים.
עכשיו אני לוחץ על save ואומר לי מה שם הטבלה שאתה רוצה להגדיר. נהוג ששם הטבלה תהיה תמיד ברבים כי היא מחזיקה ערכים רבים לגבי הנתונים.
לכן שם הטבלה תהיה Courses והטבלה נוצרת בתיקייה טייבלס אני יכול לראות אותה כאן קורסס. עכשיו שימו לב הטבלה שאנחנו רואים כאן או יותר נכון השרטוט הזה שאנחנו רואים כאן זה לא באמת הטבלה עצמה.
מה שאנחנו רואים זה רק הגדרות לגבי הטבלה, כלומר איך נקראות העמודות של הטבלה, איזה טיפוסי נתונים כל עמודה יש לה והאם מותר להכניס נ"ל או אסור להכניס נ"ל.
זאת אומרת שאם אני כרגע מסתכל רק על הנתון הזה שנמצא פה, הנתון הזה מתאר רק עמודה שנקראת קורס ניים. כל הדבר הזה מתאר לי את המאפיינים של העמודה, אבל איפה אני מכניס את המידע עצמו?
בשביל להסתכל על המידע עצמו, אני לוחץ מקש ימני על טבלת ה-Courses פה ובוחר Edit All Rows. ברגע שעשיתי את זה, אז אני רואה בעצם את אותו ציור שמקודם ראינו של המידע עצמו שנמצא בטבלה.
ואני יכול לראות עכשיו משהו שדומה לסרטוט שמקודם סרטטנו של הטבלה הזאת. בואו נסתכל עכשיו איך אני יכול להכניס נתונים. אני יכול לבוא ולהכניס נתונים ל-Course Name, ל-Description ול-Remarks.
ל-ID במקרה הזה אני לא יכול להכניס נתונים, מפני שהגדרנו מקודם מספור אוטומטי רץ ולכן מסד הנתונים ממציא לי איזשהו מספר. אז בואו נניח קורס name נקרא בישול, קורס description איך לבשל בהצלחה, הערות נפתח בדצמבר 2012 וכולי.
קורס נוסף יכול להיות תפירה איך לתפור נכון תנאי במספר משתתפים של 5 משתתפים. מה שהראתי עכשיו זה דוגמה כיצד להכניס מידע לתוך מסד הנתונים, לתוך טבלה מסוימת, דרך sql server אבל כמובן שבמציאות אף אחד לא פותח את sql server ומכניס נתונים אלא הנתונים נכנסים מתוך אתר אינטרנט.
בהמשך אנחנו נראה איך מתוך אתר אינטרנט אני מצליח להגיע למסד נתונים ולהוסיף אליו שורות חדשות לכל אחת מהטבלאות שאני רוצה. בואו נבנה טבלה נוספת. בואו נבנה טבלת התלמידים.
שוב, מכה שמוני על טייבלס, ניו טייבל, קורס ניים, קולום ניים, אני עכשיו צריך לציין את שמות העמודות, לדוגמה, יש לי קודם כל את המפתח, טיודנט איי-די, שוב אינטג'ר, בוחר אותו, מציין שהעמודה הזאת הינה מפתח ראשי, פריימרי-קי
עבור הטבלה. גם כאן אני מעוניין שמסד הנתונים ימציא לי מספרים רצים ולכן אני הולך, סליחה, גם כאן אני רוצה שמסד הנתונים ימציא לי נתונים לגבי הערכים השונים של המפתח הראשי, ולכן אני הולך ל-Identity Specification, פותח אותו, Is Identity Yes.
שוב אני רואה שהקפיצות מתחילות באחת ומתקדמות באחד, וזה מתאים לי. הדבר הבא שאני מגדיר: First Name, nvarchar 50 זה בסדר, Last Name, nvarchar 50, ID, ID דרך אגב וגם מידע מכרוז D, בניגוד למה שנהוג לחשוב שהוא מידע אינטג'רי, עדיף שהוא יהיה מידע מכרוזתי, הכוונה במכרוזתי זה טקסטואלי.
אין לי צורך שהמקסימום הוא 50, אני יכול שהוא יהיה גג 10. טובט, פה אנחנו ניתן nvarchar לדוגמה 500. שוב המספר הזה זה מספר מקסימלי עבור המידע שיכול להיכנס.
כלומר אם תוכנה או אתר ינסו להכניס ל-ID מידע שהוא יותר מעשרה תווים, מצד הנתונים לא יסכים לקבל את זה ויזרוק שגיאה החוצה ולא יסכים להכניס את המידע.
זה בעצם בא להגן על כך שלא מכניסים מידע שהוא כביכול לא כל כך נכון ולהגביל בעצם את מקסימום המידע שנכנס לכל אחד מהתאים. בואו נוסיף אימייל, נניח nvarchar 100, אולי יש איזשהו אימייל שהוא יותר מ-50 תווים וסיימתי להגדיר את טבלת התלמידים, בואו נניח לפי הדרישות שלנו, נשמור אותה,
שוב שם ברבים ויש לנו כעת, שתי טבלאות, אחת קורסים ואחת תלמידים כפי שהגדרנו לפני זה. אני יכול לראות את טבלת התלמידים כרגע על ידי Edit All Rows ולראות כמובן שהיא ריקה.
הדבר הבא שאנחנו צריכים להבין בנוגע לטבלאות ושיש סוגים שונים של טבלאות כשאנחנו מעצבים מסד נתונים. מה הכוונה בסוגים שונים? זה לא שטבלה אחת נראית אחרת מבחינת המבנה שלה מאשר טבלה כלשהי אחרת, מבחינת השירות שהטבלה נותנת לי לכל האפליקציה או לכל מסד הנתונים.
מה הכוונה? הטבלה הכי בסיסית שקיימת, הקטגוריה של הטבלה הכי בסיסית שקיימת, זה טבלה שלא תלויה בטבלאות אחרות ומחזיקה לי את המידע הראשי שאני צריך להתעסק איתו מבחינת האפליקציה שלי.
והמידע הזה זה מידע שיכול לעמוד בעצמו לבד ולא תלוי בטבלאות אחרות. לדוגמה, טבלת התלמידים לא תלויה בשום דבר אחר. תלמיד הרי לא תלוי בקורס, עדיין יכול להירשם לי תלמיד למכללה ואני רוצה להכניס אותו למאגר הנתונים, אבל עדיין הוא לא נרשם לקורס, אני רק רוצה להכניס אותו לטבלת הסטודנטים.
אז טבלת הסטודנטים נחשבת טבלה כזאתי, וטבלה כזאת נקראת טבלת בסיס או בייס טייבל. טבלת הקורסים, אם כך, היא גם טבלה כזאת. קורס הרי לא תלוי בשום דבר אחר, המכללה יכולה להחליט לפתוח איזשהו קורס, להכניס אותו לטבלה, הרי קורס לא תלוי בתלמידים, קורס לא תלוי בטלפונים של תלמידים, קורס לא תלוי בשום דבר אחר.
אם כך הסוג הראשון של הטבלאות זה טבלת בסיס שאינה תלויה במידע אחר והמידע בה יכול לעמוד לבד בפני עצמו. הסוג הבא של הטבלאות שקיים נקרא טבלת פירוט או Detailing Table.
טבלת פירוט זה כן טבלה שתלויה בטבלה אחרת והתפקיד שלה זה לתאר מידע ששייך לטבלה אחרת, כאשר המידע הזה יכול להיות מידע רב לגבי משהו בטבלה האחרת.
מה הכוונה? בואו ניגש רגע לטבלת הסטודנטס, ניגש לפירוט של טבלת הסטודנטס, יש לנו בו את טבלת התלמידים ואנחנו נמצאים בדיזיין שלה.
ועכשיו אני רוצה גם שיהיה לי איזשהו טלפון של תלמיד. אז ההיגיון אומר, אוקיי, בוא תוסיף פה טלפון. בוא נניח שטלפון זה מחרוזת ולכן nvarchar 50. יכול להיות שלתלמיד אין טלפון, אז אני אאפשר להכניס נ"ל.
עכשיו אם אני מסתכל, בואו נשמור את זה, ואני רואה את טבלת התלמידים מבחינת ה-Edit All Rows, את הטבלה עצמה ואת המידע שיש בה, אז אני יכול לראות שהתווספה לי עמודה אחת של טלפון.
אבל כאן נוצרת לנו בעיה. מה קורה אם לתלמיד יש כמה טלפונים? יכול להיות לו שיש לו טלפון אחד בבית, יכול להיות שיש לו טלפון אחד נייד או שני ניידים, יכול להיות שיש לו בנוסף גם פקס, ואני רוצה שתהיה לי אפשרות לשמור את כל הנתונים האלה לגבי הטלפון או הטלפונים של אותו תלמיד.
בגלל שראינו מקודם שכל רשומה מציינת אך ורק תלמיד אחד, לא הגיוני עכשיו שאני אקח כמה רשומות עבור אותו תלמיד כי יש לי כמה טלפונים. לא הגיוני גם שאני אכניס בעמודה של הטלפון כמה טלפונים.
החוק אומר בתא צריך להיות נתון אחד ויחיד. לדוגמה טלפון אחד, לדוגמה אימייל אחד, כרטיס אשראי אחד, כתובת אחת וכולי. לא מכניסים מספר טלפונים בתא אחד, כי לאחר מכן כשאנחנו נבצע איזשהו חיפוש לגבי טלפון או שנרצה למשוך את הטלפונים, אם אני אכניס כאן מספר טלפונים אז אני אקבל גוש של טלפונים אחד שיהיה לתוכנה מאוד מאוד קשה לעבוד איתו ולהתחיל לפרק אותו.
אז איך אנחנו פותרים את הבעיה הזאת? שעדיין כל תא מכיל טלפון אחד, עדיין אני יכול לשמור כמה טלפונים ועדיין לכל תלמיד יש רק רשומה אחת. אז כאן נכנסת הסוגה הבאה של הטבלה שנקרא טבלת פירוט והתפקיד שלה זה לפרט טלפונים של תלמידים.
אז בואו נחזור רגע לתצוגה הזאת של הדיזיין, נמחק מכאן את הטלפון, נשמור את הנתונים ואנחנו עכשיו צריכים לבנות עוד טבלה והטבלה הזאת התפקיד שלה זה להחזיק טלפונים של תלמידים.
אז שוב יש לי מזהה ייחודי עבור הטבלה הזאת שתפקידו לזהות באופן חד חד ערכי את כל אחת מהרשומות של הטבלה, נקרא לו phoneID שוב פעם יהיה אינטג'ר כל העמודה הזאת תוגדר כמופתח ראשי פריימרי קי נציין באידנטיטי ספסיפיקיישן yes בכדי שהמסד נתונים יארגן לנו איזשהו מספר אוטומטי רץ לגבי כל טלפון שנמצא בטבלה וכעת נחשוב איזה עמודות אנחנו צריכים בטבלה הזאת בשביל לתאר
טלפון של תלמיד או מספר טלפונים של תלמיד. ראשית אנחנו צריכים לדעת עבור איזה תלמיד שנמצא בטבלת התלמידים אנחנו רוצים את הטלפון. כאן מגיע עוד עיקרון מאוד מאוד חשוב באפיון מסד נתונים שאומר אין לשכפל מידע בין הטבלאות השונות של מסד הנתונים והדבר היחידי שמותר לשכפל זה רק מפתחות ראשיים.
אז עכשיו אני מסתכל ואני אומר אוקיי המפתח הראשי של טבלת התלמידים זה סטיודנט איי.די עבור תלמיד הראשון זה 1 עבור התלמיד השני זה 2 איזשהו מספר רץ. אז עכשיו אני יכול לקחת את אותו מספר ולומר שאני רוצה לתאר לאיזה תלמיד שייך הטלפון על ידי המספר הזה.
בטבלת התלמידים המפתח הראשי נקרא student ID. נהוג שזה יהיה בדיוק את אותו השם עבור העמודה הזאת שמתארת את הערך הזה. לכן גם כאן אני אגדיר student ID. סוג הנתונים הוא כמובן אינטג'ר מפני שבטבלה המקורית זה מופיע כאינט ואני לא מרשה שיהיה נאל כי אם אני מוסיף טלפון, אוטומטית אני רוצה לשייך אותו לתלמיד, לא הגיוני שיהיה לי טלפון של תלמיד והוא לא
משוייך לאף תלמיד. הדבר הבא שאני רוצה להגדיר זה את המספר טלפון, for number, זה כמובן יכול להיות nvarchar.
הדבר הבא שאני רוצה להגדיר, בואו נניח האם הטלפון הזה פעיל או לא פעיל. יכול להיות שעם הזמן הטלפון לא פעיל, ואני רוצה לציין שהוא לא פעיל אבל עדיין לא למחוק את הטלפון מהטבלה.
isActive יכול להיות סוג נתונים מאוד מיוחד שנקרא ביט. סך הכל מאפשר להכניס או True או False. בואו נגדיר שכרגע אני חייב להכניס טלפון, אבל אני לא חייב להכניס אם הוא פעיל או לא פעיל.
דרך אגב, אם אני רוצה שאוטומטית ייכנס לי ערך מסוים שאני רוצה להכניס ב-Is Active או בכל עמודה אחרת, אני יכול גם את זה להגדיר בתכונות.
אני ניגש לאוסף התכונות ומחפש תכונה שנקראת "Default Value or Binding", ומגדיר כאן את אותו ערך שאני רוצה להכניס. בואו נחליט ש-true זה הולך להיות טלפון פעיל, false הולך להיות טלפון לא פעיל.
מה שאנחנו מציינים בביט זה 1 או 0 ולכן אני מגדיר ש-1 זה בעצם אומר שהטלפון פעיל. שמתי כאן 1 וברגע שיכניסו רשומה חדשה לטבלת הטלפונים הזאת, אוטומטית הערך הזה יהיה 1. בואו נשמור, נקרא לטבלה הזאת phones וכעת יש לי טבלת טלפונים.
בואו נסתכל עליה. כעת אנחנו רואים שיש לנו טבלת טלפונים ובה אני יכול להכניס טלפונים שונים, אפילו אני יכול להכניס מספר טלפונים לאותו תלמיד.
מה הכוונה? בואו נלך ונכניס איזשהו תלמיד בטבלת הטלפונים. את זה אנחנו יכולים לסגור, את זה אנחנו יכולים לסגור.
נפתח קודם כל את טבלת התלמידים, נכניס תלמיד חדש, בואו נכניס עוד אחד ויש לי כרגע שני תלמידים