PracticU

אסטרטגיות טעינת המידע
של Entity Framework Core

בלי כתוביותעם כתוביות
PracticU › קורס Entity Framework Core - עבודה עם מסד נתונים בדוט-נט › אסטרטגיות טעינת המידע של Entity Framework Core
מילון מושגים:
Entity Framework - ספריית מיקרוסופט שממפה בין אובייקטים בקוד לבין טבלאות במסד נתונים, ומאפשרת לעבוד עם הנתונים בלי לכתוב SQL ישיר.
פריימוורק - מסגרת תוכנה שמספקת מבנה וכלים מוכנים לפיתוח יישומים, כדי לחסוך כתיבת קוד חוזר.
רשומה - שורה בטבלת מסד נתונים שמרכזת את כל השדות של פריט אחד, למשל כל הפרטים של לקוח יחיד.
סשן - פרק זמן של פעילות רציפה בין משתמש למערכת, שבו נשמר מידע על מצבו, למשל לאחר התחברות לאתר.
שאילתה - בקשה למסד נתונים לשלוף, להוסיף, לעדכן או למחוק נתונים, לרוב בשפת SQL.
לוג - רישום מתועד של אירועים ופעולות שמתרחשים במערכת או בתוכנה, המשמש למעקב ולאיתור תקלות.
לולאה - מבנה בקרה שחוזר על קטע קוד שוב ושוב כל עוד תנאי מתקיים או עבור כל פריט באוסף.
Join - פעולת SQL שמשלבת שורות משתי טבלאות או יותר על בסיס קשר ביניהן.

אסטרטגיות טעינת המידע של Entity Framework Core
כשמציגים רשומות מטבלה ראשית וגם מידע מטבלה קשורה, צריך להחליט מתי להביא את המידע הנלווה. ההרצאה מציגה את שלוש אסטרטגיות הטעינה של Entity Framework ואת שיקולי הבחירה ביניהן, בלי קוד.
התרחיש
טבלת המתנות היא המידע המרכזי (Main Data או Primary Data) ומציגים מהן שם ומחיר. בטבלת המתנות יש רק קוד של קבוצת גיל, והמשתמש רוצה לראות את השם שלה, שנמצא בטבלה המשנית (Secondary Data או Related Data). הבעיה היא איזון בין מהירות לזיכרון: להביא הכול בבת אחת מבזבז זיכרון, והבאה לפי הצורך יוצרת הרבה פניות לדאטאבייס. כל פנייה איטית, כי הדאטאבייס פותח סשן, מפרש את השאילתה ושומר ללוג.
שלוש האסטרטגיות
1. Lazy loading (טעינה עצלנית): המידע הנלווה נטען אוטומטית רק ברגע שניגשים אליו. מתאים כשהמשתמש נדיר צריך את המידע המשני, למשל רשימת תוצאות חיפוש שנכנסים בה רק לחלק מהמתנות. החיסרון הוא שבלולאה כל גישה יכולה להיות פנייה נפרדת לדאטאבייס.
2. Explicit loading (טעינה מפורשת): המידע הנלווה נטען בשאילתה נפרדת שמפעילים בעצמנו. מתאים כשיודעים מראש איזה מידע משני נדרש. דוגמה: משתמשים מחפשים בדרך כלל מתנות לילדים, אז שאילתה אחת מביאה את המתנות ושנייה מביאה רק את המידע הנלווה של קבוצת הילדים. מה שלא הובא יכול להיטען אחר כך ב-lazy loading, אם בוחרים גם בו.
3. Eager loading (טעינה נלהבת): המידע הראשי והנלווה נטענים בשאילתה אחת מורכבת עם join. מתאים כשיודעים מראש שצריך את כל המידע, למשל השוואה בין סוגי פידג'ט ספינר שבה המשתמשים בודקים פרטים נוספים כמו מחירים וקבוצות גיל.
שימו לב
הבחירה תלויה בצורכי האפליקציה ובאיזון בין מספר הפניות לדאטאבייס לבין כמות הזיכרון. בסרטונים הבאים יוצגו היישום הטכני של כל אסטרטגיה בתרחיש המתאים לה.
השיעור הבא בקורס: ברירת המחדל – אין טעינה של מידע נלווה

פרקי ההרצאה: אסטרטגיות טעינת המידע של Entity Framework Core

  1. 00:00

    התרחיש - מתנות וקבוצות גיל

  2. 01:13

    מידע ראשי מול מידע משני

  3. 01:54

    איזון בין performance לזיכרון

  4. 03:16

    הצגת שלוש אסטרטגיות הטעינה

  5. 04:10

    הסבר על Lazy Loading

  6. 05:04

    דוגמה - תיבת חיפוש מתנות

תמלול ההרצאה: אסטרטגיות טעינת המידע של Entity Framework Core

הטקסט המלא של הדקות הראשונות בהרצאה «אסטרטגיות טעינת המידע של Entity Framework Core» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:02

    אנחנו מגיעים לנושא מאוד מעניין שנקרא לואודינג סטרטג'יז, אסטרטגיות טעינה. קודם כל, בואו נבין איזשהו סנאריו, איזשהו תרחיש מסוים שהרבה פעמים קורה. יש לנו את טבלת המתנות, יש לנו את השם של המתנה, את המחיר, יש לנו את הקוד שלה, ואנחנו רוצים להביא מתנות ולהציג מתנות, זה בעצם הדבר המרכזי שאנחנו מתעסקים איתו.

  2. 00:30

    אז ברור שאנחנו רוצים להציג את השם של המתנה וגם את המחיר אבל אנחנו לא באמת רוצים להציג את הקוד של קבוצת הגיל שלה הרי היוזר לא אמור לראות קודים זה לא מעניין אותו שקבוצת הגיל יש לה קוד אחד אז ברור שיש לנו פה גם את הטבלה השנייה של קבוצות גילאים יש לנו h group ID שזה הקוד של קבוצת גיל ולכן יש פה את הטבלה בטבלת המתנות את קוד

  3. 00:57

    קבוצת הגיל וכמובן בדאטאבייס יש יש ריליישן ביניהם. אנחנו רוצים להציג את המתנות, זה המידע המרכזי שלנו, אבל אנחנו רוצים עבור כל מתנה להציג גם מה השם הזה של קבוצת הגיל, ש-cute doll, עבור babies ולא עבור children.

  4. 01:16

    בואו לצורך הדוגמה הזאת נקרא למידע הזה Main Data, אפשר לקרוא לו גם Primary Data, המידע המרכזי שאנחנו רוצים להציג, הטבלה הראשית שלנו.

  5. 01:27

    ולמידע הזה בואו נקרא סקנדרי דאטה או אפשר לקרוא לו רילייטד דאטה גם כן סקנדרי טייבל הטבלה המשנית המידע הנלווה יש לזה בעצם כל מיני שמות אנחנו רוצים להציג למשתמש גם את זה וגם את השם של אותה מתנה בסדר גמור אנחנו יודעים ששפת sql יודעת לבצע את זה כמובן גם entity framework יודעת לבצע את זה אבל בואו רגע נחשוב טוב, האם כדאי איך שהאפליקציה עולה להביא

  6. 01:59

    את כל המידע הראשי וגם את המידע המשני? רגע, אולי היוזר לא תמיד רוצה לראות את המידע המשני, אולי הוא רוצה לראות את המידע המשני רק אם הוא לוחץ על איזשהו more details, מידע נוסף או משהו כזה.

  7. 02:15

    למה בעצם לא להביא את כל המידע? מה אכפת לנו? יש לנו פה תמיד צורך באיזון בין performance, המהירות, לבין memory, אם אנחנו אומרים תביא לי את הכל כולל הכל אז הוא מביא לי את כל המידע זה כמובן המון המון בזבוז של זיכרון.

  8. 02:31

    אם אני אומר תביא לי את המידע הרבה פעמים אבל רק כשאני צריך אותו אז יש לנו פה המון פניות לדאטאבייס ואנחנו צריכים להביא נקודה חשובה כל פנייה לדאטאבייס זה משהו שגוזל זמן פניות לדאטאבייס נחשבות איטיות מבחינת המערכת כשאנחנו פונים לדאטאבייס הדאטאבייס יוצר בשבילנו משהו שנקרא סשן שמלווה את הפנייה ומשרת אותה.

  9. 02:54

    ומקבל את השאילתה ומפרש אותה ומביא לנו את המידע ושומר כל מיני דברים לאיזשהו לוג שלו. זאת אומרת, יש פה המון פעולות שהדאטאבייס עושה עבור כל פנייה.

  10. 03:06

    אז פניות נחשבות משהו איטי ואנחנו רוצים לחסוך בפניות לדאטאבייס. אז אנחנו צריכים פה לאזן בין כמות הפניות לדאטאבייס ובין הזיכרון שאנחנו מביאים.

  11. 03:16

    כי להביא את הכל הכל הכל בבת אחת, אולי זה לא נדרש, אפילו שזה יהיה שאילתה אחת. לצורך כך, אנטיטי פריימוורק מציגה לנו את מה שנקרא אסטרטגיות תאנה לואודינג סטרטג'יז.

  12. 03:27

    אז בואו נעבור ונראה מהם האסטרטגיות תאנה שאנטיטי פריימוורק נותנת לנו. אז קודם כל מה זה? אסטרטגיות תאנה זה הטכניקות השונות שמאפשרות להביא את אותו מידע נלווה, את אותו מידע משני מהדאטאבייס.

  13. 03:43

    אסטרטגיות האלה מאפשרות למתכנתים לעשות את אותו איזון בין הפרפורמנס, המהירות, לבין הזיכרון לפי הצרכים של האפליקציה. מה בעצם אנחנו רוצים ספציפית לגבי הלוגיקה שלנו.

  14. 03:56

    יש שלוש אסטרטגיות תאנה. Lazy loading, כאשר lazy זה עצלן. Explicit loading, כאשר explicit זה מפורש. ו-Eager loading, כאשר Eager זה נלהב. בואו נראה מה זה Lazy loading ראשית.

  15. 04:13

    אז Lazy loading זו אותה טכניקה שאוטומטית מביאה את המידע הנלווה, המידע המשני, כאשר אנחנו רק ניגשים אליו, נניח אני רוצה רק להציג אותו. אני מציג את השם של קבוצת הגיל, בום, המערכת הולכת, מביאה את המידע הזה מהדאטאבייס.

  16. 04:32

    הוא לא מביא את המידע בעלייה הראשונית או בשאילתה הראשונית של המידע הראשי. כמובן שזה יכול ליצור המון פניות לדאטאבייס, יכול להיות שאנחנו רצים באיזושהי לולאה וכל פעם אומרים, תציג לי גם את השם של קבוצת הגיל, תציג לי גם את השם, מציג לי גם את השם המון המון פעמים בלולאה, כל פעם יכולה להיות פנייה לדאטאבייס, זה כמובן

  17. 04:51

    יכול להיות מאוד לא יעיל. אז מתי זה מתאים? זה מתאים כאשר אנחנו יודעים שלעיתים נדירות המשתמש בעצם רוצה לראות את אותו מידע משני, אז אולי לא כדאי להביא אותו בכלל בטעינה הראשונית, אלא אם צריך לך ותביא אוטומטית.

  18. 05:09

    בואו נראה use case, דוגמה למצב הזה. אנחנו מציגים תיבת חיפוש של מתנות ומציגים רשימה של הרבה מתנות. אנחנו שמים לב שכשהיוזר רואה רשימת מתנות לפי מה שהוא חיפש, אז נדיר שהוא נכנס בשביל לראות מידע נלווה לכל מתנה, מידע משני עבור מתנה.

  19. 05:29

    לכן אנחנו אומרים, תשמע, תביא לי את התוצאות חיפוש של המתנות, אבל תביא לי רק את המתנות. אל תביא לי מידע נלווה של למי שייכת אותה מתנה, לאיזה קבוצות גיל. אם היוזר ירצה וייכנס לתוצאת חיפוש, אז לך ותביא אוטומטית lazy, אל תביא ישר, תביא אוטומטית כשאנחנו נכנסים ומציגים את זה.

  20. 05:49

    אם אנחנו מסתכלים על הסכמה יש לנו פה את המתנות ואת קבוצות הגיל, יש לנו את האפליקציה. קודם כל מה שאנחנו עושים זה בכל מקרה מביאים את המידע הראשי, ברור, אני מביא את התוצאות חיפוש של המתנות.

  21. 06:01

    אנחנו לא מביאים שום דבר שקשור לקבוצות גיל, לא את השמות, לא כלום. יוזר לוחץ על איזשהו תוצאת חיפוש, אוקיי, אז אוטומטית המערכת אומרת, אה, אתה צריך לראות גם את השם של קבוצת הגיל?

  22. 06:17

    שום בעיה, אני הולכת לדאטאבייס ומביאה את השם של קבוצת הגיל. יוזר מקליק על מתנה נוספת כי הוא רוצה לראות את הפרטים, שום בעיה, נלך ונביא גם אותה.

  23. 06:29

    בסדר, כי היוזר רצה, וזאת תהיה פנייה נוספת.

לקורס המלא: קורס Entity Framework Core

ההרצאה הקודמת: בדיקת ביצועים עם SQL Profiler

ההרצאה הבאה: ברירת המחדל – אין טעינה של מידע נלווה

הרצאות קשורות מקורסים אחרים

  • שימוש ב-Entity Framework - חלק 1
  • הסבר על Console - דוט-נט Framework vs Core
  • הסבר על WinForms - דוט-נט Framework vs Core
  • Automation Framework

קורסים נוספים במסלול

  • קורס דוט-נט - NET Core. - עם Rest API
  • קורס ASP.NET
  • קורס MVC
  • קורס Git ו-GitHub עם Visual Studio