2008-12-05 11 views
13

मैं लिख रहा हूं कि इंट्रानेट एप्लिकेशन क्या होगा, और इसकी एक विशेषता सामग्री वोटिंग के लगभग समान है - एसओ, अमेज़ॅन और कई अन्य साइटों के विपरीत नहीं।डेटाबेस में "वोट" संग्रहीत

सामग्री के प्रत्येक votable टुकड़ा मान लिया जाये कि एक अद्वितीय ID है, और प्रत्येक उपयोगकर्ता (वे प्रमाणीकृत कर रहे हैं) की अनन्य आईडी है, सबसे आसान तरीका है एक "वोट" तालिका के लिए होने लगते हैं ...

ContentID int 
UserID int 
VoteValue int 

लेकिन यह प्रति पंक्ति एक पंक्ति बनाता है - सामग्री के लाखों टुकड़ों और हजारों उपयोगकर्ताओं के साथ, यह तालिका बहुत बड़ी विशाल होगी। क्या यह करने का सबसे अच्छा तरीका है? मेरा मतलब है, एक पूर्णांक 4 बाइट लेता है, प्रत्येक पंक्ति 12 बाइट्स लेता है। सामग्री की एक लाख टुकड़े एक सौ वोट मिलता है, कि 400MB + भंडारण में, हाँ है? लगता है ... बहुत पसंद है :)। यहां तक ​​कि अगर VoteValue एक tinyint (जो शायद ठीक है) और केवल 1 बाइट है, जो अभी भी तालिका में कुछ सौ मेगाबाइट है। मेरा मतलब शीश है।

क्या कोई शानदार तरीका है? मैं एक अलग डेटाबेस (संभावित डेटा अखंडता मुद्दों की अनदेखी कर) भंडारण और प्रदर्शन के मामले में "मुख्य" डेटा से यह विभाजन में इस "वोट" तालिका की दुकान चाहिए?

(मुझे लगता है कि आज की दुनिया 400MB में एक टन नहीं है -, लेकिन की तरह एक बहुत सिर्फ वोट स्टोर करने के लिए ऐसा लगता है, हाँ)

उत्तर

7

निजी तौर पर जब तक आप जगह में अच्छा अनुक्रमित है के रूप में, आप कर रहे हैं इसके बारे में सही तरीके से जा रहा है। आपके उपयोग के आधार पर, प्रदर्शन के लिए आप माध्यमिक गिनती जानकारी संग्रहीत करके वोट तालिका को मारने से बचने का प्रयास कर सकते हैं, लेकिन कुल मिलाकर यदि आपको डब्ल्यूएचओ ने कुछ वोट दिया है, तो आपको कुल मिलाकर जिस तरीके से सूचीबद्ध किया गया है, उसे करने की आवश्यकता है।

यदि आप वास्तव में SQL सर्वर में चिंतित हैं तो आप किसी अन्य डेटाबेस में जाने से परेशान नहीं होंगे, आप इसे पकड़ने के लिए एक अलग फ़ाइल समूह बना सकते हैं ..... लेकिन अधिकतर आवश्यक नहीं है।

11

वैसे, हाँ, लेकिन आप बड़ी तस्वीर को देखने के लिए की जरूरत है। सामग्री के लाखों टुकड़ों के साथ:

(सामग्री का आकार) >> (वोटों का आकार): जहां ">>" का अर्थ है "बहुत अधिक।"

यदि आपके पास सामग्री के लाखों टुकड़े हैं तो यह डेटा का टेराबाइट हो सकता है जहां वोट 400 एमबी हैं। बड़ा सौदा सही है?

मैं भी जोड़ना होगा यदि आप scalability को लेकर चिंतित हैं, इस ब्लॉग की जाँच:

http://highscalability.com/

4

आप ट्रैक करने के लिए एक उपयोगकर्ता किसी विशेष आइटम के लिए मतदान किया गया है या नहीं की जरूरत है, और अगर वहाँ भिन्न हैं, तो वोट के मूल्यों (ताकि 1 5 स्टार को स्टार, उदाहरण के लिए), तो इस बारे में के रूप में कॉम्पैक्ट के रूप में यह हो जाता है है।

समझ में नहीं आता है कि समझदार पहुंच गति के लिए, आपको डेटा (दो इंडेक्स, शायद - एक सामग्री कॉलम के साथ अग्रणी कॉलम के रूप में, एक अग्रणी कॉलम के रूप में उपयोगकर्ता आईडी के साथ) को अनुक्रमणित करने की आवश्यकता होगी।

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

4

वोटिंग दुर्व्यवहार के आसान पहचान के लिए आप शायद तालिका में सामग्री के लेखक की आईडी भी चाहेंगे। (हाँ, यह संभवतः अनावश्यक जानकारी है।एक वैकल्पिक नियमित रूप से देखने के लिए कौन किसे मतदान है एक सारांश तालिका बनाने जा रहा है)

क्या इसके लायक है के लिए, perlmonks वोट तालिका इस प्रकार है:।

`vote_id` int(11) NOT NULL default '0', 
`voter_user` int(11) NOT NULL default '0', 
`voted_user` int(11) default NULL, 
`weight` int(11) NOT NULL default '0', 
`votetime` datetime NOT NULL default '0000-00-00 00:00:00', 
`ip` varchar(16) default NULL, 
PRIMARY KEY (`vote_id`,`voter_user`), 
KEY `voter_user_idx` (`voter_user`,`votetime`), 
KEY `voted_user_idx` (`voted_user`,`votetime`) 

(vote_id है सामग्री आईडी, आईपी है एक आईपी पता।)

0

मैं कहूंगा कि आपको यह पता लगाने की आवश्यकता है कि इन वोटों का उपयोग कैसे किया जाएगा और पहले आपके डेटा मॉडल के लिए विशिष्ट प्रश्नों का डिजाइन किया जाएगा। यह आवश्यक रूप से एसक्यूएल मॉडल नहीं है। यदि आप एसक्यूएल दुनिया से आ रहे हैं, तो आधिकारिक मोंगोडीबी ट्यूटोरियल से गुज़रने से शुरुआत के लिए दिमाग को साफ करने में मदद मिलती है।

उदाहरण के लिए, यदि आपको केवल एक ही समस्या पृष्ठ के लिए वोट स्टोर और प्रदर्शित करने की आवश्यकता है, तो इस मुद्दे के एकल स्ट्रिंग फ़ील्ड में वोट स्टोर करना सुविधाजनक हो सकता है, जो id1:id2:id3: जैसा दिखेगा। जारी करने के लिए

  1. गणना सब वोट:: सभी आईडी मान लिया जाये कि कुछ रोचक गुण देखते हैं एक ही लंबाई के होते हैं,

    len(issue.votes)/len(id)

  2. ढूँढें मैं इस मुद्दे पर मतदान

    myid in issue.votes

  3. आपके द्वारा मतदान किए गए सभी मुद्दों को ढूंढें:

    select issue.id from issues where issue.votes contains(myid)

  4. खोजें सबसे मुद्दों

    select issue.id from issues order by len(issue.votes) desc limit 10

यह वास्तुकला महंगा गणना से बचने के लिए पर इन विशिष्ट मामलों में पढ़ते हैं, लेकिन वोट पर issue.votes अद्यतन करने से ज्यादा महंगा हो सकता है की अनुमति देता है मतदान एक टेबल में एक पंक्ति जोड़ना। इस मामले में प्रति आईडी 4 बाइट्स के साथ 100 वोट + विभाजक 500 बाइट स्ट्रिंग है। आपके प्रस्तावित संस्करण में 100 वोट 800 बाइट हैं।

अस्वीकरण: मैंने कभी ऐसा कुछ भी लागू नहीं किया है, यह सिर्फ एक विचार है।

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