2009-01-31 12 views
20

में किसी विशेष, परिवर्तनीय "ऑर्डर" को कैसे सहेजना है मान लीजिए कि मेरे पास कुछ ऑब्जेक्ट हैं, और मैं चाहता हूं कि उपयोगकर्ता उन्हें किसी भी तरह से उन्हें खींचकर, कहें, उन्हें फिर से व्यवस्थित करने में सक्षम हो। इसलिए मैं होगाकिसी डेटाबेस,

  • पनीर
  • muffins
  • दूध

और उसके बाद उपयोगकर्ता शीर्ष करने के लिए 'दूध' खींच लेता है, नए आदेश

  • दूध
  • बनाने
  • पनीर
  • muffins

क्या डेटाबेस में इन ऑब्जेक्ट्स के ऑर्डर को स्टोर करने का सबसे अच्छा अभ्यास है? बेवकूफ दृष्टिकोण शायद प्रत्येक ऑब्जेक्ट के लिए "ऑर्डर" नामक संख्यात्मक मान को संग्रहीत करना होगा, लेकिन यह मेरे लिए बहुत परेशानी की तरह लगता है, क्योंकि आपको अधिकतर समय ऑर्डर-वैल्यू को घुमा देना होगा।

+1

http://stackoverflow.com/questions/495390/orm-or-something-to-handle-sql-tables-with-an-order-column- के डुप्लिकेट- कुशलता से – cletus

उत्तर

11

आपके द्वारा सुझाए गए "बेवकूफ" दृष्टिकोण भी सबसे अच्छा अभ्यास है!

2

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

12

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

इस दृष्टिकोण के साथ नुकसान यह है कि यदि आपको कभी भी सबसेट (जैसे पहले 3 आइटम) की आवश्यकता होती है तो आपको अभी भी सभी आइटमों को खींचने या SQL लूप का उपयोग करने की आवश्यकता होती है। तो यह अद्यतन के दौरान सभी पंक्तियों को प्रभावित करने, या पढ़ने के दौरान सभी वस्तुओं तक पहुंचने के बीच है। हमेशा की तरह, गति को मापें और देखें कि आपकी स्थिति के लिए कौन सा बेहतर है।

2

यूप, एक रिलेशनल डेटाबेस में कोई ऑर्डर नहीं है, यह मौलिक अवधारणाओं में से एक है। तो संख्यात्मक मूल्य या उसके जैसा कुछ भी नहीं है।

5

टोनी एंड्रयू को देखते हुए और विशेष रूप से मार्क जवाब, ऐसा लगता है मैं वास्तव में केवल दो विकल्प हैं:,

  • एक 'अगले' मूल्य सहेजा जा रहा है वस्तुओं (मार्क के जवाब देखें)
    एक लिंक्ड सूची की तरह व्यवहार कर रही है इसके साथ, ऑर्डर बदलना सस्ता है, लेकिन मुझे आइटम पुनर्प्राप्त करना होगा और फिर उन्हें अपने 'अगले' मान से क्रमबद्ध करें, जो महंगा है
  • 'ऑर्डर' मान सहेजना (टोनी एंड्रयू का जवाब देखें)
    यह सस्ता पुनर्प्राप्त करता है लेकिन एक नया ऑर्ड बचाता है संभावित रूप से महंगा है, क्योंकि सबसे बुरे मामले में, मुझे सभी ऑर्डर मूल्यों को बदलना होगा। क्लीटस बताता है कि ऑर्डर गुणक के लिए 2^n के रूप में बड़ी संख्या में उपयोग किया जा सकता है।

मेटा: इन उत्तरों की सभी अच्छे और सही हैं, जो एक मैं के रूप में सही चुनना चाहिए?

+0

चूंकि आपने डीबी में स्टोर करने के बारे में पूछा था, इसलिए मैं "बेवकूफ" दृष्टिकोण के लिए वोट दूंगा .. मूल रूप से ऑफसेट के साथ ऑब्जेक्ट्स डालने से, 100 कहें, आप फिर से ऑर्डर टकराव को कम कर सकते हैं (जब आप चाहते थे एक नई स्थिति में फिर से डालने के लिए एक से अधिक ऑब्जेक्ट को बदलने के लिए) – lexu

+3

बिल्कुल 100% "सर्वश्रेष्ठ" नहीं है। यदि आपके पास लिखने से अधिक पढ़ने के तरीके हैं, तो पुनर्प्राप्ति की गति शायद प्राथमिक चिंता है। यदि आपके पास बहुत सारे लेख हैं या बड़ी संख्या में आइटम ऑर्डर करना है, तो इसके बजाय लिखना गति महत्वपूर्ण है। यह मामला-दर-मामला निर्णय है। फ्लोटिंग पॉइंट डेटा प्रकार के लिए – Tadmas

3

मेरे अनुप्रयोगों में पढ़े जाने वाले ऑपरेशन लिखने से कहीं अधिक बार होने जा रहे हैं। क्रमबद्ध क्रम इंगित करने के लिए संख्यात्मक मूल्य के साथ जाएं और वस्तुओं को पुन: व्यवस्थित करने की लागत से निपटें। यह इस तथ्य के लिए तैयार है कि आप प्रदर्शन उद्देश्यों के लिए सही क्रम में वस्तुओं को कुशलता से पुनर्प्राप्त कर सकते हैं (जो कि सामान्य अनुप्रयोग में सहारा देने से अधिक बार होता है)।

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

मंत्र के.आई.एस.एस. याद रखें

14

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

यह दोनों पढ़ और लिखने पर सस्ता है। केवल नकारात्मक पक्ष फ्लोट्स लंबे समय तक चल रहा है :)

+1

+1। यदि आप शुरुआती ऑर्डर मानों को 100 से ऑफसेट करते हैं और फ्लोट्स का उपयोग करते हैं, तो आप विशाल दशमलव स्थानों से बच सकते हैं और अभी भी टकराव के लिए डेटा प्रकार की खोज को समायोजित करने की आवश्यकता नहीं होने का लाभ है। – aviemet