You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

195 lines
13 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "9399d7b4767e75068f95ce5c660b285c",
"translation_date": "2025-09-05T23:14:57+00:00",
"source_file": "2-Working-With-Data/05-relational-databases/README.md",
"language_code": "he"
}
-->
# עבודה עם נתונים: מסדי נתונים יחסיים
|![ סקצ'נוט מאת [(@sketchthedocs)](https://sketchthedocs.dev) ](../../sketchnotes/05-RelationalData.png)|
|:---:|
| עבודה עם נתונים: מסדי נתונים יחסיים - _סקצ'נוט מאת [@nitya](https://twitter.com/nitya)_ |
סביר להניח שכבר השתמשת בעבר בגיליון אלקטרוני כדי לאחסן מידע. היו לך שורות ועמודות, כאשר השורות הכילו את המידע (או הנתונים), והעמודות תיארו את המידע (לפעמים נקראות מטא-נתונים). מסד נתונים יחסי מבוסס על העיקרון הבסיסי הזה של עמודות ושורות בטבלאות, ומאפשר לך לפזר מידע על פני מספר טבלאות. זה מאפשר לך לעבוד עם נתונים מורכבים יותר, להימנע מכפילויות, ולהיות גמיש יותר באופן שבו אתה חוקר את הנתונים. בואו נחקור את המושגים של מסד נתונים יחסי.
## [שאלון לפני ההרצאה](https://ff-quizzes.netlify.app/en/ds/quiz/8)
## הכל מתחיל בטבלאות
בלב מסד נתונים יחסי נמצאות הטבלאות. בדיוק כמו בגיליון אלקטרוני, טבלה היא אוסף של עמודות ושורות. השורה מכילה את הנתונים או המידע שאיתו אנו רוצים לעבוד, כמו שם של עיר או כמות המשקעים. העמודות מתארות את הנתונים שהן מאחסנות.
נתחיל את החקירה שלנו ביצירת טבלה לאחסון מידע על ערים. נתחיל עם שמות הערים והמדינות שלהן. ניתן לאחסן זאת בטבלה כך:
| עיר | מדינה |
| -------- | ------------- |
| טוקיו | יפן |
| אטלנטה | ארצות הברית |
| אוקלנד | ניו זילנד |
שימו לב ששמות העמודות **עיר**, **מדינה** ו-**אוכלוסייה** מתארים את הנתונים המאוחסנים, וכל שורה מכילה מידע על עיר אחת.
## החסרונות של גישה עם טבלה אחת
סביר להניח שהטבלה למעלה נראית לך מוכרת. בואו נתחיל להוסיף נתונים נוספים למסד הנתונים המתפתח שלנו - כמות המשקעים השנתית (במילימטרים). נתמקד בשנים 2018, 2019 ו-2020. אם נוסיף את הנתונים עבור טוקיו, זה עשוי להיראות כך:
| עיר | מדינה | שנה | כמות |
| ----- | ----- | ---- | ----- |
| טוקיו | יפן | 2020 | 1690 |
| טוקיו | יפן | 2019 | 1874 |
| טוקיו | יפן | 2018 | 1445 |
מה אתה שם לב לגבי הטבלה שלנו? ייתכן שתבחין שאנחנו משכפלים את שם העיר והמדינה שוב ושוב. זה עלול לתפוס הרבה מקום אחסון, וזה מיותר ברובו. אחרי הכול, לטוקיו יש רק שם אחד שמעניין אותנו.
בסדר, בואו ננסה משהו אחר. נוסיף עמודות חדשות לכל שנה:
| עיר | מדינה | 2018 | 2019 | 2020 |
| -------- | ------------- | ---- | ---- | ---- |
| טוקיו | יפן | 1445 | 1874 | 1690 |
| אטלנטה | ארצות הברית | 1779 | 1111 | 1683 |
| אוקלנד | ניו זילנד | 1386 | 942 | 1176 |
בעוד שזה נמנע מכפילויות בשורות, זה מוסיף כמה אתגרים אחרים. נצטרך לשנות את מבנה הטבלה בכל פעם שיש שנה חדשה. בנוסף, ככל שהנתונים שלנו יגדלו, השימוש בשנים כעמודות יהפוך את החישובים והשליפות למורכבים יותר.
זו הסיבה שאנחנו צריכים טבלאות מרובות וקשרים ביניהן. על ידי פיצול הנתונים נוכל להימנע מכפילויות ולהיות גמישים יותר באופן שבו אנו עובדים עם הנתונים.
## מושגי קשרים
בואו נחזור לנתונים שלנו ונקבע כיצד נרצה לפצל אותם. אנחנו יודעים שאנחנו רוצים לאחסן את שם העיר והמדינה שלה, כך שזה כנראה יעבוד הכי טוב בטבלה אחת.
| עיר | מדינה |
| -------- | ------------- |
| טוקיו | יפן |
| אטלנטה | ארצות הברית |
| אוקלנד | ניו זילנד |
אבל לפני שניצור את הטבלה הבאה, אנחנו צריכים להבין איך להתייחס לכל עיר. אנחנו צריכים סוג של מזהה, ID או (במונחים טכניים של מסדי נתונים) מפתח ראשי. מפתח ראשי הוא ערך המשמש לזיהוי שורה מסוימת בטבלה. למרות שזה יכול להיות מבוסס על ערך עצמו (למשל, שם העיר), כמעט תמיד עדיף שזה יהיה מספר או מזהה אחר. אנחנו לא רוצים שהמזהה ישתנה אי פעם, כי זה ישבור את הקשר. ברוב המקרים, המפתח הראשי או ה-ID יהיה מספר שנוצר אוטומטית.
> ✅ מפתח ראשי מקוצר לעיתים קרובות כ-PK
### ערים
| city_id | עיר | מדינה |
| ------- | -------- | ------------- |
| 1 | טוקיו | יפן |
| 2 | אטלנטה | ארצות הברית |
| 3 | אוקלנד | ניו זילנד |
> ✅ שימו לב שאנחנו משתמשים במונחים "id" ו"מפתח ראשי" לסירוגין במהלך השיעור. המושגים כאן חלים גם על DataFrames, שתחקור בהמשך. DataFrames לא משתמשים במונח "מפתח ראשי", אך תבחין שהם מתנהגים באופן דומה.
עם יצירת טבלת הערים שלנו, בואו נאחסן את נתוני המשקעים. במקום לשכפל את כל המידע על העיר, נוכל להשתמש ב-ID. עלינו גם לוודא שלטבלה החדשה שניצור יהיה עמודת *id*, שכן לכל טבלה צריך להיות 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** בטבלת **משקעים** החדשה. עמודה זו מכילה ערכים שמפנים ל-IDs בטבלת **ערים**. במונחים טכניים של נתונים יחסיים, זה נקרא **מפתח זר**; זהו מפתח ראשי מטבלה אחרת. אפשר לחשוב על זה כהפניה או מצביע. **city_id** 1 מתייחס לטוקיו.
> [!NOTE] מפתח זר מקוצר לעיתים קרובות כ-FK
## שליפת הנתונים
עם הנתונים שלנו מחולקים לשתי טבלאות, ייתכן שאתה תוהה איך לשלוף אותם. אם אנחנו משתמשים במסד נתונים יחסי כמו MySQL, SQL Server או Oracle, נוכל להשתמש בשפה שנקראת Structured Query Language או SQL. SQL (לפעמים נהגה "סיקוול") היא שפה סטנדרטית המשמשת לשליפה ושינוי נתונים במסד נתונים יחסי.
כדי לשלוף נתונים משתמשים בפקודה `SELECT`. בבסיסה, אתה **בוחר** את העמודות שאתה רוצה לראות **מתוך** הטבלה שבה הן נמצאות. אם תרצה להציג רק את שמות הערים, תוכל להשתמש בפקודה הבאה:
```sql
SELECT city
FROM cities;
-- Output:
-- Tokyo
-- Atlanta
-- Auckland
```
`SELECT` הוא המקום שבו אתה מציין את העמודות, ו-`FROM` הוא המקום שבו אתה מציין את הטבלאות.
> [NOTE] תחביר SQL אינו תלוי רישיות, כלומר `select` ו-`SELECT` הם אותו הדבר. עם זאת, בהתאם לסוג מסד הנתונים שבו אתה משתמש, העמודות והטבלאות עשויות להיות תלויי רישיות. כתוצאה מכך, מומלץ תמיד להתייחס לכל דבר בתכנות כאילו הוא תלוי רישיות. כאשר כותבים שאילתות SQL, נהוג לכתוב את מילות המפתח באותיות גדולות.
השאילתה למעלה תציג את כל הערים. נניח שאנחנו רוצים להציג רק ערים בניו זילנד. אנחנו צריכים סוג של מסנן. מילת המפתח SQL עבור זה היא `WHERE`, או "איפה שמשהו נכון".
```sql
SELECT city
FROM cities
WHERE country = 'New Zealand';
-- Output:
-- Auckland
```
## חיבור נתונים
עד עכשיו שלפנו נתונים מטבלה אחת. עכשיו אנחנו רוצים לחבר את הנתונים משתי הטבלאות **ערים** ו-**משקעים**. זה נעשה על ידי *חיבור* שלהן יחד. למעשה תיצור חיבור בין שתי הטבלאות, ותתאים את הערכים מעמודה מכל טבלה.
בדוגמה שלנו, נתאים את עמודת **city_id** בטבלת **משקעים** לעמודת **city_id** בטבלת **ערים**. זה יתאים את ערך המשקעים לעיר המתאימה לו. סוג החיבור שנבצע נקרא *חיבור פנימי* (inner join), כלומר אם יש שורות שלא מתאימות לשום דבר מהטבלה השנייה, הן לא יוצגו. במקרה שלנו לכל עיר יש נתוני משקעים, כך שהכול יוצג.
בואו נשלוף את נתוני המשקעים לשנת 2019 עבור כל הערים שלנו.
נעשה זאת בשלבים. השלב הראשון הוא לחבר את הנתונים יחד על ידי ציון העמודות לחיבור - **city_id** כפי שהודגש קודם.
```sql
SELECT cities.city
rainfall.amount
FROM cities
INNER JOIN rainfall ON cities.city_id = rainfall.city_id
```
הדגשנו את שתי העמודות שאנחנו רוצים, ואת העובדה שאנחנו רוצים לחבר את הטבלאות יחד לפי **city_id**. עכשיו נוכל להוסיף את הצהרת `WHERE` כדי לסנן רק את שנת 2019.
```sql
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
```
## סיכום
מסדי נתונים יחסיים מתמקדים בחלוקת מידע בין טבלאות מרובות שמחוברות יחד לצורך תצוגה וניתוח. זה מספק גמישות גבוהה לביצוע חישובים ולעבודה עם נתונים. ראית את המושגים המרכזיים של מסד נתונים יחסי, ואיך לבצע חיבור בין שתי טבלאות.
## 🚀 אתגר
ישנם מסדי נתונים יחסיים רבים זמינים באינטרנט. תוכל לחקור את הנתונים באמצעות הכישורים שלמדת כאן.
## שאלון לאחר ההרצאה
## [שאלון לאחר ההרצאה](https://ff-quizzes.netlify.app/en/ds/quiz/9)
## סקירה ולמידה עצמית
ישנם מספר משאבים זמינים ב-[Microsoft Learn](https://docs.microsoft.com/learn?WT.mc_id=academic-77958-bethanycheum) להמשך חקירת SQL ומושגי מסדי נתונים יחסיים:
- [תיאור מושגי נתונים יחסיים](https://docs.microsoft.com//learn/modules/describe-concepts-of-relational-data?WT.mc_id=academic-77958-bethanycheum)
- [התחלה עם שאילתות ב-Transact-SQL](https://docs.microsoft.com//learn/paths/get-started-querying-with-transact-sql?WT.mc_id=academic-77958-bethanycheum) (Transact-SQL היא גרסה של SQL)
- [תוכן SQL ב-Microsoft Learn](https://docs.microsoft.com/learn/browse/?products=azure-sql-database%2Csql-server&expanded=azure&WT.mc_id=academic-77958-bethanycheum)
## משימה
[כותרת המשימה](assignment.md)
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי-דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור הסמכותי. למידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי בני אדם. איננו נושאים באחריות לאי-הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.