2009-05-01 12 views
6

के लिए सबसे अच्छा अभ्यास मैं एक PHP एप पर काम कर रहा हूं जिसमें कई ऑब्जेक्ट्स हैं जिन पर टिप्पणी की जा सकती है। प्रत्येक टिप्पणी को वोट दिया जा सकता है, उपयोगकर्ता इसे +1 या -1 (जैसे डिग या रेडडिट) देने में सक्षम हैं। अभी मैं एक 'वोट' टेबल रखने की योजना बना रहा हूं जिसमें उपयोगकर्ता_आईडी और उनकी वोट जानकारी है, जो ठीक काम करने लगती है।टिप्पणी मतदान डेटाबेस संरचना

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

क्या ऐसा करने का एक आसान तरीका है जो कम डीबी गहन है? क्या मेरा वर्तमान डेटाबेस संरचना जाने का सबसे अच्छा तरीका है?

टिप्पणियाँ तालिका:

  • user_id
  • object_id
  • TOTAL_VOTES

वोट तालिका:

वर्तमान डेटाबेस संरचना के बारे में स्पष्ट होना करने के लिए

  • comment_id
  • user_id
  • वोट

अंत लक्ष्य:

  • उपयोगकर्ता प्रत्येक टिप्पणी कम से कम के साथ # MySQL क्वेरी पर केवल एक बार वोट करने के लिए अनुमति दें (प्रत्येक वस्तु कई टिप्पणियां हैं)

उत्तर

8

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

SELECT SUM(VoteValue) 
FROM Votes 
WHERE CommentID = ? 

क्या इससे मदद मिलती है?

+0

इससे वास्तव में बहुत मदद मिलती है, धन्यवाद! दो प्राथमिक कुंजी रखने के बारे में सोचा था कि मेरे दिमाग को भी पार नहीं किया गया .. – mdolon

0

आप प्रत्येक टिप्पणी के लिए कुल वोट क्यों नहीं सहेजते? एक नया वोट होने पर इसे बढ़ाएं/घटाएं।

फिर आपको यह जांचना होगा कि उपयोगकर्ता ने इस टिप्पणी के लिए विशेष रूप से मतदान किया है ताकि प्रत्येक उपयोगकर्ता प्रति टिप्पणी केवल एक वोट की अनुमति दे सके।

+0

चाल दूसरी बात है, यह जांच कर रही है कि क्या उपयोगकर्ता ने उस विशिष्ट टिप्पणी के लिए मतदान किया है - यह मूल रूप से एक अलग वोट टेबल लेता है। – mdolon

0

आप एक एसक्यूएल जॉइन शर्त डाल सकते हैं जो इस ऑब्जेक्ट के लिए मौजूदा उपयोगकर्ता द्वारा की गई टिप्पणियों पर सभी वोट देता है, यदि आपको कोई पंक्ति नहीं मिलती है, तो उपयोगकर्ता ने मतदान नहीं किया है। प्रोग्राम में प्रत्येक टिप्पणी को एक-एक करके जांचने से यह थोड़ा अलग है।

जहां तक ​​डेटाबेस संरचना का संबंध है, इन चीजों को अलग रखना पूरी तरह तार्किक लगता है। वोट {user_id, object_id, object_type, vote_info ...)

आप पहले से ही ऐसा कर रहे हैं, क्षमा करें, लेकिन अगर ऐसा होता तो मैं आपके पोस्ट से व्याख्या नहीं कर सका।