מסדי נתונים ו-MySQL מערך שיעור למרצה

מערך שיעור: מהו Database וחיבור ראשוני

משך: יום לימוד מלא — 6 שעות אקדמיות (270 דקות).

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

בסוף השיעור הסטודנטים צריכים:

  1. להסביר את היתרונות של Database על קובץ JSON, ולתכנן טבלה (עמודות, טיפוסים, Primary Key, NOT NULL/UNIQUE) מתוך דרישה או Class.
  2. להריץ את MySQL בקונטיינר של Docker, להתחבר אליו מ-VS Code עם Database Client, ולהסביר מה הוא Driver ומהם פרטי החיבור.
  3. לפתוח חיבור, להריץ שאילתת בדיקה, לקרוא תוצאה, ולסגור עם try/finally, באמצעות get_connection() משותפת.

דגש קריטי: “רק הבסיס הנדרש”. הסילבוס מדגיש במפורש שלא הופכים את השבוע לקורס SQL. אין JOIN, אין GROUP BY ואין נרמול. אם סטודנטים מתקדמים שואלים, לתת כיוון קצר (“Foreign Key ו-JOIN, בהמשך המסלול”) ולהמשיך.


מהלך השיעור

חלק בשיעורמשךהערות ודגשים
פתיחה: למה לא JSON?25 דק'שני סטודנטים “מעדכנים” את אותו קובץ JSON על המסך בו-זמנית, ושינוי נדרס. טבלת הבעיות.
טבלה, שורה, עמודה, Primary Key35 דק'ארון התיקים. מ-Product (נושא OOP) לתכנון טבלה, יחד על הלוח.
טיפוסים ואילוצים25 דק'טלפון כ-TEXT. bool כ-0/1. NOT NULL/UNIQUE = “ולידציה במסד”.
הפסקה15 דק'
MySQL ב-Docker, Database Client, Driver40 דק'docker run של הקונטיינר — כולם יחד, ובודקים עם docker ps. חיבור מ-Database Client. מתאם החשמל (Driver). חמשת פרטי החיבור (host + port — קישור לנושא רשתות). הקמת school-db.
הפסקה15 דק'
Connection: פתיחה, בדיקה, סגירה50 דק'Cursor, fetchone/fetchall. הדגמת מלכודת ה-with בלייב. try/finally. get_connection.
תרגול + Mini Project50 דק'db.py עם Health Check. Commit.
בדוק את עצמך15 דק'

דגשים להעברת השיעור

  • הגשר מאתמול: להתחיל בהפעלה מחדש של שרת הזיכרון, והסטודנט שנעלם. “איפה שומרים נתונים בשרת אמיתי?”
  • מ-OOP לטבלאות: Class ≈ Table, Attribute ≈ Column, אובייקט ≈ Row. ההקבלה מורידה את הפחד מ"עוד נושא חדש".
  • “ולידציה במסד” (NOT NULL, UNIQUE) כשכבת הגנה נוספת, בדיוק כמו Validation ב-__init__. להדגיש שזה לא במקום ולידציה בקוד, אלא בנוסף.
  • Connection String = URL — חיבור חזק לנושא מחשב, מערכת הפעלה ורשת (Protocol, Host, Port).
  • Docker Desktop פתוח ורץ אצל כל הסטודנטים לפני docker run — רוב התקלות הן “failed to connect to the docker API”. מי שנכשל בהתקנה בשבוע 1 — לטפל בזה לפני השיעור.
  • docker run פעם אחת, אחר כך docker start — להדגים בלייב את שגיאת “container name is already in use”. זה יחזור אצל רבים אחרי הפעלה מחדש של המחשב.
  • מלכודת ה-with — לא לדלג. סטודנטים שזוכרים את with open מניחים אוטומטית שזה סוגר.
  • כלי צפייה — להתקין בכיתה. לראות “בעיניים” את הטבלאות והשורות (מחר) עוזר מאוד להבנה.

מושגים

מושגהסבר קצר
Database / DBMSנתונים מאורגנים / התוכנה שמנהלת אותם.
Relational Databaseמסד שמארגן נתונים בטבלאות.
Table / Row / Columnטבלה / רשומה / שדה עם טיפוס.
Primary Keyמזהה ייחודי, לא ריק ולא משתנה.
AUTOINCREMENTהמסד מייצר id עולה לבד.
INT / DECIMAL / VARCHAR / NULLטיפוסי הבסיס שנשתמש בהם ב-MySQL.
NOT NULL / UNIQUEאילוצים: חובה / ייחודי.
SQL / Queryשפת המסד / פקודה אחת.
Database Serverתהליך שמאזין על פורט (MySQL: 3306), ומתחברים אליו ברשת.
Driverספרייה שמחברת קוד לסוג מסד (mysql-connector-python).
Image / Containerהתבנית (mysql:8.4) / העותק שרץ ממנה.
Environment Variableמשתנה סביבה, למשל לפרטי חיבור וסודות.
Connection / Cursorערוץ פתוח למסד / מריץ שאילתה ומחזיק תוצאות.
fetchone / fetchallשורה אחת או None / רשימת שורות.
Health Checkשאילתת בדיקה (SELECT 1).
Database Clientתוסף VS Code לצפייה במסד ולהרצת SQL.

תרגיל חשיבה

שאלת פתיחה (תחילת היום): “השרת שלנו שומר סטודנטים בקובץ students.json. ביום ההרשמה, 200 סטודנטים נרשמים באותה דקה. מה עלול להשתבש?”

מהלך:

  1. לתת לכיתה 3 דקות לחשוב בזוגות.
  2. לאסוף תשובות. להוביל לשלוש: (א) מירוץ (Race Condition): שתי בקשות קוראות את אותו קובץ, כל אחת מוסיפה סטודנט וכותבת, ואחד הסטודנטים נמחק. (ב) ביצועים: כל בקשה קוראת וכותבת קובץ שלם. (ג) קריסה באמצע כתיבה: קובץ פגום.
  3. להמחיש את (א): שני סטודנטים ליד הלוח, כל אחד “קורא” את הרשימה (מעתיק לדף), מוסיף שם, ו"כותב" (מוחק את הלוח וכותב את הדף שלו). רק שם אחד נשאר.
  4. לשאול: “מה צריך כדי שזה לא יקרה?” ולהגיע ל: מערכת שמנהלת גישה בו-זמנית, כותבת רק מה שהשתנה, ומבטיחה שלמות. Database.

מה המרצה מראה בסוף: את טבלת “בעיה בקובץ JSON / מה קורה”, ולידה טבלת students מצוירת (עמודות, שורות, PK). משפט סיום: “קובץ שומר נתונים. Database מנהל אותם. מחר נכניס לטבלה את השורות הראשונות.”