2012-05-08 27 views
24

ट्रेलो बोर्ड की शुरुआत के बाद से किसी भी उपयोगकर्ता ने किया है कि सब कुछ का एक ऐतिहासिक लॉग दिखाता है। इसी तरह, यदि आप किसी विशिष्ट कार्ड पर क्लिक करते हैं तो यह उस कार्ड से संबंधित किसी भी चीज़ का इतिहास दिखाता है।ट्रेलो इतिहास को इतनी जल्दी कैसे दिखाता है?

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

मैं यह केवल सेवा है कि कुछ इस तरह प्रदान करता है पता नहीं है, लेकिन आप एक ऐसी प्रणाली architecting के बारे में कैसे जाना होगा?

create table HistoryItems (
ID INT PK, 
UserID INT PK, 
DateTime datetime, 
Data varbinary(max)/varchar(max)/...) 

अनुक्रमण UserID पर इस तेजी से पुनः प्राप्ति के लिए अनुमति देता है:

+0

आपको आश्चर्य कितना अच्छा आपके आरडीबीएमएस वास्तव में है होगा।लॉग फ़ाइल में संग्रहीत नहीं होते हैं - वे कुछ अच्छे इंडेक्स वाले डेटाबेस में संग्रहीत होते हैं। – JonH

उत्तर

32

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

यह उल्लेख है कि एक कार्रवाई प्रदर्शित करने के लिए आवश्यक डेटा के सबसे कार्रवाई दस्तावेज़ में denormalized संग्रहीत किया जाता है लायक है, तो यह है कि चीजों को काफी गति।

+0

तो, आप कार्यों को एक टाइमस्टैम्प और इंडेक्स के साथ स्टोर करते हैं ताकि आप त्वरित लुकअप कर सकें, इतना आसान! "कार्रवाई दस्तावेज़" क्या है? –

+0

हम मोंगोडीबी का उपयोग करते हैं, इसलिए 'एक्शन डॉक्यूमेंट' पारंपरिक संबंध डीबी में 'क्रिया तालिका में' पंक्ति के बराबर है, लेकिन इसमें उच्च-संरचित डेटा की बजाय एक मध्यस्थ JSON दस्तावेज़ है। – Brett

+0

@ ब्रेट, क्या लिखते हैं (धीमे) क्योंकि आपका डेटा सभी denormalized है? – Pacerier

3

सबसे आसान तरीका है जो मन में आता है जैसे एक मेज है। एक कवर इंडेक्स एक डिस्क में पूरे उपयोगकर्ता के इतिहास को लाने में सक्षम होगा चाहे कितना समय हो।

इस तालिका को क्लस्टर किया जा सकता है (UserID asc, DateTime desc, ID) ताकि आपके पास कोई भी अनुक्रमणिका न हो और अभी भी इष्टतम प्रदर्शन हो।

एक संबंधपरक डेटाबेस के लिए कोई आसान बात नहीं।

+0

शायद पढ़ता है कि बुरा नहीं है .. लेकिन उस तालिका में से सभी को एक टेबल पर नहीं लिखना बहुत खराब लॉकिंग मुद्दे है? –

+0

आमतौर पर नहीं। लेनदेन प्रति लेनदेन की छोटी मात्रा (जो यहां है) केवल पंक्तियों को लॉक करें। सम्मिलित रूप से इस तरह से हो सकता है। – usr

1

मैं @Brett के रूप में बहुत कुछ इसी तरह से Trello मेरी पीएचपी + MySQL अनुप्रयोग जो मैं हमारे ऑनलाइन वेब स्टोर के लिए हमारे आदेश और उत्पादन प्रबंधन अनुप्रयोग में उपयोगकर्ता गतिविधि ट्रैक के लिए उपयोग में ऊपर दिए है। है

मैं मेज गतिविधियों रखती है जो:

  • user_id: उपयोगकर्ता कि कार्रवाई
  • प्रदर्शन किया
  • action_id: कार्रवाई है कि प्रदर्शन किया गया था (जैसे बनाने के लिए, अद्यतन, हटाने, और इतने पर ...)
  • resource: संसाधनों (मॉडल) की ईएनएम सूची (जैसे ऑर्डर, चालान, उत्पाद इत्यादि ...)
  • resource_id: संसाधन का पीके
  • 0 पर किया गया था
  • description: कार्रवाई का पाठ वर्णन (शून्य हो सकता है)

यह एक बड़ी मेज वास्तव में है, लेकिन सही अनुक्रमित के साथ यह बहुत अच्छी तरह से संभालती है। यह इसका उद्देश्य कार्य करता है। सरल और तेज़ है। वर्तमान में इसमें 200 के रिकॉर्ड हैं और सीसीए के साथ बढ़ रहे हैं। प्रति दिन 1000 नई प्रविष्टियां।