![]() |
|---|
| עבודה עם נתונים: מסדי נתונים יחסיים - סקיצה מאת @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 | אוקלנד | ניו זילנד |
✅ תשימו לב שאנחנו משתמשים במונחים "מזהה" ו"מפתח ראשי" לסירוגין במהלך השיעור. המושגים כאן חלים גם על DataFrames, שתחקורו בהמשך. DataFrames לא משתמשים במונח "מפתח ראשי", אך תבחינו שהם מתנהגים באופן דומה מאוד.
עם יצירת טבלת הערים שלנו, בואו נשמור את נתוני הגשמים. במקום לשכפל את המידע המלא על העיר, נוכל להשתמש במזהה. אנחנו גם צריכים לוודא שלטבלה החדשה שנוצרה יש עמודת מזהה, כמו שכל טבלה צריכה שיהיה לה מזהה או מפתח ראשי.
| 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
-- AucklandSELECT הוא המקום שבו אתם מציינים את העמודות, ו-FROM הוא המקום שבו אתם מציינים את הטבלאות.
Note
תחביר SQL אינו תלוי רישיות, כלומר select ו-SELECT הם אותו דבר. עם זאת, תלוי בסוג מסד הנתונים שבו אתם משתמשים, ייתכן שהעמודות והטבלאות יהיו רגישות לרישיות. כתוצאה מכך, זהו נוהג טוב תמיד להתייחס לכל דבר בתכנות כאילו הוא רגיש לרישיות. כאשר כותבים שאילתות SQL, נהוג לכתוב את מילות המפתח באותיות גדולות.
השאילתה למעלה תציג את כל הערים. בואו נדמיין שאנחנו רוצים להציג רק ערים בניו זילנד. אנחנו צריכים איזשהו מסנן. מילת המפתח של SQL לכך היא WHERE, או "איפה משהו נכון".
SELECT city
FROM cities
WHERE country = 'New Zealand';
-- Output:
-- Aucklandעד עכשיו שלפנו נתונים מטבלה אחת בלבד. עכשיו אנחנו רוצים לחבר את הנתונים משתי הטבלאות ערים וגשמים. זה נעשה על ידי חיבור שלהן יחד. למעשה תיצרו חיבור בין שתי הטבלאות, ותתאימו את הערכים מעמודה מכל טבלה.
בדוגמה שלנו, נתאים את עמודת city_id בגשמים עם עמודת city_id בערים. זה יתאים את ערך הגשמים לעיר המתאימה לו. סוג החיבור שנבצע נקרא חיבור פנימי, כלומר אם יש שורות שלא מתאימות לשום דבר מהטבלה השנייה, הן לא יוצגו. במקרה שלנו לכל עיר יש נתוני גשמים, כך שהכל יוצג.
בואו נשלוף את נתוני הגשמים של שנת 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
הצהרת אחריות:
מסמך זה תורגם באמצעות שירות תרגום AI Co-op Translator. למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי אנושי. אנו לא נושאים באחריות לאי הבנות או פירושים שגויים הנובעים משימוש בתרגום זה.
