תכנון מסד נתונים
-
יש לי טבלת מוצרים וטבלת רכישות.
בכל רכישה מצוין איזה מוצר נרכש (לפי ID של המוצר).הבעיה היא מה קורה שכשמשנים את פרטי המוצר, כולל מחיר שם ואפילו מהות (נניח מוצר וירטואלי של ספק אינטרנט, שאפשר לשנות אותו מ 15 MB ל 30 MB).
מה שקורה שאחרי שיש שינוי כזה אי אפשר לעבד את הנתונים (נניח לבדוק מהו המוצר הכי פופולרי).
מה כדאי לעשות? אולי בכל רכישה להוסיף את כל הנתונים של המוצר?
-
לא אמורים לשנות מהות של מוצר.
כי אז איבדת את כל הערך של הרשומה.
חייב שתהיה ברשומה ערך אחד אמיתי בלתי משתנה או לפחות חיבור תיאורטי לדבר מציאותי קבוע (כמו אדם מסויים).
אם ישנה ישות או מאפיין אחר לרשומה מאשר מהות המוצר, אז אכן צריך לשמור אותו יחד עם הקניה.לגבי מחיר, ודאי ששומרים את המחיר יחד עם הקניה.
-
פתרון קצת יותר מסובך:
בטבלה של המוצרים תוסיף עמודה של version לדוגמא:id | version | name | price | size | enabled | ----------------------------------------------- 101| 01 | abc | 100 | 15 | false 101| 02 | def | 150 | 30 | true
כל פעם שיש עריכה של המוצר תשנה את enabled ל false
ותיצור רשומה חדשה עם version +1 ו enabled = trueובטבלת הקניות תוסיף את הערך של version
כשתרצה להציג את רשימת המוצרים תסנן לפי הערך של enabled
-
@upsilon01 אמר בתכנון מסד נתונים:
@chagold
כשהמוצר הוא שירות אז הפרטים כן משתניםצודק.
אבל נר"ל שא"כ עדיף לעשות טבלה נפרדת לversion's (וודאי שלא להחזיק באותה טבלה ID כפול). -
@upsilon01 אמר בתכנון מסד נתונים:
בטבלה של המוצרים תוסיף עמודה של version לדוגמא:
רעיון מעניין, רק שזה מסרבל את הרשומה וגורם לכפילות נתונים.
-
@upsilon01 אמר בתכנון מסד נתונים:
@chagold לא הבנתי איך
(לא הבנתי מה כוונת @מנצפך על זמן, אז אני עונה רק על מה שכתבתי לפני כן)
לעשות טבלה שתעסוק בגרסאות מוצרים, ויהיה שם שדה ID של מוצר ועוד שדה של מס' גרסה. (ועוד מס' שדות לפי הנתונים הדינמיים).
ותמיד כשיגשו למוצרים יהיה אפשר להעלות את כל הגרסאות עם JOIN.
(ואפשר לעשות שבטבלת מוצרים יהיה ג"כ שדה של 'מס' גרסה נוכחית' דהיינו שיכיל id של השדה המתאים מטבלת הגרסאות (ולייבא אותם תמיד עם join), וכך יהיה אפשר להחזיק גרסה נוכחית של כל מוצר) -
@מנצפך
תעשה מוצר שנקראת דקת עבודה (לפי חישוב יחסי)
ובכמות תשים לפי מספר הדקות.
בכלל, כמות + סכום ליחידה + סכום כולל (אם יש) חייב להישמר בDB בכל עסקה מחדש.
אף פעם אל תסמוך על הגדרות המוצר בזה.גם לגבי הטוטל וסכום המעמ אם יש, תמיד תשמור את זה בDB אפילו שאתה יכול לחשב את זה ברגע האמת.
(אני כותב את זה מנסיון ארוך..... ולא משנה כמה נכון וקשיח תאפיין את המוצר שלך. אלו נתונים שאמורים פשוט להישמר גם ביחס לכל עסקה)