2010-04-11 16 views
10

में एक मतदान प्रणाली के लिए प्रभावी पुनर्प्राप्ति मेरे पास एक ऐसी प्रणाली है जहां पंजीकृत उपयोगकर्ता एक तस्वीर के लिए टिप्पणियां वोट/वोट कर सकते हैं। यह स्टैक ओवरफ्लो की मतदान प्रणाली के समान ही है।PHP और MySQL

मैं जैसे मूल्यों के साथ एक तालिका में वोट की दुकान:

vote_id | vote_comment_id | vote_user_id | vote_date | vote_type 

अब मैं गति और निम्नलिखित के लिए दक्षता के विषय में कुछ प्रश्न हैं:

समस्या: एक बार एक उपयोगकर्ता को खोलता है टिप्पणी के साथ चित्र पृष्ठ, मुझे आवश्यकता है कि उस उपयोगकर्ता ने इसे दिखाने के लिए टिप्पणी पर यूपी/डाउन को पहले से ही वोट दिया है; टिप्पणी के बगल में "आपने मतदान किया" या "आप नीचे मतदान" (स्टैक ओवरफ़्लो में वोट छवि हाइलाइट किया गया है)।

मेरी संभव समाधान: अभी जब मैं साथ ही वोटों की मेरी मेज के माध्यम से एक टिप्पणी के माध्यम से एक तस्वीर पेज मैं पाश, और मैं पाश खोलने के लिए और यदि कोई उपयोगकर्ता मतदान किया है की जाँच करें और स्थिति दिखाएगा (मैं vote_user_id तुलना उपयोगकर्ता के सत्र के साथ)।

यह कितना कुशल है? क्या इस तरह की समस्या से निपटने के लिए किसी के पास बेहतर दृष्टिकोण है?

+0

आप कैसे स्टोर कर रहे हैं कि यह एक वोट-वोट या डाउन-वोट है? –

+0

अच्छा खेद इसे यहां रखने से चूक गया। मेरे पास – Adnan

उत्तर

2

आप वोट की मेज के माध्यम से पाशन कर रहे हैं? क्या आप पूरे डेटाबेस को स्मृति में पढ़ रहे हैं और फिर इसके माध्यम से लूपिंग कर रहे हैं?

क्या आपने केवल प्रासंगिक डेटा के लिए डेटाबेस से पूछताछ की है?

SELECT vote_comment_id, vote_type 
FROM vote 
WHERE vote_user_id = 34513 
    AND vote_comment_id IN (3443145, 3443256, 3443983) 
+0

3.4+ मिलियन टिप्पणियां। आपके पास सक्रिय साइट है! :) – Atli

2

आप इस बात का जिक्र नहीं करते कि आप किस डेटाबेस का उपयोग कर रहे हैं लेकिन मुझे कुछ एसक्यूएल संस्करण लगता है।

हां, तो बजाय वोट की पूरी तालिका के माध्यम से पाशन की, आप कुछ तरह

select vote_type from vote_table where vote_comment_id = $commentId and vote_user_id = $userId 

या और भी बेहतर कर सकते हैं, जब आप वास्तविक टिप्पणियों को पुन: प्राप्त कर रहे हैं आप ऐसा

की तरह एक left join कर सकते हैं
select c.*, v.vote_type from comments c left join (select * from votes where vote_user_id = $userId) v on v.vote_comment_id = c.comment_id 

फिर जांच करें कि क्या आपके प्रदर्शन लूप में vote_type शून्य, ऊपर या नीचे है। यदि आपके पास 1000 टिप्पणियां हैं और केवल एक समय में 10 दिखाएं तो यह कम कुशल हो सकता है, इस मामले में पहली विधि में मदद करनी चाहिए।

[टिप्पणी के बाद संपादित vote_type स्तंभ के बारे में ऊपर]

+0

में एक फ़ील्ड 'vote_type' है, मैं MySQL का उपयोग करता हूं, और इसे भूलने के लिए खेद है मेरे पास वोट_ टाइप है। मैं अभी आपके समाधान का प्रयास करूंगा। – Adnan

0

क्या आपको उपयोगकर्ता द्वारा मतदान किए जाने वाले किसी भी कॉलम की आवश्यकता नहीं है, यानी post_id?

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


असल में, मैंने अभी देखा है कि vote_comment_id वह नहीं है जिसे मैंने इसे पढ़ा है (vote_comment)।

तुम बस अगर एक पंक्ति मौजूद है

-1

मेरे समाधान जब वह एक सत्र में में प्रवेश करने के है सब कुछ उपयोगकर्ता के वोट लाने के लिए है की जाँच की जरूरत है। दो सरणियों में सभी टिप्पणियों 'आईडी लायें:

$_SESSION['votes'] = array(
    'up' => array(12, 854, 87, 78), 
    'down' => array(84, 32, 77) 
); 

और जब उपयोगकर्ता पहुँच कुछ पेज की जांच करता है, तो अपने आईडी कि सरणियों में से किसी में मौजूद है।

+4

यह संसाधनों का अविश्वसनीय अपशिष्ट है। आप मूल रूप से डेटा के पहाड़ को ला रहे हैं और संग्रहीत कर रहे हैं जो सभी संभावनाओं में कभी भी उपयोग नहीं किया जाएगा। - डेटा पहले से ही MySQL के अंदर संग्रहीत है, और यह बहुत अधिक कुशल है कि MySQL प्रत्येक वोट को लॉग इन करने और उन्हें सत्र में संग्रहीत करने के लिए आवश्यक होने पर प्रत्येक वोट प्राप्त करने के लिए अधिक कुशल है (अनिवार्य रूप से उन्हें डुप्लिकेट करना) जहां उन्हें PHP में लोड किया जाएगा हर अनुरोध पर। – Atli

1

यदि आप बड़ी संख्या में पंक्तियों को पुनर्प्राप्त कर रहे हैं तो उप-चयन का उपयोग करने से बचने का प्रयास करें।

select c.*, v.vote_type 
from comments c 
left join vote v 
on v.vote_comment_id = c.comment_id 
and v.vote_user_id = $userId 

वोट_टाइप को प्रदर्शित/छुपाने के लिए केस स्टेटमेंट का उपयोग करना।

select c.*, CASE v.vote_user_id WHEN $userId 
THEN v.vote_type /*compare vote_user_id with the user's session*/ 
ELSE null END AS 'votetype' /*hide vote_type */ 
from comments c 
left join vote v 
on v.vote_comment_id = c.comment_id 
0

मेरे पास एक समान तर्क वाला साइट है। मैं अलग-अलग वोटों को ट्रैक नहीं करता (इसके लिए), मेरे पास केवल एक पोस्ट (छवियां) तालिका है, वोट गिनती और उपयोगकर्ता आईडी के साथ एक टेक्स्ट फ़ील्ड है: वोट; उपयोगकर्ता आईडी: वोट ... जोड़े, जहां वोट +/- है। इस तरह मुझे विशाल वोट तालिका से चयन करने की आवश्यकता नहीं है और मुझे वैसे भी पोस्ट से संबंधित पंक्ति लोड करने की आवश्यकता है। "Userid:" के लिए एक सरल स्ट्रिंग खोज से पता चलता है कि वर्तमान उपयोगकर्ता ने मतदान किया था या नहीं।

वोट गणना और वोट टेक्स्ट फ़ील्ड को लगातार रखने के लिए एसीआईडी ​​लेनदेन की आवश्यकता होती है।