![]() |
מהו האלגוריתם היעיל ביותר לבניית עגלה במערכת של חנות וירטואלית.
חשבתי על דבר כזה:
עמודה בטבלה users ויהיה בה את: productID-productAmount ולפי זה יוצג התוכן, אבל לאחר מיכן ולקוח ירצה למחוק מוצר מסויים זה יהיה בעיה לחפש את המוצר נניח ולא יהיו כפילויות. יש לכם רעיון יותר טוב? |
תסביר שוב מה אתה מעוניין לעשות?
לא ממש הבנתי. |
ספציפית למה שאתה מתאר, הנה תיאור של טבלה מקשרת פשוטה.
id | user_id | item_id | amount אפשר לעשות בזה שינויים כמובן - אולי העמודה id תהיה מיותרת עבורך, אולי אתה מעדיף לשמור את ה- amount בצורה אחרת (רשומה נוספת עבור כל פריט), זה הרעיון הכללי. |
קודם כל למה שיהיו כפילויות? בכל פעם כשמשתמש נכנס למוצר מסויים זה יעשה חיפוש במסד אם המוצר כבר בעגלת הקניות שלו,
אם כן פשוט לא יהיה ניתן לרכוש עוד פעם את המוצר (אם הוא ירצה לקנות מס' פעמים את המוצר שיהיה את זה באפשרות נפרדת). בקשר למחיקה - אני לא כ"כ הבנתי אם קיימת לך טבלה של המוצרים שמשתמש רכש, אם אין לך טבלה כזאת והכוונה שלך שכל המוצרים של המשתמש נמצאים בעמודה מסויימת בטבלה של המשתמשים אז ככה: תעשה הפרדה במסד למשל של הסימן "|" שיפריד בין מוצר למוצר, ופשוט כשהוא ירצה למחוק מוצר מסויים תעשה לולאה שתריץ את הCOUNT של הEXPLODE של הסימן "|", בתוך תעשה תנאי אם המוצר הנוכחי שרץ בלולאה לא שווה למוצר שהוא רוצה למחוק שיעדכן לתוך משתנה את המוצר, אם זה המוצר שהוא רוצה למחוק אז הוא לא יעשה כלום. בסוף תעדכן במסד את המשתנה שקיבלת (שהוא יהיה כמובן ללא הערך של של המוצר שהוא מחק). לתת לך קצת כיוון הקוד יראה ככה +-: PHP קוד:
|
ציטוט:
MySQL הוא RDBMS, לא צריך לעשות דברים בצורה גרועה כזאת. איציק, תקרא על "many to many relationship" ותקח לדוג' את המבנה שהבאתי בתגובה הראשונה שלי. |
לא הבנתי איפה הסתבכת, בתנאי שאתה רוצה להוסיף לטבלה מוצרים, ולאפשר למחוק אותם, כך תראה הטבלה שלך:
id | uid | product | amount | price uid = האיידי של הקונה. מחיקה פשוטה לפי איידי, והבדיקה היא אם העמודה uid שווה לאיידי של המשתמש. |
חיים -
העמודה price מיותרת ועלולה ליצור בעיות מיותרות, לדוגמה במקרה של שינוי המחיר של המוצר. רצוי שהנתון ישמר במקום אחד וקבוע, בטבלת המוצרים, משם הוא ישלף על פי הצורך. |
אדיר הציע את הרעיון היעיל ביותר, כשכתבתי את האשכול חשבתי על זה, אבל אמרתי נראה אם יש דרך אחרת בכל מקרה.
מה שהוא התכוון: טבלה בשם cart עמודות: cardID | userID | productID | Amount ככה זה יכול להקל על הכל. תודה רבה חברים. |
ציטוט:
|
ציטוט:
|
ציטוט:
|
דווקא יש...אם לדוג' מספר המשתמשים במערכת כזו גדול סביר להניח שבמקרה שתרצה לחפש מתוך הטבלה של המוצרים שורה בודדת ששייכת למוצר ששייך למשתמש מסוים ייקח הרבה זמן.
לעומת זאת אם מההתחלה תגדיר לשרת ללכת לטבלה של המשתמשים, משם לבחור את השורה ששייכת למשתמש X ולהוציא את הערך של העמודה PRODUCTS (המוצרים של המשתמש) זה ייקח זמן מועט יחסית למקרה הנ"ל. אני גם מאמין שבמערכת כזאת מן הסתם העגלה של משתמש בודד תהיה קטנה יחסית לעומת עגלה כוללת של כל המשתמשים באתר (כלומר טבלה ובה יוכלו כל המוצרים של כל המשתמשים). בכל אופן זו דעתי ואני באמת לא מבין למה דווקא בגלל שMySQL ידוע כ RDBMS זה אומר שצריכים ללכת ע"פ השם שלו אם אפשר לייעל את זה אחרת... |
ציטוט:
תלמד לתכנת ברמה גבוהה, תלמד לעבוד עם מסדי נתונים ברמה גבוהה, תלמד איך מסדי נתונים עובדים - ואתה תבין. ולא בקטע מעליב או משהו, נטו תגובה בונה. |
ציטוט:
כל הרעיון או למשל כפילויות, בן אדם הוסיף בעבר מוצר, ולאחר בדיקה אצלו גילה שהוא רוצה לערוך את הכמות, נוציא את תוכן העמודה מתוך המשתמש, ונתחיל לפצל, להריץ בדיקות עם ביטויים רוגליים? למה, אם אפשר למנוע שכפולים כאלו ע"י הפונקציה mysql_num_rows ואני יגיד לך תאכלס זה מקל בהרבה על העבודה! |
ציטוט:
בכל מקרה אני לא מאמין שאני באמת יתחיל לחפש את ההבדל עכשיו, פשוט אני לא רואה סיבה לבצע את התכנות אחרת..זאת אומרת, הכל יהיה אותה תוצאה עם אותה מהירות +- ואולי אפילו שלי יותר יעילה. בכל מקרה תודה על התגובות, באמת שאני לוקח אותם בקטע טוב! ציטוט:
שוב, אני לא מנסה לשנות את דעתכם פשוט לתת לכם מבט אחר ודרך שתמיד הייתה אצלי כדרך מאוד הגיונית פשוטה ויעילה. |
אתה מדבר על explode בשביל לפצל את זה למערכים,
נניח ואני רוצה למחוק מוצר? אני צריך לעבור על כל המערך ולמחוק אותו, נניח ואני רוצה לערוך, PHP קוד:
|
לא הבנתי...תראה עוד פעם את הקוד שהבאתי לך דוגמא בעמוד הקודם ותבין מה התכוונתי..
|
לא אמרתי שזה לא אפשרי, אמרתי שלא חבל לעבור על כל המערך? סתם צריכת משאבים מהמערכת..
|
זה בקושי זולל משאבים...
גם אם יהיו לו 100 מוצרים במערך זה יטוס כמו שאתה יודע...לדעתי זה הרבה יותר נוח מטבלה חדשה שיכנסו אליה כל פעם שורות רבות נוספות.. |
למה אתם אומרים שצריך לעבור על כל המערך??
מה אתם לא שמעתם על פונקציה array_search? הוא מחזיר מיקום ופשוט מחליפים את הערך באותו המיקום אם רוצים לשנות או שמסירים אותו בעזרת array_splice הרבה יותר קל והרבה פחות מאמצים וגם יעיל מאוד במקום להשתמש בכל כך הרבה טבלאות. או שאתה באמת יכול לפתוח טבלה, כי לא נשמרים נתונים לכל הזמן, מתישהו הלקוח מבצע הזמנה וזה נמצא מהסל.. ככה שזה לא קריטי במצב הזה, אבל רק שיש שימוש בכמה טבלאות גדולות, בשביל ערך אחד משותף לא שווה לפתוח טבלה, אלא פשוט להשתמש במפרידים. |
ציטוט:
|
ציטוט:
למה לא להשתמש במשהו קיים? חבל לעבוד פעמיים. |
כל הזמנים הם GMT +2. הזמן כעת הוא 09:40. |
מופעל באמצעות VBulletin גרסה 3.8.6
כל הזכויות שמורות ©
כל הזכויות שמורות לסולל יבוא ורשתות (1997) בע"מ