2009-06-04 15 views
6

मैं bbPress (ओपन सोर्स फ़ोरम सॉफ़्टवेयर) के लिए एक प्लगइन प्रोग्राम करने का प्रयास कर रहा हूं जो हैकर न्यूज (http://news.ycombinator.com/) के समान काम करेगा।हैकर समाचार की तरह सॉर्ट करें

sort_value = (p - 1)/(t + 2)^1.5 
where p = total votes for each topic from users 
t = time since submission of each topic in hours 

मैं का उपयोग कर sort_value गणना की इस से विषयों को क्रमित करने में सक्षम होना चाहते हैं:

विशेष रूप से, मैं मंच-सूत्र (bbPress उन्हें कॉल "विषय") निम्नलिखित कलन विधि का उपयोग के आदेश क्रमबद्ध करना चाहते हैं माई एसक्यूएल।

topics तालिका में संबंधित क्षेत्रों में इस तरह दिखता है:

topic_id   bigint(20) 
topic_start_time datetime 

यह हवा में ऊपर है, लेकिन मैं सोच रहा था एक और मेज है कि उपयोगकर्ताओं को करके अलग-अलग वोट संग्रहीत करता है तो हम हो जाएगा नहीं होगा यह जानने में सक्षम है कि उपयोगकर्ता ने पहले ही मतदान किया है या नहीं। और एक और तालिका प्रत्येक विषय के लिए वर्तमान वोट-योग संग्रहित करेगी। शायद उस तालिका में एक और फ़ील्ड होगा जो नवीनतम गणना किए गए sort_Value को संग्रहीत करेगा?

100% सटीक होने के लिए, sort_value प्रत्येक नया वोट के बाद अपडेट किया जाना चाहिए। यह डेटाबेस सर्वर पर बहुत अधिक भार जोड़ देगा, हालांकि, विशेष रूप से यदि हमने सभी विषयों को अपडेट करने का प्रयास किया है। यदि हमें करना है, तो हम डेटा के अंतिम एक्स # के लिए केवल sort_value की गणना करके डेटासेट को सीमित कर सकते हैं। हम समय-समय पर sort_value को अपडेट करके लोड को सीमित भी कर सकते हैं (उदाहरण के लिए क्रॉन जॉब के माध्यम से हर 5 मिनट)।

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

आप इसे कैसे बनाएंगे? :-)

उत्तर

0

ठीक है, यह मेरा विचार है। मैं old_table बनाकर शुरू करूंगा जिसमें एक sort_value फ़ील्ड वाले विषयों की एक्स पंक्तियां होंगी।

मैं एक ही टेबल पर कई अद्यतन विवरणों से बचना चाहता हूं, इसलिए मैं समय-समय पर पुरानी तालिका को ताज़ा गणना तालिका के साथ बदल दूंगा। जहां तक ​​मुझे पता है, MySQL "प्रतिस्थापन तालिका" वाक्यविन्यास का समर्थन नहीं करता है, इसलिए हर वाई मिनट, क्रॉन के माध्यम से, मैं new_sort_value नामक इस तालिका का एक अद्यतन संस्करण तैयार करूंगा।

  • ड्रॉप old_table
  • RENAME new_tableold_table करने के लिए

यह एक वैध दृष्टिकोण की तरह लग करता है: तो फिर मैं आदेशों की इस क्रम करेंगे?

+0

मुझे लगता है कि यह थोड़ा सा बेकार है तो मान्य है। दुर्भाग्य से आप उस सिस्टम की बाधाओं से निपट रहे हैं जिसमें आप जोड़ रहे हैं। इस प्रकार की समस्या को स्केल करना वास्तव में ऐसी चीज है जो rdbms डेटाबेस अच्छी तरह से नहीं करते हैं। कुछ सोफे डीबी व्यू की तरह कुछ इस गली पर सही होगा। –

+0

धन्यवाद, जेरेमी। मैं कॉच डीबी देखेंगे। मैंने अभी इस विचार के लिए एक और चिमटा के बारे में सोचा है, जो कि केवल (कहीं और) एक मूल्य को सहेजना है जो कहता है कि कौन सी तालिका 'सक्रिय है'। मान लें कि वर्तमान मान 'old_table' है। यह मेरे ऐप को 'old_table' के खिलाफ जॉइन करने के लिए बताएगा। फिर, एक अद्यतन 'new_table' बनाने के बाद, मैं "सक्रिय डेटाबेस" मान को 'new_table' पर अपडेट कर दूंगा। यह नियमित रूप से जॉइन के लिए अनुरोध की जा रही तालिका के एक डीआरओपी से बच जाएगा। – bobbyh

1

इस पर विचार करने के लिए कई ट्रेडऑफ हैं। आपने पहले से ही अपने प्रश्न में संकेत दिया है। समय और स्केल बनाम समयबद्धता और सटीकता।

गणना को कम करना और लोड को कम करने का सबसे अच्छा तरीका है यदि समयबद्धता और सटीकता आवश्यक नहीं है और सिस्टम को उच्च भार लिखने का अनुभव होता है।

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

निर्धारित करें कि आपके आवेदन के लिए कौन से सबसे महत्वपूर्ण हैं और उपयुक्त व्यापारिक कार्य करें।

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