רעיון לשייך משתמשים לפעולות?
-
בס"ד
אני מדבר על פרוייקט בnode.js+sequlize
ישנם כמה משתמשים שאמורים לעבוד על אותם דברים (מערך מתנדבים והתנדבויות).
הייתי מאוד רוצה לדעת על כל פעולה איזה משתמש עשה אותה כגון יצירת אירוע חדש, התקשרות עם מתנדב, מתנדב חדש וכו' וכמו"כ עדכון או מחיקה בכל אחד מאלו וכדו'.
ברעיון ראשון חשבתי ע"ד שsequelize מוסיף תאריך יצירה, תאריך עדכון ותאריך מחיקה.
להוסיף משתמש יצירה, משתמש עדכון ומשץמש מחיקה בכל אחד מהטבלאות.
אך מה שמונע אותי מזה, שזה לא מספיק ברגע שמעדכנים יותר ממשתמש אחד, אני יקבל רק את האחרון ועוד שזה בלי תיעוד של זמן,
לכן חשבתי על כיוון של: לעשות טבלה מיוחדת שכוללת:- שם טבלה
- שם משתמש
- תאריך ושעה
- יצירה / עדכון / מחיקה
- הצליח/כשל
- הערה
מעניין לשמוע את דעת הציבור בעניין.
שאלתי באופן כללי: האם זה מכביד בכל פעולה לעשות עוד insert לטבלה ההיא,
שבדרך הראשונה אני בעצם חוסך את זה כי אני בכל מקרה מעדכן את הרשומה ההיא.
נ.ב. את אותו רעיון לכל בקשה לשרת, הייתי רוצה לשמור בטבלה מסוימת, אם סיכום (url-ip-סוג בקשה-סטטוס-וכו'). -
@avi-rz לכאורה גם בלי השיקול שכתבת, למען הסדר הטוב זה חייב להיות בטבלה נפרדת, לוג לא אמור להיות חלק מהישות עצמה אלא משהו חיצוני. כשאתה שולף אובייקט אתה רוצה את השדות שלו לא את הלוג.
בקשר לביצועים, אל תתנה את התשובה לקליינט ברישום לוג, קודם תשלח את התשובה ואחר כך תרשום ללוג, או לחילופין תכתוב ללוג בלי await ומיד אחר כך תשלח את התשובה לקליינט, כך זה לא יעכב את התשובה. -
@יוסף-בן-שמעון אמר ברעיון לשייך משתמשים לפעולות?:
בקשר לביצועים, אל תתנה את התשובה לקליינט ברישום לוג, קודם תשלח את התשובה ואחר כך תרשום ללוג, או לחילופין תכתוב ללוג בלי await ומיד אחר כך תשלח את התשובה לקליינט, כך זה לא יעכב את התשובה.
יש לך רעיון איך לעשות את זה גלובלי כמו סוג של middleware שיכניס את הנתונים רק אחרי שהבקשה נגמרת בשביל לדעת איזה סטטוס היא קבלה וכדו'?
-
@avi-rz תעשה משהו כזה בראש ההיררכיה של הראוטר
app.use((req, res, next) => { res.once('finish', () => { console.log(req.originalUrl, req.user, req.ip, res.statusCode, res.statusMessage, res.logInfo) }) next() })
אתה יכול להוסיף מידע אופציונלי לאוביקט res בכל מטפל ולהדפיס אותו ברישום ללוג, משהו כזה
res.logInfo = {someInfo: 'info'}
-
@avi-rz אמר ברעיון לשייך משתמשים לפעולות?:
הייתי מאוד רוצה לדעת על כל פעולה איזה משתמש עשה אותה כגון יצירת אירוע חדש, התקשרות עם מתנדב, מתנדב חדש וכו' וכמו"כ עדכון או מחיקה בכל אחד מאלו וכדו'.
אני חושב שהשאלה הראשונה היא מה הצורך במידע הזה.
האם לצורך לוגים ודיבוג, האם לצורכי אבטחה, או שבכלל כחלק מהאפליקציה עצמה, אתה מעוניין להציג היסטוריית שינויים.במידה והנושא הוא לוגים ו\או אבטחה - הדרך הנכונה היא לוגים. לא דאטאבייס.
זה פשוט מיועד לזה, זה נותן לך קונטקסט נוסף מעבר לרק מה היה השינוי ומי גרם לו. זה חסכוני בעלויות מקום (על חשבון זמינות ומהירות תשאול) לא מכביד לך על הDB ולא יגרום בעיות בסקייל גבוה יותר. תוכל גם להגדיר כל כמה זמן למחוק דאטא ישן.
התממשקות לכלים סטנדרטיים בתחום, loki, grafana וכדומה. ואז יש לך יכולת לתשאל את הלוגים שלך בצורה חכמה.
יש פרויקטים לייצוא של הלוגים ישירות לloki. הם ידעו לעשות את זה נכון בלי לתקוע לך את הevent loop בהמתנה לשליחה של הלוג לDB..במידה ויש צורך בהיסטוריה לצורך האפליקציה עצמה - אז תרצה שהמידע יהיה יותר מדויק, זמין ומהיר בתשאול. לכן נדרש DB.
לדעתי בדיוק לצורך כך יש triggers. אתה מגדיר מה לעשות עבור כל פעולה שקורת בטבלאות ספציפיות. במקרה שלך - לשמור לוג בטבלה נוספת.
החלק היחידי הבעייתי הוא שקצת יותר מורכב להוסיף את המידע של היוזר שגרם לפעולה. אבל זה ניתן לפתירה אני חושב. -
@aaron אמר ברעיון לשייך משתמשים לפעולות?:
אני חושב שהשאלה הראשונה היא מה הצורך במידע הזה.
האם לצורך לוגים ודיבוג, האם לצורכי אבטחה, או שבכלל כחלק מהאפליקציה עצמה, אתה מעוניין להציג היסטוריית שינויים.כן , מיועד למנהלי המערכת, שאין להם גישה לקוד.
@aaron אמר ברעיון לשייך משתמשים לפעולות?:
החלק היחידי הבעייתי הוא שקצת יותר מורכב להוסיף את המידע של היוזר שגרם לפעולה. אבל זה ניתן לפתירה אני חושב.
לא כ"כ הבנתי, אני משתמש כרגע ב sequelize ודי הרבה בקשרי גומלין,
מספיק שאני יכניס שם את הid של במשתמש,
כשאני ישלוף את השורה אני יוכל לקבל את כל הפרטים שלו. -
@avi-rz אני אסביר ביחס ל-Sql-Server, אני לא יודע באיזה db אתה משתמש, ויתכן שהפתרון פשוט יותר ב-db אחר.
ל"בקשה" אני בדר"כ מתייחס כ-Stored Procedure, ואכן אני יכול להעביר אליה כפרמטר את ה-id של המשתמש. הכל טוב ויפה כשניהול ההרשאות מבוצע ברמת הקוד.אבל כשאני כותב טריגר אני כותב אותו ברמת ה-DB, ומצמיד אותו לפעולה מסויימת על טבלה, שיכולה להתבצע מכל מיני SP-ים שונים, או אפילו כתוצאה מפעולה ישירה בטבלה (למרות שזה לא מצוי לשנות טבלאות ישירות מהקוד). כיצד אדע אז לשלוף את ה-ID משם? אני צריך קודם לדעת איזה משתמש הפעיל את הטריגר, וב-SQL Server זה עשוי להיות מורכב.
למען האמת אני לא יודע על דרך ברורה לעשות את זה. אולי צריך להגדיר הרשאות משתמשים ברמת ה-DB על ידי Roles, אבל זה יתן מידע כללי, לאיזה Role שייך המשתמש. אפשר גם לדעת איזה משתמש Windows הפעיל את הטריגר, אבל זה לא מה שאתה צריך.