ABA


"לרבל, Eloquent, מודלים... מה אני מפספס?"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #21581 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 21581
Bonito 
חבר מתאריך 22.9.09
14859 הודעות
   15:40   30.01.16   
אל הפורום  
  לרבל, Eloquent, מודלים... מה אני מפספס?  
 
   איך שאני לא הופך וחוקר את זה, אני לא מבין למה לא להשתמש בRAW QUERY פשוט, לעשות JOIN בצורה רגילה, להחזיר בדיוק מה שאני צריך וזהו.

כמעט בכל מצב שאני משתמש בEloquent יוצא שאני שולח יותר Queries לSQL.

שורה תחתונה, למה לא לבנות QUERY בדיוק לצרכים שלי בקונטרולר, מה היתרון\מה אני מפספס במודלים + Eloquent?

תודה


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  קודם כל sza  02.02.16 14:37 1
     האמת שמאז שפתחתי את הפוסט קראתי המון, תקן אותי אם אני טועה Bonito  02.02.16 16:23 2
         אבל גם הראשון משתמש ב eloquent... sza  02.02.16 16:35 3
             תודה על ההסבר, נמשיך לחקור וללמוד Bonito  02.02.16 16:59 4
                 בהצלחה רבה sza  02.02.16 17:19 5
         מכתב משה הלולן 02.02.16 17:40 6
             בדרך כלל query אחד יהיה עדיף מכמה queries Bonito  02.02.16 19:01 7
                 מכתב משה הלולן 02.02.16 19:12 8
  אני קצת מתנגד לאמירה למעלה שאם יש Caching אז החשיבות של אופטימיזציה יוחאי 03.02.16 22:59 9
     ממש לא אמרתי את זה משה הלולן 04.02.16 10:47 10
         ואיך שכחתי כמובן את המשפט המפורסם והשנוי במחלוקת: משה הלולן 04.02.16 11:04 11
         אני אנסה להסביר בצורה יותר ברורה, יוחאי 04.02.16 13:00 12
             אז אנחנו מסכימים על הכול זה בדיוק מה שאני אומר משה הלולן 04.02.16 14:23 13
                 אני אמשיך את השרשור שלכם, ננסה להתייחס לכל הנקודות Bonito  04.02.16 15:25 14

       
sza  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 26.4.02
12357 הודעות, 22 פידבק, 43 נקודות
   14:37   02.02.16   
אל הפורום  
  1. קודם כל  
בתגובה להודעה מספר 0
 
ערכתי לאחרונה בתאריך 02.02.16 בשעה 15:45 בברכה, sza
 

אתה עובד בצורה של Active record, זה מאד עוצמתי.

אתה שולח query וEloquent מחזיר collection עם התשובה.
היכולות של Eloquent פשוט חזקות, בצורה כללית, אתה יכול לקחת את הקולקשן ו"להריץ" עליו שאילתות כדי להמשיך ולסנן אותו, אתה יכול למצוא שורה מסויימת שאתה מעוניין לשנות, לשנות בה את הערך, ופשוט להוסיף את השורה
$queryResults->save();
והשינוי ישמר גם בDB.

כנס לLaracast וקח כמה שיעורי וידאו על היכולות של Eloquent ושל collections באופן כללי, אחרי שתעבוד איתם קצת אתה תבין כמה כח יש לך בידיים.

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

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


אגב, יש הרבה מתכנתים שלא באמת משתמשים במודל, אלא כמו שאתה אומר, יוצרים את הQUERY ישירות בCONTROLLER, אבל בניה נכונה יותר ובפרט במערכת גדולה תהיה כשאתה יודע שכל התקשורת מול הDB מנוהלת במודל.

אם יוצא לך שאתה שולח יותר QUERIES לשרת עם eloquent סימן שאתה לא מתפעל אותו כמו שצריך. כל דבר שאפשר לעשות עם RAW QUERY אפשר לעשות עם Eloquent.



צחי.

http://webleader.co.il/websites/rotter/amionline.php#.jpg


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Bonito 
חבר מתאריך 22.9.09
14859 הודעות
   16:23   02.02.16   
אל הפורום  
  2. האמת שמאז שפתחתי את הפוסט קראתי המון, תקן אותי אם אני טועה  
בתגובה להודעה מספר 1
 
   ערכתי לאחרונה בתאריך 02.02.16 בשעה 16:33 בברכה, Bonito
 
אבל אין לך אפשרות לעשות JOIN בצורה רגילה, אתה צריך להגדיר relationships בין מודלים מה שיגרום ליותר מדי queries אפילו בדברים הכי פשוטים.

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

לעומת זאת עם Eloquent אין לך אפשרות כזאת, אתה יכול להגדיר relationships אבל אז כשאתה תיגש נגיד לrelation של המחיר אתה תשלח עוד query.


$items = Items::find($id);
items->price->item_price$

מה שיוצא לך פה זה:

select * from items where id = id
select * from prices where id = id


לCRUD זה אולי נוח וטוב אבל לqueries אפילו הכי פשוטים זה פשוט זוועה מבחינת performance אלא אם כן לא הבנתי נכון איך לעבוד עם relationships.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
sza  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 26.4.02
12357 הודעות, 22 פידבק, 43 נקודות
   16:35   02.02.16   
אל הפורום  
  3. אבל גם הראשון משתמש ב eloquent...  
בתגובה להודעה מספר 2
 

eloquent הוא בסה"כ אובייקט שנותן לך לשייט בDB בקלילות ולעשות כל מה שאתה רוצה.

אם ע"י query אחד ועם ע"י שניים, הבחירה היא שלך.

eloquent מחזיר collection של עצמים, שהמיוחד בהם הוא שאפשר גם אותם לחתוך ולפלטר איך שבא לך ע"י המתודות של eloquent, לשנות, לעדכן ולשמור בצורת active record, שהיא מאד נוחה לשימוש.

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

laravel בעצמה לא נחשבת framework עם ביצועים בשמיים, אולם מספר השאילתות שנשלחות וכו' תלויות אך ורק בך ובצורה שאתה בונה את האפליקציה שלך.


צחי.

http://webleader.co.il/websites/rotter/amionline.php#.jpg


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Bonito 
חבר מתאריך 22.9.09
14859 הודעות
   16:59   02.02.16   
אל הפורום  
  4. תודה על ההסבר, נמשיך לחקור וללמוד  
בתגובה להודעה מספר 3
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
sza  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 26.4.02
12357 הודעות, 22 פידבק, 43 נקודות
   17:19   02.02.16   
אל הפורום  
  5. בהצלחה רבה  
בתגובה להודעה מספר 4
 


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
משה הלולן לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 11.6.13
4818 הודעות, 8 פידבק, 14 נקודות
   17:40   02.02.16   
אל הפורום  
  6. מכתב  
בתגובה להודעה מספר 2
 
   הדוגמה שהבאת לא מדוייקת כי היא לא משתמשת ב Eager Loading, אני גם הייתי בדעה כמו שלך עד שהבנתי שעדיף 2-3 שאילתות פשוטות ומהירות מאשר אחת מורכבת.
eloquent זה הדבר הכי יפה שקרה לי, העברתי מערכת מורכבת עם שאילתות מטורפות לכמה שורות פשוטות.

אצלי לפחות אני תמיד משתמש בcaching, ככה שבפועל זה לא שווה את הזמן לבזבז על ייעול שאילתות כי אין בזה באמת צורך

השאילתה שהבאת יכולה להירשם ככה:


Item::with('types','prices')->where('id','=',$id)->first();


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Bonito 
חבר מתאריך 22.9.09
14859 הודעות
   19:01   02.02.16   
אל הפורום  
  7. בדרך כלל query אחד יהיה עדיף מכמה queries  
בתגובה להודעה מספר 6
 
   מבחינת זמן, CPU USAGE וכו'(באתרים עם טראפיק אתה מנסה לחסוך כמה שיותר, באתרים קטנים זה באמת לא משנה).


לגבי השאילתה שהבאת, בסופו של יום זה גם כן ישלח 2 queries במקום אחת, מה יקרה כשתצטרך 6 טבלאות באותו דף בכמה מקרים שונים? תשלח עשרות queries?

הדוגמה שאני הבאתי היא ממש בסיסית ככה שזה באמת לא משנה איך אתה עושה(למרות שגם פה יש בזבוז מיותר של משאבים אם משתמשים במודלים).

שורה תחתונה, אם אני עובד בדרך כזאת הקוד יהיה נקי ומסודר יותר אבל אין אפשרות לעשות תכלס JOIN אמיתי, הבנתי נכון?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
משה הלולן לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 11.6.13
4818 הודעות, 8 פידבק, 14 נקודות
   19:12   02.02.16   
אל הפורום  
  8. מכתב  
בתגובה להודעה מספר 7
 
   אם תגגל אתה תמצא הרבה חומר על הנושא הזה.
כמו שתמיד אומרים בתיכנות זה תלוי..
עדיין לא נתקלתי במקרים שאני לא משתמש בהם בcaching ככה שעוד לא יצא לי שכל כניסה לעמוד מבצעת יותר מ1-2 שאילתות מקסימום אם בכלל.


אם יש שאילתות ספציפיות שהביצועים בהם חשובים אז אני לא רואה בעיה מיוחדת לרשום גם raw sql


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
יוחאי
חבר מתאריך 30.12.15
163 הודעות, דרג אמינות חבר זה
   22:59   03.02.16   
אל הפורום  
  9. אני קצת מתנגד לאמירה למעלה שאם יש Caching אז החשיבות של אופטימיזציה  
בתגובה להודעה מספר 0
 
   לשאילתות היא שטותית, זאת אחת האמירות הכי שגויות ששמעתי מזה הרבה זמן.

1.הדטאבייס שלך תמיד מתעדכן ותמיד הנתונים צריכים להשלף מחדש, ה-Caching הוא זמני.

2.אם אתה מחזיק מערכת שמקבלת חצי מיליון משתמשים ביום, ונניח שכל 5 דקות המידע שלך מתעדכן, איך ה-Caching הזה בכלל רלוונטי?

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

עכשיו לגבי השאלה שנשאלה:

מספר ייתרונות מהשרוול:

1.Migrations - ברגע שאתה ממפה את המודל שלך ל-Class הרבה יותר נוח להוסיף שדות חדשים ולשנות את המבנה של הטבלה שלך במידת הצורך.
2.Unit Test - הרבה יותר נוח לעשות Unit Test לישויות פרטניות כמו Model שמייצג משתמש, תוך כדי הטסטים אתה הרבה פעמים צריך לייצר Mockup של המודל שלך ולהשתמש בו בדיוק כמו שאתה משתמש בו בקוד האמיתי.

3.בדרך כלל הספריות האלה מכילות DB Adapters למנועים כמו Oracle/MySQL/SQLServer/Postgres ועוד....

שתרצה לעבור לעבוד מול דטאבייס אחר כל מה שתצטרך לשנות זה את ה-Adapter למשהו אחר ולהמשיך לעבוד.

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

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
משה הלולן לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 11.6.13
4818 הודעות, 8 פידבק, 14 נקודות
   10:47   04.02.16   
אל הפורום  
  10. ממש לא אמרתי את זה  
בתגובה להודעה מספר 9
 
   ערכתי לאחרונה בתאריך 04.02.16 בשעה 10:55 בברכה, משה הלולן
 
אם יש לך מערכת של מליון משתמשים ביום, אתה לא שואל בפורום רוטר(למרות שזה גם לא באמת מספר שמדגדג את השרתים)

בקשר לcaching גם אם יש לך מיליון משתמשים ביום, והמידע מתעדכן פעם ב10 שניות, אתה פונה לבסיס נתונים אחת ל10 שניות פעם אחת בלבד, ככה שסעיף 1ו2 לא הצלחתי להבין אותך


3. אין חשיבות לאופטימיזציה של שאילתות עד שאין בזה צורך, אני דוגל בשיטה הזאת
שוב אתה מביא דוגמאות לא רלוונטיות, אם פותח האשכול עובד בnsa והוא עובד כרגע על מערכת שמנתחת נתונים ממליון מצלמות אבטחה בארה"ב בזמן אמת, וצריך לשלוף נתונים מטורפים אני חוזר בי תזרוק את eloquent זה לא בשבילך.

אבל אם פותח האשכול משתמש בlaravel ועובד על אתר חדש ואין לו צורך בלתמוך בנגיד 1000-40000 בקשות בשנייה אז כן אני עדיין בדעה שלי, ה5ms(אם בכלל) שתחסוך לא שווים את השעות עבודה שתבזבז.

אם מדובר במשהו שבאמת אמור לעמוד בעומסים קשים, אז laravel זה לא הכלי המתאים למשימה בכל מקרה



                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
משה הלולן לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 11.6.13
4818 הודעות, 8 פידבק, 14 נקודות
   11:04   04.02.16   
אל הפורום  
  11. ואיך שכחתי כמובן את המשפט המפורסם והשנוי במחלוקת:  
בתגובה להודעה מספר 10
 
   PREMATURE OPTIMIZATION IS THE ROOT OF ALL EVIL


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
יוחאי
חבר מתאריך 30.12.15
163 הודעות, דרג אמינות חבר זה
   13:00   04.02.16   
אל הפורום  
  12. אני אנסה להסביר בצורה יותר ברורה,  
בתגובה להודעה מספר 10
 
   1.אני קודם כל לא ארצה להגיע למצב שיש לי מערכת של מיליון משתמשים ביום ואני שואל שאלות כאלה, ברוב המקומות שעבדתי בהם נהוג לצפות עליות בכמות המשתמשים מבעוד מועד ולהציג פתרונות לבעיות שעלולות לצוץ.

2.זה בדיוק מה שאני אומר עם או בלי Caching אתה פונה בדיוק באותה כמות פעמים לדטאבייס, רק במקרה של Eloquent אתה גם מבצע את כל הלוגיקה שממירה את הקריאה לפונקציות שלך ל-100 שאילתות (שאולי זה טוב ואולי לא אני לא מכיר אז אין לי חוות דעת).

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

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
משה הלולן לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 11.6.13
4818 הודעות, 8 פידבק, 14 נקודות
   14:23   04.02.16   
אל הפורום  
  13. אז אנחנו מסכימים על הכול זה בדיוק מה שאני אומר  
בתגובה להודעה מספר 12
 
   1.מסכים

2. זה בחיים לא מגיע ל100 שאילתות ההפרש, אפשר להגיד שכל join מוסיף שאילתה אחת, ככה שבמקום אחת כבדה אתה מקבל 1-5 קלות ופשוטות (select * from users where id in(1,2,3,4,5

3. זה בדיוק היתרון של eloquent

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Bonito 
חבר מתאריך 22.9.09
14859 הודעות
   15:25   04.02.16   
אל הפורום  
  14. אני אמשיך את השרשור שלכם, ננסה להתייחס לכל הנקודות  
בתגובה להודעה מספר 13
 
   ערכתי לאחרונה בתאריך 04.02.16 בשעה 15:34 בברכה, Bonito
 
לגבי הטראפיק, זה באזור ה100K-150K UV.

כרגע האתר כתוב בPLAIN PHP בלי פריימוורק, בלי MVC, קוד ספגטי.

חשוב לציין שאין לי בעיות בכלל, יכול להחזיק במצב כרגע 8K-10K ONLINE בשקט אבל אני מרגיש שהגיע הזמן לעשות REWRITE (עם BS4, כן אני יודע שזה באלפא כרגע) ככה שאני לוקח את זה לאט לאט מהצד ומנסה ללמוד את לרבל נכון ולכתוב את הקוד החדש בצורה נכונה.

1. CACHING, אני יכול להשתמש רק בדברים מאוד ספציפיים, התוכן מאוד דינמי.
2. Eloquent, זה באמת יוצר יותר מדי QUERIES לדעתי, אני עדיין חוקר ושואל אנשים ככה שלא הגעתי למסקנה חד משמעתית אבל כמו שמשה הלולן אמר, זה כנראה תלוי בסיטואציה.
3. Migrations, לא נוגע בזה בכלל, לא רואה בזה שום שימוש מבחינתי(ראיתי גם בהרבה שרשורים באינטרנט שאומרים: "אם תרצה לעבוד עם DB אחר...", למה שאני ארצה לעשות את זה?).

*רק התחלתי עם לרבל(די פשוט ללמידה), מכיר ככה את המבנה בקטנה מפרוייקט אחר שבנו לי לפני שהתחלתי לתכנת(לרבל 4.2).

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


*לגבי SQL\Queries באופן כללי, מבחינתי זה הדבר הכי חשוב כשאתה מתכנת, ככל שאתה חוסך יותר פה ככה אתה חוסך יותר כסף מבחינת שרתים, אני די בטוח שאם תיקח איש DBA לבדיקת אתרים רנדומלית הוא יוכל להפחית 50% בעלויות עם שינויים בSQL\לוגיקה נכונה(ברובם).


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net