מבנה נתונים נכון של רשומת הזמנה
-
שלום,
שאלה בסיסית, אבל מצאתי בזה חילוקי דעות.
נניח שיש לי טבלת 'הזמנות' המכילה קוד הזמנה, ושם לקוח, לדוגמא.
במקביל טבלת 'מוצרים' המכילה מוצרים שהוזמנו עם קוד הזמנה (מקושר לטבלת 'הזמנות'), כמות, מחיר ליחידה, מחיר כולל
כעת לכל הזמנה ישנו מחיר כולל (שמחושב לפי סך כל המחירים הכוללים של הפריטים שמקושרים לקוד ההזמנה)
השאלה היא, האם זה נכון לאכסן את הערך הזה בטבלת 'הזמנות' בשדה 'סכום הזמנה' (ואז ליצור איזשהוא אירוע שעל כל פריט שיתווסף יעודכן הערך הזה)
או כיון שהוא תלוי בטבלת המוצרים, זה לא נכון לאכסן אותו בשום טבלה, אלא רק לחשב אותו view \ שאילתה? -
@מומחה-באקסס הנכון הוא לחשב את הערך של המחיר הכולל ולשמור אותו בצמוד להזמנה.
יש לזה כמה טעמים, אך הסיבה העיקרית היא שבמערכת אמיתית לאורך זמן, משתנים מחירי המוצרים מידי תקופה, כך שחישוב מחדש של הסכום הכולל יוליד בכל תקופה סכום כולל אחר.
זה כמובן לא מתקבל על הדעת.יתר על כן, מהטעם שציינתי, מומלץ לשמור לא רק את הסכום הכולל, אלא אפילו את הערך ליחידה עבור כל מוצר, את אחוז המס למוצר ואת ההנחה בשעת ההזמנה.
מבנה כזה מאפשר פונקציונאליות רבה:
הנחה מיוחדת על הזמנה ספציפית, או על מוצר מסויים, או כמות סף מסויימת, הנחה ללקוח מועדף, פטור ממע"מ על מוצר מסויים וכו'.אגב, מומלץ לשנות את כותרת הפוסט למשהו יותר מכוון, כגון: מבנה נתונים נכון של רשומת הזמנה.
-
@odeddvir אמר בהירארכית מסד נתונים:
@מומחה-באקסס הנכון הוא לחשב את הערך של המחיר הכולל ולשמור אותו בצמוד להזמנה.
יש לזה כמה טעמים, אך הסיבה העיקרית היא שבמערכת אמיתית לאורך זמן, משתנים מחירי המוצרים מידי תקופה, כך שחישוב מחדש של הסכום הכולל יוליד בכל תקופה סכום כולל אחר.
זה כמובן לא מתקבל על הדעת.@odeddvir הוא לא דיבר על מקרה כזה.
יש לו טבלה עם פרטי ההזמנה, כלומר עם יחידות המוצר והמחיר שחויב עבור כל פריט בהזמנה הזו, השאלה היתה רק אם לחשב כל פעם מחדש את הסה"כ או לשמור את הנתון שלכאורה כפול...לענ"ד, כיום, המאפיין העיקרי הוא מהירות (לעומת חסכון במקום ומשאבי זיכרון ועיבוד שהיו פעם רלוונטיים יותר) ונכון להקדיש מראש שמירה של נתונים בתצורות שונות על מנת להציג אותם בבא העת בצורה מהירה ויעילה (ע"ע גוגל...)
בדוגמא שלך, היות וזה נתון שלא עשוי להשתנות לאחר סגירת ההזמנה (קח בחשבון ביטולים / שינויים שיכנסו כהזמנה חדשה וכדו'), ומצד שני זה נתון שמוצג תמיד עם טבלת ההזמנות, בהחלט נכון לשמור אותו כדי לחסוך שאילתות כל פעם מחדש. מאידך גיסא, דווקא בדוגמא הזו, היות ומדובר בשאילתה בסיסית ביותר, גם אם היא תחושב כל פעם מחדש עדיין התוצאה תהיה מהירה ללא הבדל ניכר...
למעשה, בדוגמא שהבאת, אפשר כך ואפשר כך, אין הבדל מהותי, בדוגמאות אחרות, נכון לפעול על פי הנ"ל.
(אם שאלת כאן, למה שאלת גם בפרוג... יהודה ועוד לקרא?)
-
@אבי אמר בהירארכית מסד נתונים:
הוא לא דיבר על מקרה כזה.
יש לו טבלה עם פרטי ההזמנה, כלומר עם יחידות המוצר והמחיר שחויב עבור כל פריט בהזמנה הזו, השאלה היתה רק אם לחשב כל פעם מחדש את הסה"כ או לשמור את הנתון שלכאורה כפול...עיינתי שוב וראיתי שהצדק איתך:
במקביל טבלת 'מוצרים' המכילה מוצרים שהוזמנו עם קוד הזמנה (מקושר לטבלת 'הזמנות'), כמות, מחיר ליחידה, מחיר כולל
במקרה הזה אני מצטרף לכל הנאמר בתשובה שלך.