2009-08-27 23 views
15

मुझे आश्चर्य है कि कुछ अन्य गैर-रिलेशनल डेटाबेस गतिविधि धाराओं के लिए एक अच्छा फिट होगा - फेसबुक, फ़्लिकर (http://www.flickr.com/activity) आदि पर आप जो देखते हैं, वैसे ही, मैं MySQL का उपयोग कर रहा हूं लेकिन यह बहुत अच्छा कर रहा है (मेरे पास लाखों गतिविधि रिकॉर्ड हैं) और चूंकि वे मूल रूप से केवल एक बार लिखे गए हैं और हमेशा कालक्रम से देखे जाते हैं, मैं सोच रहा था कि एक वैकल्पिक डीबी अच्छी तरह से काम कर सकता है।गतिविधि धाराओं के लिए पारंपरिक संबंधपरक डेटाबेस के विकल्प

  • 6 बजे:: जॉन पसंदीदा बनाया बेकन
  • 5:30 PM:

    गतिविधियों चीजों की तरह कर रहे हैं जेन स्नो क्रैश पर टिप्पणी की

  • 5:15 PM: जेन को बेकन का एक फ़ोटो जोड़ी अपने एल्बम

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

  • पुल गतिविधियों या लोग हैं, जो आपका अनुसरण कर रहे ("जॉन" और "जेन") के सबसेट,:

    मैं निम्न कार्य करने में सक्षम होना चाहिए

  • रिवर्स तारीख क्रम में एक बात ("बेकन" की तरह) के लिए पुल गतिविधियों
  • फ़िल्टर गतिविधि प्रकार ("पसंदीदा", "टिप्पणी")
  • स्टोर में कम से कम 30 लाख गतिविधियों से
  • आदर्श रूप से, यदि आप किसी व्यक्ति को जोड़ते या हटाते हैं, तो आपकी गतिविधि स्ट्रीम परिवर्तन को प्रतिबिंबित करेगी।

मैं MySQL के साथ ऐसा करने की है। मेरी "गतिविधियां" तालिका कॉम्पैक्ट के रूप में है क्योंकि मैं इसे बना सकता हूं, चाबियाँ जितनी छोटी हो सकती हैं, और इसे उचित रूप से अनुक्रमित किया जाता है। यह काम करता है, लेकिन यह सिर्फ इस नौकरी के लिए गलत उपकरण की तरह लगता है।

किसी को भी एक पारंपरिक RDBMS के इस बाहर की तरह कुछ भी करने से है?

अद्यतन नवंबर 2009: यह भी अपने ही सवाल का जवाब देने की शुरुआत है, लेकिन मेरे वर्तमान समाधान MySQL के साथ चिपके रहते हैं, लेकिन ताजा गतिविधि प्रवाह डेटा के लिए तेजी से पहुँच के लिए Redis के साथ बढ़ाने के लिए है। मेरा उत्तर में अधिक जानकारी यहां: How to implement the activity stream in a social network ...

अद्यतन अगस्त 2014: सालों बाद, मैं अभी भी रिकॉर्ड की प्रणाली के रूप में MySQL का उपयोग कर रहा है और प्रत्येक के लिए नवीनतम गतिविधियों के लिए बहुत तेजी से पहुँच के लिए Redis का उपयोग कर उपयोगकर्ता। बड़े पैमाने पर MySQL तालिका पर स्कीमा परिवर्तनों से निपटना pt-online-schema-change

+0

मैंने देखा कि फ़्लिकर के केलान इलियट-मैकरेरिया ने इस लेख को बुकमार्क किया है कि फ्रेंडफिड MySQL (bret.appspot.com/entry/how-friendfeed-uses-mysql/...) के साथ क्या करता है, यह कहते हुए कि यह "बहुत है इसी तरह "फ्लिकर गतिविधि धाराओं के लिए क्या करता है। – casey

+0

मुझे गतिविधि स्ट्रीम को लागू करने के तरीके में दिलचस्पी है ... क्या आपके पास ऑब्जेक्ट मॉडल बनाने के सुझाव हैं? मैं इस बारे में एक प्रश्न पोस्ट किया है (http://stackoverflow.com/questions/1443960/how-to-implement-the-activity-stream-in-a-social-network), लेकिन मैं बहुत ज्यादा नहीं भाग्य था .. –

+0

@ इलेक्ट्रोपोर्टल - मैंने आपके प्रश्न पर एक उत्तर पोस्ट किया: http://stackoverflow.com/questions/1443960/how-to-implement-the-activity-stream-in-a-ocial-network/1766371#1766371 – casey

उत्तर

2

पर एक गैर-समस्या धन्यवाद बन गया है, मैं भी SQL से दूर जाने की योजना बना रहा हूं। मैं CouchDB देख रहा हूं, जो आशाजनक लग रहा है। आपकी आवश्यकताओं को देखते हुए, मुझे लगता है कि सभी को कॉच डीबी विचारों और सूची एपीआई के साथ किया जा सकता है।

1

एक परियोजना के लिए मैं एक बार एक साधारण डेटाबेस कर रही लुकअप पर तेज़ था और जो लुकअप के बहुत सारे और सिर्फ एक सामयिक लिखने करना होगा की जरूरत है। मैंने अभी अपना खुद का फ़ाइल प्रारूप लिखना समाप्त कर दिया।

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

लेकिन सभी स्थितियों में 99.9 99% के लिए, आप इस तरह के एक कस्टम समाधान नहीं चाहते हैं। हार्डवेयर को अपग्रेड करना आसान है, ओरेकल, एसक्यूएल सर्वर या इंटरबेस में जाएं, समर्पित डेटाबेस सर्वर का उपयोग करें, तेज हार्ड डिस्क का उपयोग करें, अधिक मेमोरी इंस्टॉल करें, 64-बिट सिस्टम में अपग्रेड करें। कम से कम प्रयास के साथ प्रदर्शन में सुधार करने के लिए वे अधिक सामान्य चाल हैं।

5

मैं सच में, सच, MySQL (या एक RDBMS) के साथ रहने की सलाह देते हैं होता जब तक आप पूरी तरह से स्थिति को समझते हैं।

मैं पता नहीं कितना प्रदर्शन या आपके डेटा का उपयोग कर पर योजना है, लेकिन 30M पंक्तियों बहुत सारे नहीं है।

यदि आपको कुछ रेंज स्कैन को अनुकूलित करने की आवश्यकता है, तो आप इसे (उदाहरण के लिए) InnoDB (अनिवार्य रूप से क्लस्टर) प्राथमिक कुंजी को समझदारी से चुनकर, और/या जहां आवश्यक हो वहां denormalising कर सकते हैं।

लेकिन सबसे चीजों की तरह, यह पहली बार काम करते हैं, तो प्रदर्शन की समस्याओं आप उत्पादन ग्रेड हार्डवेयर पर अपने प्रदर्शन परीक्षण प्रयोगशाला में पता लगाने को ठीक कर सकते हैं।


संपादित करें: कुछ अन्य बिंदुओं:

  • कुंजी/मान ऐसे कैसेंड्रा, Voldermort आदि के रूप में डेटाबेस, आम तौर पर माध्यमिक अनुक्रमणिका का समर्थन नहीं करते
  • इसलिए, आप एक सूचकांक बनाएँ ऐसा नहीं कर सकते
  • उनमें से अधिकतर रेंज स्कैन भी नहीं करते हैं (यहां तक ​​कि मुख्य सूचकांक पर) क्योंकि वे विभाजन को लागू करने के लिए हैशिंग का उपयोग कर रहे हैं (जो वे अधिकतर करते हैं)।
  • इसलिए वे भी सीमा समाप्ति नहीं करते (tbl से हटाएँ कहां < अब TS() - INTERVAL 30 दिन)
  • आपका आवेदन ही यह सब करने या इसके बिना प्रबंधन करना चाहिए; माध्यमिक अनुक्रमणिका वास्तव में हत्यारा
  • वैकल्पिक तालिका ... जोड़ें INDEX में काफी लंबा समय लगता है उदा। एक बड़ी मेज के साथ MySQL, लेकिन कम से कम आपको इसे करने के लिए अधिक कोड लिखना नहीं है। "Nosql" डेटाबेस में, इसमें एक लंबा समय लगेगा लेकिन आपको द्वितीयक इंडेक्स को बनाए रखने के लिए कोड के ढेर और ढेर लिखना होगा, इसे सही तरीके से समाप्त करना होगा, और इसका उपयोग करने के लिए अपने प्रश्नों को संशोधित करना होगा।

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

+0

या चीज़ों को कैश करें अस्थायी सारणी या यहां तक ​​कि एचटीएमएल फाइलों को प्रति घंटा या अधिक बार, यदि आवश्यक हो। – dusoft

+0

यह वास्तव में MySQL पर लगभग 1 वर्ष तक चल रहा है। 30 एम पंक्तियां बहुत अधिक नहीं हैं, लेकिन गतिविधि तालिका स्कैनिंग (जो ध्यान से अनुकूलित और अनुक्रमित है) डेटाबेस समय के सबसे बड़े उपभोक्ताओं में से एक है। मैं सिर्फ एक गुलाम सर्वर को यह चल सकता है, जो है अगर मैं कुछ है कि सूट डेटा बेहतर के साथ नहीं आते हैं कि मुझे क्या करना होगा (विशेष रूप से, क्योंकि प्रतिकृति अंतराल इस डेटा के लिए एक कुल गैर मुद्दा है)। – casey

+0

मुझे संदेह है कि एप्लिकेशन डिज़ाइन इसे नीचे दे रहा है; यदि आप चीजों को सही तरीके से तैयार करते हैं और इसे अच्छी तरह से जांचते हैं, तो मैं नहीं देख सकता कि 30 एम पंक्तियां कैसे समस्या पैदा कर सकती हैं - कम से कम यदि आप सभ्य हार्डवेयर पर चल रहे हैं। सभ्य हार्डवेयर हो रही ज्यादा एक प्रमुख कोड परिवर्तन की तुलना में सस्ता है, इसलिए पहले कि :) – MarkR

1

मैं message queue तकनीक के बारे में सीखने की सलाह दूंगा। कई खुले स्रोत विकल्प उपलब्ध हैं, और मजबूत वाणिज्यिक उत्पाद भी हैं जो आपके द्वारा एक छोटे स्नैक्स के रूप में वर्णित मात्रा को पूरा करेंगे।

2

मुझे ऐसा लगता है कि आप क्या करना चाहते हैं - कई अलग अलग तरीकों डेटा के एक बड़े सेट क्वेरी और परिणाम के आदेश - वास्तव में और ठीक क्या RDBMeS के लिए डिजाइन किए गए थे है।

मुझे शक है आप किसी भी अन्य डेटासंग्रह कि इस करना होगा और साथ ही एक आधुनिक वाणिज्यिक डीबीएमएस (Oracle, SQLServer, डीबी 2 आदि मिलेगा) या किसी भी ओपन स्रोत उपकरण जो को पूरा करेगा, यह MySQL से बेहतर है।

आप Googles बिगटेबल, जो वास्तव में एक संबंधपरक डेटाबेस लेकिन यह अपने कार्यक्रम के लिए एक 'object'y व्यक्तित्व पेश कर सकते हैं है पर एक नज़र हो सकता था। मुक्त प्रारूप पाठ खोजों और जटिल भविष्यवाणियों के लिए इसका अपवाद अच्छा है। पूरी चीज (कम से कम संस्करण जिसे आप डाउनलोड कर सकते हैं) पाइथन में लागू किया गया है, मुझे संदेह है कि यह एक प्रश्न मैराथन में MySQL को हरा देगा।

+0

मुझे लगता है कि तुम सही हो सकता है (MySQL अन्यथा सबसे शक्तिशाली खुला स्रोत विकल्प आरडीबीएमएस है या हो सकता है) ... कठिन हिस्सा अधिक है कि मैं इस के साथ काम है कि, इस तरह के और अधिक पागल सामान बनाता है भावना है /bret.appspot।com/प्रवेश/कैसे-FriendFeed-उपयोग करता है-mysql – casey

1

CouchDB स्कीमा से मुक्त है, और यह, जल्दी से डेटा की एक बड़ी राशि को पुनः प्राप्त करने क्योंकि आप अनुक्रमित के साथ ही काम कर रहे हैं काफी सरल है। आप प्रत्येक बार डेटाबेस से "पूछताछ" नहीं कर रहे हैं, आप केवल मिलान करने वाली कुंजियों को पुनर्प्राप्त कर रहे हैं (जो प्री-सॉर्ट किए गए हैं इसे और भी तेज बनाते हैं)।

"दृश्य" डेटाबेस में हर बार नए डेटा को फिर से अनुक्रमित किया जाता है, लेकिन यह उपयोगकर्ता को पारदर्शी रूप से होता है, इसलिए अपडेट किए गए दृश्य को उत्पन्न करने में संभावित देरी हो सकती है, वस्तुतः कभी भी कोई देरी नहीं होगी परिणाम पुनर्प्राप्त करना

मैंने अभी सीचडीबी का उपयोग करके "गतिविधि स्ट्रीम" समाधान बनाने का पता लगाना शुरू कर दिया है, और क्योंकि प्रतिमान अलग है, प्रक्रिया के बारे में मेरी सोच को एसक्यूएल सोच से बदलना पड़ा।

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

यह गतिविधि धाराओं के लिए आदर्श है, और मैं तिथि के अनुसार सबकुछ अलग कर सकता हूं, या तिथि अलगाव के साथ मैं एक विशेष उप प्रकार के परिणाम फ़िल्टर कर सकता हूं - आवश्यकतानुसार एक दृश्य बनाकर, और क्योंकि दृश्य स्वयं ही है जावास्क्रिप्ट का उपयोग करके और कॉच डीबी में सभी डेटा जेएसओएन है, वस्तुतः सब कुछ आपके पृष्ठ को प्रस्तुत करने के लिए क्लाइंट-साइड किया जा सकता है।

+0

CouchDB बार देखा गया है कि वे मेरे लिए भी अच्छी तरह से काम करता हूँ लग रहे हो। मुझे अधिक परीक्षण करने का मौका नहीं मिला है क्योंकि लाखों रिकॉर्ड के साथ निर्माण प्रदर्शन डालने और देखने के लिए .. इतना अच्छा नहीं है। – casey

संबंधित मुद्दे