2013-02-27 169 views
10

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

वर्तमान में, उनके पास केवल तीन कॉलम हैं: id (पीके), userId और someFkRef। मुझे userId पर एक इंडेक्स है जो मुझे उपयोगकर्ता के पसंदीदा चुनने की अनुमति देता है।

वर्तमान में इन्हें id द्वारा आदेश दिया गया है जो प्रभावी रूप से केवल सम्मिलित क्रम है। हम उपयोगकर्ता को अपने पसंदीदा दोबारा ऑर्डर करने का मौका देना चाहते हैं, संभवतः किसी प्रकार के ड्रैग और ड्रॉप इंटरैक्शन के माध्यम से।

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

यह (सबसे अधिक संभावना है) खराब है।

इससे पहले कि मैं कितनी बुरी मात्रा में मात्रा निर्धारित करने की कोशिश कर रहा हूं, मैं सोच रहा हूं कि बेहतर तालिका-आधारित प्रतिनिधित्व है जो ऊपर वर्णित संचालन के प्रकारों में हेरफेर करने के लिए सस्ता है।

+0

मैं तुम्हें अनुक्रमणिका में नई क्षेत्र की जरूरत को समझाने नहीं कर रहा हूँ। –

+0

आम तौर पर, 'ऑर्डर बाय' ऑप्स को इंडेक्स की आवश्यकता होती है, नहीं? – spender

+0

आवश्यकता @spender नहीं है, लेकिन अपने तालिका पंक्तियों बड़े हैं और आप एक बड़े परिणाम सेट हो रही है, तरह एक सूचकांक का उपयोग कर काफ़ी कम आई/ओ उत्पन्न हो सकता है यदि। –

उत्तर

3

यदि आपको उपयोगकर्ताओं में कुछ एफकेआरएफ (उदाहरण के लिए, किसी चीज़ में दिलचस्पी रखने वाले उपयोगकर्ताओं की सूची प्राप्त करने) में हेरफेर करने में सक्षम होने की आवश्यकता नहीं है, तो आपके पास प्रति उपयोगकर्ता केवल एक रिकॉर्ड हो सकता है, जिसमें कुछ एफकेआरएफ (रेफरा , रेफबी)।

लेकिन यह डी-सामान्य का एक रूप है, और के रूप में यह कुछ कमियां भी हैं, यह वास्तव में (, और अपने भविष्य की जरूरतों कि है, जहां मुसीबत आता है) अपनी आवश्यकताओं पर निर्भर करता है

+0

हां, denormalization आपको एक ही उपयोगकर्ता के होने पर भी मारने जा रहा है: ए) आपको 'सीमा/ऑफसेट' की आवश्यकता है और एक बड़ी सूची में हेरफेर करना होगा; बी) उन आंकड़ों को इंटरनेट पर स्थानांतरित किया जाता है और उपयोगकर्ता एक तेज़ तरीके से सौ तत्वों की सूची टाइप करता है (हैलो, ओ (एन), लॅग और डिसिंक्रनाइज़ेशन)। Denormalization एक बड़ा दर्द है और किसी को कभी ऐसा करना नहीं चाहिए। –

6

एक खींचें और ड्रॉप बातचीत, बेहतर शर्त एक प्राथमिकता है। आप 1, 2, 3, और इसी तरह की प्राथमिकताओं के साथ शुरू करेंगे, बस एक क्रम क्रम की तरह।

लेकिन फिर, उपयोगकर्ता 1 और 2 के बीच आइटम 5 को स्थानांतरित करना चाहता है। वोला! इसे 1.5 का मान दें। कोई अन्य मूल्य बदलने की जरूरत नहीं है। सूचकांक अद्यतन बाकी का ख्याल रखता है।

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

आप एक प्रक्रिया है कि समय-समय पर किसी एक संख्या reassigns (या सभी उपयोगकर्ताओं, बैच में हैं) के साथ इसे ठीक कर सकते 1.

+0

यह भी एक मूल्यवान दृष्टिकोण है। लेकिन आपको अभी भी कुछ एफकेआरएफ कॉलम पर एक इंडेक्स रखना होगा, इसलिए यह अभी भी थोड़ा उपभोग करेगा, तालिका बहुत बड़ी है। –

+1

@SamuelEUSTACHI इंडेक्स सबसे खराब हिस्सा नहीं है। सबसे बुरा हिस्सा यह है कि फ्लोटिंग-पॉइंट नंबरों में परिशुद्धता सटीक है और कुछ 53 अच्छी तरह से डिज़ाइन की गई चाल के बाद कोई ऑर्डरिंग तर्क तोड़ सकता है। हां, आप हमेशा इस सूची को पुनर्निर्मित करने के लिए एक काउंटर और ट्रिगर कर सकते हैं, लेकिन मुझे बिल्कुल यकीन नहीं है कि यह एक और अधिक कुशल समाधान होगा। –

1

सुनिश्चित नहीं हैं कि अपने निर्भर संदर्भ ID फ़ील्ड के लिए हो सकता है पर शुरू है, लेकिन आपके पास इसे लिखने के बारे में सोचा? मुझे लगता है कि एक सेट पहचान INSERT = चालू है, या ऐसा कुछ जो आप कर सकते हैं।

मुझे पता है यह सुझाव देने के लिए एक अजीब बात है, लेकिन पर विचार तुम क्या करने की कोशिश कर रहे है, यह समझ बनाने सकता है, ए डी एन भूमि के ऊपर कम से कम मात्रा के कारण।

+0

@ जोचिम - रेनंबर रिकॉर्डकाउंट = 2 - दाता और प्राप्तकर्ता केवल रिकॉर्ड। रेइन्डेक्स अनिश्चित है - संभवतः उसे कुछ पैडिंग अंतर्निहित मिला है, और लाखों रिकॉर्ड के साथ, शायद ऑफ-पीक को फिर से अनुक्रमणित किया जा रहा है। – Chains