14 KiB
עבודה עם נתונים: מסדי נתונים יחסיים
![]() |
---|
עבודה עם נתונים: מסדי נתונים יחסיים - סקצ'נוט מאת @nitya |
סביר להניח שבעבר השתמשתם בגיליון אלקטרוני כדי לאחסן מידע. היו לכם שורות ועמודות, כאשר השורות הכילו את המידע (או הנתונים), והעמודות תיארו את המידע (לפעמים נקראות מטא-נתונים). מסד נתונים יחסי מבוסס על העיקרון הבסיסי הזה של עמודות ושורות בטבלאות, ומאפשר לכם לפזר מידע על פני מספר טבלאות. זה מאפשר לכם לעבוד עם נתונים מורכבים יותר, להימנע מכפילויות, ולהיות גמישים יותר באופן שבו אתם חוקרים את הנתונים. בואו נחקור את המושגים של מסד נתונים יחסי.
שאלון לפני ההרצאה
הכל מתחיל בטבלאות
בלב מסד נתונים יחסי נמצאות הטבלאות. בדיוק כמו בגיליון אלקטרוני, טבלה היא אוסף של עמודות ושורות. השורה מכילה את הנתונים או המידע שאנו רוצים לעבוד איתו, כמו שם של עיר או כמות המשקעים. העמודות מתארות את הנתונים שהן מאחסנות.
בואו נתחיל את החקירה שלנו ביצירת טבלה לאחסון מידע על ערים. נתחיל עם שמן והמדינה שבה הן נמצאות. ניתן לאחסן זאת בטבלה כך:
עיר | מדינה |
---|---|
טוקיו | יפן |
אטלנטה | ארצות הברית |
אוקלנד | ניו זילנד |
שימו לב ששמות העמודות עיר, מדינה ו-אוכלוסייה מתארים את הנתונים המאוחסנים, וכל שורה מכילה מידע על עיר אחת.
החסרונות של גישה עם טבלה אחת
סביר להניח שהטבלה למעלה נראית לכם מוכרת. בואו נתחיל להוסיף נתונים נוספים למסד הנתונים המתפתח שלנו - כמות המשקעים השנתית (במילימטרים). נתמקד בשנים 2018, 2019 ו-2020. אם נוסיף זאת עבור טוקיו, זה עשוי להיראות כך:
עיר | מדינה | שנה | כמות |
---|---|---|---|
טוקיו | יפן | 2020 | 1690 |
טוקיו | יפן | 2019 | 1874 |
טוקיו | יפן | 2018 | 1445 |
מה אתם שמים לב לגבי הטבלה שלנו? ייתכן שתשימו לב שאנו משכפלים את שם העיר והמדינה שוב ושוב. זה עלול לתפוס הרבה מקום אחסון, וזה בעיקר מיותר להחזיק עותקים מרובים. אחרי הכל, לטוקיו יש רק שם אחד שמעניין אותנו.
בסדר, בואו ננסה משהו אחר. נוסיף עמודות חדשות לכל שנה:
עיר | מדינה | 2018 | 2019 | 2020 |
---|---|---|---|---|
טוקיו | יפן | 1445 | 1874 | 1690 |
אטלנטה | ארצות הברית | 1779 | 1111 | 1683 |
אוקלנד | ניו זילנד | 1386 | 942 | 1176 |
בעוד שזה נמנע מכפילויות בשורות, זה מוסיף כמה אתגרים אחרים. נצטרך לשנות את מבנה הטבלה בכל פעם שיש שנה חדשה. בנוסף, ככל שהנתונים שלנו יגדלו, השימוש בשנים כעמודות יהפוך את החישובים והשליפות למורכבים יותר.
זו הסיבה שאנו זקוקים למספר טבלאות ויחסים ביניהן. על ידי פיצול הנתונים אנו יכולים להימנע מכפילויות ולהיות גמישים יותר באופן שבו אנו עובדים עם הנתונים.
מושגי היחסים
בואו נחזור לנתונים שלנו ונקבע כיצד אנו רוצים לפצל אותם. אנו יודעים שאנו רוצים לאחסן את שם העיר והמדינה שלהן, כך שזה כנראה יעבוד הכי טוב בטבלה אחת.
עיר | מדינה |
---|---|
טוקיו | יפן |
אטלנטה | ארצות הברית |
אוקלנד | ניו זילנד |
אבל לפני שניצור את הטבלה הבאה, אנו צריכים להבין כיצד להתייחס לכל עיר. אנו זקוקים לצורה כלשהי של מזהה, ID או (במונחים טכניים של מסדי נתונים) מפתח ראשי. מפתח ראשי הוא ערך המשמש לזיהוי שורה מסוימת בטבלה. בעוד שזה יכול להיות מבוסס על ערך עצמו (למשל, שם העיר), כמעט תמיד עדיף שזה יהיה מספר או מזהה אחר. איננו רוצים שהמזהה ישתנה אי פעם, שכן זה ישבור את היחס. ברוב המקרים, המפתח הראשי או המזהה יהיה מספר שנוצר אוטומטית.
✅ מפתח ראשי מקוצר לעיתים קרובות כ-PK
ערים
city_id | עיר | מדינה |
---|---|---|
1 | טוקיו | יפן |
2 | אטלנטה | ארצות הברית |
3 | אוקלנד | ניו זילנד |
✅ שימו לב שאנו משתמשים במונחים "id" ו"מפתח ראשי" לסירוגין במהלך השיעור. המושגים הללו חלים גם על DataFrames, שתלמדו עליהם בהמשך. DataFrames אינם משתמשים במונח "מפתח ראשי", אך תבחינו שהם מתנהגים באופן דומה.
עם יצירת טבלת הערים שלנו, בואו נאחסן את נתוני המשקעים. במקום לשכפל את המידע המלא על העיר, אנו יכולים להשתמש במזהה. עלינו גם לוודא שלטבלה החדשה שניצור יהיה עמודת id, שכן לכל טבלה צריך להיות מזהה או מפתח ראשי.
משקעים
rainfall_id | city_id | שנה | כמות |
---|---|---|---|
1 | 1 | 2018 | 1445 |
2 | 1 | 2019 | 1874 |
3 | 1 | 2020 | 1690 |
4 | 2 | 2018 | 1779 |
5 | 2 | 2019 | 1111 |
6 | 2 | 2020 | 1683 |
7 | 3 | 2018 | 1386 |
8 | 3 | 2019 | 942 |
9 | 3 | 2020 | 1176 |
שימו לב לעמודת city_id בטבלת משקעים החדשה שנוצרה. עמודה זו מכילה ערכים שמפנים למזהים בטבלת ערים. במונחים טכניים של נתונים יחסיים, זה נקרא מפתח זר; זהו מפתח ראשי מטבלה אחרת. אתם יכולים לחשוב על זה כהפניה או מצביע. city_id 1 מפנה לטוקיו.
[!NOTE] מפתח זר מקוצר לעיתים קרובות כ-FK
שליפת הנתונים
עם הנתונים שלנו מחולקים לשתי טבלאות, אתם עשויים לתהות כיצד אנו שולפים אותם. אם אנו משתמשים במסד נתונים יחסי כמו MySQL, SQL Server או Oracle, אנו יכולים להשתמש בשפה שנקראת Structured Query Language או SQL. SQL (לפעמים נהגית "סיקוול") היא שפה סטנדרטית המשמשת לשליפה ושינוי נתונים במסד נתונים יחסי.
כדי לשלוף נתונים משתמשים בפקודה SELECT
. בבסיסה, אתם בוחרים את העמודות שאתם רוצים לראות מתוך הטבלה שבה הן נמצאות. אם תרצו להציג רק את שמות הערים, תוכלו להשתמש בפקודה הבאה:
SELECT city
FROM cities;
-- Output:
-- Tokyo
-- Atlanta
-- Auckland
SELECT
הוא המקום שבו אתם מציינים את העמודות, ו-FROM
הוא המקום שבו אתם מציינים את הטבלאות.
[NOTE] תחביר SQL אינו תלוי רישיות, כלומר
select
ו-SELECT
הם אותו הדבר. עם זאת, תלוי בסוג מסד הנתונים שבו אתם משתמשים, ייתכן שהעמודות והטבלאות יהיו תלויי רישיות. כתוצאה מכך, זו פרקטיקה טובה תמיד להתייחס לכל דבר בתכנות כאילו הוא תלוי רישיות. כאשר כותבים שאילתות SQL, נהוג לכתוב את מילות המפתח באותיות גדולות.
השאילתה למעלה תציג את כל הערים. בואו נדמיין שאנו רוצים להציג רק ערים בניו זילנד. אנו זקוקים לצורה כלשהי של מסנן. מילת המפתח SQL עבור זה היא WHERE
, או "איפה שמשהו נכון".
SELECT city
FROM cities
WHERE country = 'New Zealand';
-- Output:
-- Auckland
חיבור נתונים
עד עכשיו שלפנו נתונים מטבלה אחת. כעת אנו רוצים לחבר את הנתונים משתי הטבלאות ערים ו-משקעים. זה נעשה על ידי חיבור שלהן יחד. למעשה תיצרו חיבור בין שתי הטבלאות, ותתאימו את הערכים מעמודה מכל טבלה.
בדוגמה שלנו, נתאים את עמודת city_id בטבלת משקעים לעמודת city_id בטבלת ערים. זה יתאים את ערך המשקעים לעיר המתאימה לו. סוג החיבור שנבצע נקרא חיבור פנימי (inner join), כלומר אם יש שורות שלא מתאימות לשום דבר מהטבלה השנייה, הן לא יוצגו. במקרה שלנו לכל עיר יש נתוני משקעים, כך שהכל יוצג.
בואו נשלוף את נתוני המשקעים לשנת 2019 עבור כל הערים שלנו.
נעשה זאת בשלבים. השלב הראשון הוא לחבר את הנתונים יחד על ידי ציון העמודות לחיבור - city_id כפי שהודגש קודם.
SELECT cities.city
rainfall.amount
FROM cities
INNER JOIN rainfall ON cities.city_id = rainfall.city_id
הדגשנו את שתי העמודות שאנו רוצים, ואת העובדה שאנו רוצים לחבר את הטבלאות יחד לפי city_id. כעת נוכל להוסיף את הצהרת WHERE
כדי לסנן רק את שנת 2019.
SELECT cities.city
rainfall.amount
FROM cities
INNER JOIN rainfall ON cities.city_id = rainfall.city_id
WHERE rainfall.year = 2019
-- Output
-- city | amount
-- -------- | ------
-- Tokyo | 1874
-- Atlanta | 1111
-- Auckland | 942
סיכום
מסדי נתונים יחסיים מתמקדים בחלוקת מידע בין מספר טבלאות שמחוברות מחדש לצורך תצוגה וניתוח. זה מספק גמישות גבוהה לביצוע חישובים ולעבודה עם נתונים. ראיתם את המושגים הבסיסיים של מסד נתונים יחסי, וכיצד לבצע חיבור בין שתי טבלאות.
🚀 אתגר
ישנם מסדי נתונים יחסיים רבים זמינים באינטרנט. תוכלו לחקור את הנתונים באמצעות הכישורים שלמדתם כאן.
שאלון לאחר ההרצאה
שאלון לאחר ההרצאה
סקירה ולמידה עצמית
ישנם מספר משאבים זמינים ב-Microsoft Learn להמשך חקירת SQL ומושגי מסדי נתונים יחסיים:
- תיאור מושגי נתונים יחסיים
- התחלה עם שאילתות ב-Transact-SQL (Transact-SQL היא גרסה של SQL)
- תוכן SQL ב-Microsoft Learn
משימה
כתב ויתור:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית Co-op Translator. למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי-דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור הסמכותי. למידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי בני אדם. איננו נושאים באחריות לאי-הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.