Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

डेटाबेस:क्रियाओं का लॉग बनाना, विभिन्न संदर्भों को कैसे संभालना है?

निम्नलिखित है कि मैं इसे कैसे करूँगा। स्कीमा देखने के बाद मेरे पास नीचे कुछ और टिप्पणियाँ हैं।

लॉग करें

LogID - अद्वितीय लॉग आईडी

समय - घटना की तारीख/समय

लॉग टाइप - स्ट्रिंग या आईडी

(साइड कमेंट, मैं यहां एक आईडी के साथ जाऊंगा ताकि आप नीचे दिखाए गए संदेश तालिका का उपयोग कर सकें, लेकिन यदि आप त्वरित और गंदा चाहते हैं तो आप प्रत्येक लॉग समय के लिए केवल एक अद्वितीय स्ट्रिंग कर सकते हैं (उदाहरण के लिए "गेम प्रारंभ", "संदेश भेजा गया" , आदि)

लॉगएक्टर

लॉगआईडी - बाहरी कुंजी

LogActorType - स्ट्रिंग या आईडी (जैसा कि ऊपर है, यदि आईडी आपको लुकअप टेबल की आवश्यकता होगी)

LogActorID - यह प्रकार के लिए तालिका के लिए एक अद्वितीय आईडी है जैसे उपयोगकर्ता, समूह, गेम

अनुक्रम - यह अभिनेताओं का आदेश है।

लॉगमैसेज

लॉग टाइप - बाहरी कुंजी

संदेश - लंबी स्ट्रिंग (varchar(max)?)

भाषा - स्ट्रिंग(5) ताकि आप अलग-अलग भाषा जैसे "यूएस-एन" को बंद कर सकें

उदाहरण डेटा (आपके 3 उदाहरणों का उपयोग करके)

लॉग

ID  Time   LogType 
1   1/1/10 1
2   1/1/10 2
3   1/1/10 3

लॉगएक्टर

LogID LogActorType LogActorID Sequence
1     User         1          1
1     User         2          2
2     User         1          1
2     User         2          2
2     User         2          3
2     Game         1          4
3     User         3          1
3     Group        1          2

लॉगमैसेज

LogType Message 
1       {0} Made a new friend {1}
2       {0}, {1}, {2} played a game ({3})
3       {0} joined a group ({1})

उपयोगकर्ता

ID Name
1  User A
2  User B
3  User C

खेल

ID Name
1  Name of game

समूह

ID Name
1  Name of group

तो यहाँ इस डिज़ाइन के बारे में अच्छी बातें हैं।

  • इसे बढ़ाना बहुत आसान है

  • यह अभिनेताओं से स्वतंत्र बहु-भाषा के मुद्दों को संभालता है

  • यह स्व-दस्तावेजीकरण है, TheLogMessage तालिका बताती है कि आप जो डेटा संग्रहीत कर रहे हैं, उसे क्या कहना चाहिए।

इसके बारे में कुछ बुरी बातें।

  • संदेशों को पढ़ने के लिए आपको कुछ जटिल संसाधन करने होंगे।

  • आप केवल DB को देखकर नहीं देख सकते कि क्या हुआ है।

मेरे अनुभव में इस तरह के डिजाइन के अच्छे हिस्से खराब बिट्स से अधिक हैं। मैंने लॉग पर एक त्वरित और गंदा नज़र डालने की अनुमति देने के लिए जो किया है वह एक दृश्य है (जिसे मैं एप्लिकेशन कोड के लिए उपयोग नहीं करता) जिसे मैं देख सकता हूं कि मुझे यह देखने की ज़रूरत है कि पीछे क्या हो रहा है अंत।

अगर आपके कोई प्रश्न हैं तो मुझे बताएं।

अपडेट - कुछ उदाहरण क्वेरी

मेरे सभी उदाहरण sqlserver 2005+ में हैं, मुझे बताएं कि क्या कोई अलग संस्करण है जिसे आप मुझे लक्षित करना चाहते हैं।

LogActor तालिका देखें (ऐसा करने के कई तरीके हैं, सबसे अच्छा डेटा वितरण, उपयोग के मामले, आदि सहित कई चीजों पर निर्भर करता है) यहां दो हैं:

क)

SELECT 
  LogId,
  COLLESCE(U.Name,Ga.Name,Go.Name) AS Name,
  Sequence
FROM LogActor A
LEFT JOIN User U ON A.LogActorID = U.[ID] AND LogActorType = "User"
LEFT JOIN Game Ga ON A.LogActorID = Ga.[ID] AND LogActorType = "Game"
LEFT JOIN Group Go ON A.LogActorID = Go.[ID] AND LogActorType = "Group"
ORDER BY LogID, Sequence

बी)

SELECT 
  LogId,
  U.Name AS Name,
  Sequence
FROM LogActor A
INNER JOIN User U ON A.LogActorID = U.[ID] AND LogActorType = "User"
UNION ALL
SELECT 
  LogId,
  Ga.Name AS Name,
  Sequence
FROM LogActor A
INNER JOIN Game Ga ON A.LogActorID = Ga.[ID] AND LogActorType = "Game"
UNION ALL
SELECT 
  LogId,
  Go.Name AS Name,
  Sequence
FROM LogActor A
INNER JOIN Group Go ON A.LogActorID = Go.[ID] AND LogActorType = "Group"
ORDER BY LogID, Sequence

आम तौर पर मुझे लगता है कि ए) बी से बेहतर है) उदाहरण के लिए यदि आप एक अभिनेता प्रकार को याद कर रहे हैं तो ए) इसे शामिल करेगा (शून्य नाम के साथ)। हालांकि बी) को बनाए रखना आसान है (क्योंकि यूनियन सभी बयान इसे और अधिक मॉड्यूलर बनाते हैं।) ऐसा करने के अन्य तरीके हैं (उदाहरण के लिए सीटीई, विचार, आदि)। मैं इसे बी की तरह करने के इच्छुक हूं) और जो मैंने देखा है वह कम से कम मानक अभ्यास प्रतीत होता है यदि सर्वोत्तम अभ्यास नहीं है।

तो, लॉग में अंतिम 10 आइटम कुछ इस तरह दिखाई देंगे:

SELECT 
  LogId,
  M.Message,
  COLLESCE(U.Name,Ga.Name,Go.Name) AS Name,
  Time,
  A.Sequence
FROM Log
LEFT JOIN LogActor A ON Log.LogID = A.LogID
LEFT JOIN User U ON A.LogActorID = U.[ID] AND LogActorType = "User"
LEFT JOIN Game Ga ON A.LogActorID = Ga.[ID] AND LogActorType = "Game"
LEFT JOIN Group Go ON A.LogActorID = Go.[ID] AND LogActorType = "Group"
LEFT JOIN LogMessage M ON Log.LogType = M.LogMessage
WHERE LogID IN (SELECT Top 10 LogID FROM Log ORDER BY Date DESC)
ORDER BY Date, LogID, A.Sequence

NB - जैसा कि आप देख सकते हैं, पिछले X की तुलना में किसी दिनांक से सभी लॉग आइटम का चयन करना आसान है, क्योंकि हमें इसके लिए एक (शायद बहुत तेज़) उप-क्वेरी की आवश्यकता है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL:ट्रिगर में सिग्नल का उपयोग करने में असमर्थ

  2. इकट्ठा करने का सबसे अच्छा तरीका है, फिर डेटा को ड्रूपल में आयात करें?

  3. एकाधिक चाइल्ड पंक्तियों को एक पंक्ति में संयोजित करें MYSQL

  4. 2 कॉलम में डुप्लीकेट कैसे खोजें 1

  5. पसंदीदा MySQL उपकरण