הוסטס - פורום אחסון האתרים הגדול בישראל

הוסטס - פורום אחסון האתרים הגדול בישראל (https://hosts.co.il/forums/index.php)
-   פורום תיכנות (https://hosts.co.il/forums/forumdisplay.php?f=14)
-   -   שאלה לגבי בנייה נכונה של סקריפט דירוגים PHP (https://hosts.co.il/forums/showthread.php?t=69198)

Tomer Pearl 06-11-08 20:20

שאלה לגבי בנייה נכונה של סקריפט דירוגים PHP
 
יש לי סוג של מערכת סיקורים באתר. ורציתי לבנות אפשרות, שמשתמשים יוכלו לדרג כל סיקור.
חשבתי על שתי דרכים לבנות את המערכת, ורציתי לדעת מהי הדרך החכמה, והכי חסכונית במשאבים.
הדרך הראשונה:
לבנות טבלה, שמקבילה לטבלת הסיקורים, שבעצם כל משתמש שיידרג סיקור מסויים, המערכת
תוסיף רשומה עם הID שלו, הציון שהוא נתן לסיקור,והID של הסיקור, ואחרי שהמערכת מוסיפה את הנתונים לטבלה, היא שולפת את כל הדירוגים של אותו הסיקור, מחשבת מה הדירוג (על ידי זה שהיא מחברת את כל הדירוגים של כולם, ומחלקת אותם במספר הדירוגים ) ומעדכנת את השדה של הסיקור (בטבלה של הסיקור) בערך שהיא הגיע אליו.
הדרך השנייה
להוסיף עוד שני שדות במבנה של הטבלה של הסיקור, אחד של אלה שדירגו כבר, ואחד של סכום הדירוגים של כולם. כל פעם שמישהוא ידרג המערכת תוסיף אותו לשדה של המשתמשים שדירגו כבר (השדה יופרד בעזרת פסיקים...). ואז כל פעם שהדף ייטען המערכת תחשב כמה אנשים דירגו, ותגיע לתוצאה של הדירוג באותה הדרך כמו באפשרות למעלה. החיסרון באפשרות הזאתי היא שטיפה יותר מסובך לבנות אותה.

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

intercooler3819 06-11-08 20:35

this is 2 different solutions to the same problem

in the first case, you aimed to creating another table
i would use that if i wanted to know who voted what and for what item

the second options is having a 'rate' field in the items and 'raters' field
then when someone adds their rate, you are increasing raters by one and raise 'rate' by his numeric value of his vote
then when you want to know the average vote you just divide the votes by the voters
this is useless when you want to know who voted what

personally, i would use the first one
just make some index's and use the right datatypes for each of the columns

good luck mate

Tomer Pearl 06-11-08 20:45

ציטוט:

נכתב במקור על ידי nitsanbn (פרסם 679943)
this is 2 different solutions to the same problem

in the first case, you aimed to creating another table
i would use that if i wanted to know who voted what and for what item

the second options is having a 'rate' field in the items and 'raters' field
then when someone adds their rate, you are increasing raters by one and raise 'rate' by his numeric value of his vote
then when you want to know the average vote you just divide the votes by the voters
this is useless when you want to know who voted what

personally, i would use the first one
just make some index's and use the right datatypes for each of the columns

good luck mate

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

just make some index's and use the right datatypes for each of the columns
מזאת אומרת להכין אינדקסים? ולהשתמש בסוגי נתונים, הכוונה היא לסוג השדה שמכיל את הנתנוים?

FuZuL 07-11-08 09:41

תשמע תחפש פה בפורום גם לי הייתה את הבעיה ונתנו אחלה פתרון..

O-B 07-11-08 16:59

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

vadimg88 07-11-08 18:10

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

HOLD 09-11-08 07:40

ציטוט:

נכתב במקור על ידי O-B (פרסם 680156)
הדרך הראשונה היא היותר נכונה לדעתי..
אבל במקום לחשב את סכום הדירוגים וחלק ב מספר המצביעים פשוט תשתמש ב AVG בשליפה מהמסד והוא יחסוך את החישוב..
ואין צורך לעדכן את טבלת הסיקורים פשוט למשוך את ה AVG מהמסד יחד עם שאר הנתנוים ע"י JOIN

איך עושים את זה ?

Tomer Pearl 09-11-08 10:57

ציטוט:

נכתב במקור על ידי O-B (פרסם 680156)
הדרך הראשונה היא היותר נכונה לדעתי..
אבל במקום לחשב את סכום הדירוגים וחלק ב מספר המצביעים פשוט תשתמש ב AVG בשליפה מהמסד והוא יחסוך את החישוב..
ואין צורך לעדכן את טבלת הסיקורים פשוט למשוך את ה AVG מהמסד יחד עם שאר הנתנוים ע"י JOIN

איך עושים את זה?|Rolleyes|

ציטוט:

נכתב במקור על ידי vadimg88 (פרסם 680178)
אם אתה מגדיר עמודה מסויימת בתור INDEX האופטימיזציה שלה טוב יותר ואם צריך לבצע שאילתות הם יבוצעו מהר יותר. במילים אחרות זה מומלץ לטבלאות/עמודות עם הרבה תוכן שצריך אחר כך לבצע שאילתות אליהם.

העמודה של הID, אותה אני תמיד מגדיר כINDEX... זה מה שהתכוונת אליו?

O-B 09-11-08 12:56

עושים את זה ע"י בניית שאילתה נכונה.
[php] select *,AVG(`rates`.`rate`) as `avgrate` from `reviews` join left `rates` on `reviews`.`id` = `rates`.`review`group by `reviews`.`id` [\php]
זה נראה לי אמור לעבוד, אם לא נסה ללמוד על פונקציות שהשתמשתי פה ושנה לפי הצורך..


כל הזמנים הם GMT +2. הזמן כעת הוא 18:40.

מופעל באמצעות VBulletin גרסה 3.8.6
כל הזכויות שמורות ©
כל הזכויות שמורות לסולל יבוא ורשתות (1997) בע"מ