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

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

איציק ברבי 31-10-12 14:36

מהו האלגוריתם היעיל ביותר לבניית עגלה במערכת של חנות וירטואלית.
 
חשבתי על דבר כזה:

עמודה בטבלה users
ויהיה בה את: productID-productAmount

ולפי זה יוצג התוכן,

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

יש לכם רעיון יותר טוב?

dor77 31-10-12 14:45

תסביר שוב מה אתה מעוניין לעשות?
לא ממש הבנתי.

אדיר 31-10-12 15:41

ספציפית למה שאתה מתאר, הנה תיאור של טבלה מקשרת פשוטה.
id | user_id | item_id | amount

אפשר לעשות בזה שינויים כמובן -
אולי העמודה id תהיה מיותרת עבורך,
אולי אתה מעדיף לשמור את ה- amount בצורה אחרת (רשומה נוספת עבור כל פריט),
זה הרעיון הכללי.

M.a.T.a.N 31-10-12 15:55

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

בקשר למחיקה - אני לא כ"כ הבנתי אם קיימת לך טבלה של המוצרים שמשתמש רכש, אם אין לך טבלה כזאת והכוונה שלך שכל המוצרים של המשתמש נמצאים בעמודה מסויימת בטבלה של המשתמשים אז ככה:
תעשה הפרדה במסד למשל של הסימן "|" שיפריד בין מוצר למוצר, ופשוט כשהוא ירצה למחוק מוצר מסויים תעשה לולאה שתריץ את הCOUNT של הEXPLODE של הסימן "|", בתוך תעשה תנאי אם המוצר הנוכחי שרץ בלולאה לא שווה למוצר שהוא רוצה למחוק שיעדכן לתוך משתנה את המוצר, אם זה המוצר שהוא רוצה למחוק אז הוא לא יעשה כלום.
בסוף תעדכן במסד את המשתנה שקיבלת (שהוא יהיה כמובן ללא הערך של של המוצר שהוא מחק).
לתת לך קצת כיוון הקוד יראה ככה +-:
PHP קוד:

$removeID $_POST['ID']; // המוצר שהמשתמש רוצה למחוק
$allProducts $row['productID']; //הערך של העמודה בה נמצאים כל המוצרים של המשתמש (מופרדים ב"|")
$ex explode("|"$allProduct); //מפצל ע"פ |
for($i=0;$<count($ex);$i++) //מתחיל לולאה שמריצה את כל המוצרים של המשתמש
    
if($ex[$i]!=$removeID//בודק אם המוצר שאני רוצה למחוק זה המוצר שרץ כרגע בלולאה
        
$updateProduct .= $ex[$i];    //אם לא פשוט לעדכן לתוך המשתנה כדי לשמור על המוצרים שלא נמחקו

//עכשיו הקוד שמעדכן את המשתנה updateProduct למסד 


אדיר 31-10-12 16:43

ציטוט:

נכתב במקור על ידי M.a.T.a.N (פרסם 861948)
קודם כל למה שיהיו כפילויות? בכל פעם כשמשתמש נכנס למוצר מסויים זה יעשה חיפוש במסד אם המוצר כבר בעגלת הקניות שלו,
אם כן פשוט לא יהיה ניתן לרכוש עוד פעם את המוצר (אם הוא ירצה לקנות מס' פעמים את המוצר שיהיה את זה באפשרות נפרדת).

בקשר למחיקה - אני לא כ"כ הבנתי אם קיימת לך טבלה של המוצרים שמשתמש רכש, אם אין לך טבלה כזאת והכוונה שלך שכל המוצרים של המשתמש נמצאים בעמודה מסויימת בטבלה של המשתמשים אז ככה:
תעשה הפרדה במסד למשל של הסימן "|" שיפריד בין מוצר למוצר, ופשוט כשהוא ירצה למחוק מוצר מסויים תעשה לולאה שתריץ את הCOUNT של הEXPLODE של הסימן "|", בתוך תעשה תנאי אם המוצר הנוכחי שרץ בלולאה לא שווה למוצר שהוא רוצה למחוק שיעדכן לתוך משתנה את המוצר, אם זה המוצר שהוא רוצה למחוק אז הוא לא יעשה כלום.
בסוף תעדכן במסד את המשתנה שקיבלת (שהוא יהיה כמובן ללא הערך של של המוצר שהוא מחק).
לתת לך קצת כיוון הקוד יראה ככה +-:
PHP קוד:

$removeID $_POST['ID']; // המוצר שהמשתמש רוצה למחוק
$allProducts $row['productID']; //הערך של העמודה בה נמצאים כל המוצרים של המשתמש (מופרדים ב"|")
$ex explode("|"$allProduct); //מפצל ע"פ |
for($i=0;$<count($ex);$i++) //מתחיל לולאה שמריצה את כל המוצרים של המשתמש
    
if($ex[$i]!=$removeID//בודק אם המוצר שאני רוצה למחוק זה המוצר שרץ כרגע בלולאה
        
$updateProduct .= $ex[$i];    //אם לא פשוט לעדכן לתוך המשתנה כדי לשמור על המוצרים שלא נמחקו

//עכשיו הקוד שמעדכן את המשתנה updateProduct למסד 


לא, פשוט לא.
MySQL הוא RDBMS, לא צריך לעשות דברים בצורה גרועה כזאת.

איציק, תקרא על "many to many relationship" ותקח לדוג' את המבנה שהבאתי בתגובה הראשונה שלי.

Haimz 31-10-12 16:54

לא הבנתי איפה הסתבכת, בתנאי שאתה רוצה להוסיף לטבלה מוצרים, ולאפשר למחוק אותם, כך תראה הטבלה שלך:
id | uid | product | amount | price
uid = האיידי של הקונה.

מחיקה פשוטה לפי איידי, והבדיקה היא אם העמודה uid שווה לאיידי של המשתמש.

אדיר 31-10-12 16:59

חיים -
העמודה price מיותרת ועלולה ליצור בעיות מיותרות, לדוגמה במקרה של שינוי המחיר של המוצר.
רצוי שהנתון ישמר במקום אחד וקבוע, בטבלת המוצרים, משם הוא ישלף על פי הצורך.

איציק ברבי 31-10-12 17:01

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


מה שהוא התכוון:

טבלה בשם cart

עמודות: cardID | userID | productID | Amount

ככה זה יכול להקל על הכל.

תודה רבה חברים.

Haimz 31-10-12 17:02

ציטוט:

נכתב במקור על ידי xPerfection (פרסם 861960)
חיים -
העמודה price מיותרת ועלולה ליצור בעיות מיותרות, לדוגמה במקרה של שינוי המחיר של המוצר.
רצוי שהנתון ישמר במקום אחד וקבוע, בטבלת המוצרים, משם הוא ישלף על פי הצורך.

צודק שכחתי שיש טבלה למוצרים, אז אם כבר עושים את השליפה, העמודה product צריכה להיות pid

M.a.T.a.N 31-10-12 19:31

ציטוט:

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

איציק, תקרא על "many to many relationship" ותקח לדוג' את המבנה שהבאתי בתגובה הראשונה שלי.

אוקיי, ומה זה קשור? אפשר להשתמש בו בצורה הזאת ותאמין לי שלא יקרה כלום...

Haimz 31-10-12 19:47

ציטוט:

נכתב במקור על ידי M.a.T.a.N (פרסם 861971)
אוקיי, ומה זה קשור? אפשר להשתמש בו בצורה הזאת ותאמין לי שלא יקרה כלום...

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

M.a.T.a.N 31-10-12 20:14

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

בכל אופן זו דעתי ואני באמת לא מבין למה דווקא בגלל שMySQL ידוע כ RDBMS זה אומר שצריכים ללכת ע"פ השם שלו אם אפשר לייעל את זה אחרת...

אדיר 31-10-12 20:27

ציטוט:

נכתב במקור על ידי M.a.T.a.N (פרסם 861977)
דווקא יש...אם לדוג' מספר המשתמשים במערכת כזו גדול סביר להניח שבמקרה שתרצה לחפש מתוך הטבלה של המוצרים שורה בודדת ששייכת למוצר ששייך למשתמש מסוים ייקח הרבה זמן.
לעומת זאת אם מההתחלה תגדיר לשרת ללכת לטבלה של המשתמשים, משם לבחור את השורה ששייכת למשתמש X ולהוציא את הערך של העמודה PRODUCTS (המוצרים של המשתמש) זה ייקח זמן מועט יחסית למקרה הנ"ל.
אני גם מאמין שבמערכת כזאת מן הסתם העגלה של משתמש בודד תהיה קטנה יחסית לעומת עגלה כוללת של כל המשתמשים באתר (כלומר טבלה ובה יוכלו כל המוצרים של כל המשתמשים).

בכל אופן זו דעתי ואני באמת לא מבין למה דווקא בגלל שMySQL ידוע כ RDBMS זה אומר שצריכים ללכת ע"פ השם שלו אם אפשר לייעל את זה אחרת...

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

ולא בקטע מעליב או משהו, נטו תגובה בונה.

איציק ברבי 31-10-12 20:40

ציטוט:

נכתב במקור על ידי M.a.T.a.N (פרסם 861971)
אוקיי, ומה זה קשור? אפשר להשתמש בו בצורה הזאת ותאמין לי שלא יקרה כלום...

לא בעיה ליצור תוצאה דומה.

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

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

למה, אם אפשר למנוע שכפולים כאלו ע"י הפונקציה mysql_num_rows

ואני יגיד לך תאכלס זה מקל בהרבה על העבודה!

M.a.T.a.N 31-10-12 21:12

ציטוט:

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

ולא בקטע מעליב או משהו, נטו תגובה בונה.

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

נכתב במקור על ידי איציק ברבי (פרסם 861982)
לא בעיה ליצור תוצאה דומה.

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

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

למה, אם אפשר למנוע שכפולים כאלו ע"י הפונקציה mysql_num_rows

ואני יגיד לך תאכלס זה מקל בהרבה על העבודה!

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

איציק ברבי 31-10-12 21:15

אתה מדבר על explode בשביל לפצל את זה למערכים,

נניח ואני רוצה למחוק מוצר?
אני צריך לעבור על כל המערך ולמחוק אותו,
נניח ואני רוצה לערוך,
PHP קוד:

"/".$pid."-(.*)/" 

אתה מסכים איתי בזה?

M.a.T.a.N 31-10-12 21:28

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

איציק ברבי 31-10-12 21:33

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

M.a.T.a.N 31-10-12 21:42

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

MAORBARI 31-10-12 22:52

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

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

M.a.T.a.N 01-11-12 00:02

ציטוט:

נכתב במקור על ידי MAORBARI (פרסם 861991)
למה אתם אומרים שצריך לעבור על כל המערך??
מה אתם לא שמעתם על פונקציה array_search?
הוא מחזיר מיקום ופשוט מחליפים את הערך באותו המיקום אם רוצים לשנות או שמסירים אותו בעזרת array_splice
הרבה יותר קל והרבה פחות מאמצים וגם יעיל מאוד במקום להשתמש בכל כך הרבה טבלאות.

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

Tnx..|Rolleyes|

איציק ברבי 01-11-12 00:30

ציטוט:

נכתב במקור על ידי MAORBARI (פרסם 861991)
למה אתם אומרים שצריך לעבור על כל המערך??
מה אתם לא שמעתם על פונקציה array_search?
הוא מחזיר מיקום ופשוט מחליפים את הערך באותו המיקום אם רוצים לשנות או שמסירים אותו בעזרת array_splice
הרבה יותר קל והרבה פחות מאמצים וגם יעיל מאוד במקום להשתמש בכל כך הרבה טבלאות.

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

לא אמרתי שלא,
למה לא להשתמש במשהו קיים?
חבל לעבוד פעמיים.


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

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