यह प्रश्न वास्तव में आपके डेटा मॉडल के एक में लुढ़कने के मुद्दों का एक गुच्छा है। आपको उन्हें एक समय में एक करने की आवश्यकता है। जैसा कि आप पहेली के प्रत्येक टुकड़े को सरल बनाने की कोशिश करते हैं, अधिक प्राकृतिक, सहज समाधान निकल जाएंगे।
समस्या 1: आप DB ऑर्डर पर निर्भर नहीं रह सकते
आपके डेटा को सॉर्ट करने के आपके विवरण स्पष्ट नहीं हैं।
- सबसे बड़ी संभावित समस्या यह है कि आप अपने डेटाबेस में एक
ORDER BY
खंड के माध्यम से एक स्पष्ट प्रकार निर्दिष्ट नहीं कर रहे हैं । यदि आप नहीं कर रहे हैं क्योंकि यह बहुत महंगा लगता है, तो आपके प्रोग्राम में बग है । यदि आप एक निर्दिष्ट नहीं करते हैं तो डेटाबेस को किसी भी क्रम में परिणाम वापस करने की अनुमति है ; आप इस पर निर्भर नहीं कर सकते कि संयोग से डेटा वापस आ रहा है सिर्फ इसलिए कि आपने क्वेरी को कुछ बार चलाया और यह इस तरह दिखता है। आदेश बदल सकता है क्योंकि डिस्क पर पंक्तियों को फिर से व्यवस्थित किया जाता है, या कुछ हटा दिए जाते हैं और नए लोग अपनी जगह लेते हैं, या एक सूचकांक जोड़ा जाता है। आपको किसी प्रकार का एक खंड निर्दिष्ट करना होगा ORDER BY
। गति बिना शुद्धता के बेकार है।
- यह भी स्पष्ट नहीं है कि आप सम्मिलन आदेश से क्या मतलब है। यदि आप स्वयं डेटाबेस के बारे में बात कर रहे हैं, तो आपके पास एक कॉलम होना चाहिए जो वास्तव में इसे ट्रैक करता है, और इसे आपके क्लॉज़ में शामिल किया जाना चाहिए
ORDER BY
। अन्यथा, आपके पास कीड़े हैं। यदि ऐसा कॉलम अभी तक मौजूद नहीं है, तो आपको एक जोड़ने की आवश्यकता है। इस तरह के कॉलम के लिए विशिष्ट विकल्प एक प्रविष्टि टाइमस्टैम्प कॉलम या एक ऑटो-इंक्रीमेंटिंग कुंजी होगी। ऑटो-इन्क्रिमेंटिंग कुंजी अधिक विश्वसनीय है।
समस्या 2: स्मृति क्रमबद्ध बनाना कुशल
एक बार जब आप यह सुनिश्चित कर लें यह है की गारंटी प्रकार आदेश जैसा कि आप उम्मीद, आप स्मृति में बनाने के लिए इस तथ्य का लाभ उठा सकते में डेटा लौट करने के लिए बहुत अधिक कुशल। बस एक जोड़ेंrow_number()
याdense_rank()
आपकी क्वेरी के परिणाम सेट करने के लिए स्तंभ (या अपने डेटाबेस के समकक्ष)। अब प्रत्येक पंक्ति में एक सूचकांक होता है जो आपको प्रत्यक्ष संकेत देगा कि आदेश क्या माना जाता है, और आप इसे स्मृति में तुच्छ रूप से क्रमबद्ध कर सकते हैं। बस सुनिश्चित करें कि आप सूचकांक को एक सार्थक नाम (जैसे sortedBySomethingIndex
) दें।
वियोला। अब आपको डेटाबेस परिणाम सेट आदेश पर निर्भर नहीं रहना होगा।
समस्या 3: क्या आपको यह प्रक्रिया कोड में भी करने की आवश्यकता है?
एसक्यूएल वास्तव में है शक्तिशाली है। यह एक अद्भुत घोषणात्मक भाषा है जो आपको अपने डेटा पर बहुत सारे परिवर्तन और एकत्रीकरण करने देती है। अधिकांश डीबी आजकल क्रॉस पंक्ति संचालन का भी समर्थन करते हैं। वे खिड़की या विश्लेषणात्मक कार्य कहलाते हैं:
क्या आपको भी अपने डेटा को इस तरह मेमोरी में खींचने की ज़रूरत है? या आप विंडो फ़ंक्शन का उपयोग करके SQL क्वेरी में सभी काम कर सकते हैं? यदि आप DB में काम के सभी (या शायद सिर्फ एक महत्वपूर्ण हिस्सा) कर सकते हैं, तो शानदार! आपकी कोड समस्या दूर हो जाती है (या बहुत सरल हो जाती है)!
समस्या 4: आप क्या कर रहे हैं data
?
यह मानते हुए कि आप DB में यह सब नहीं कर सकते हैं, मुझे इसे सीधे करने दें। आप डेटा को मानचित्र के रूप में ले रहे हैं (जो कि उन चीजों से जुड़ा हुआ है जिन्हें आप क्रमबद्ध नहीं करना चाहते हैं), फिर आप इस पर ध्यान केंद्रित कर रहे हैं प्रविष्टि क्रम , और कुछ चाबियों का मूल्य की जगह और जोड़कर जगह में नक्शे को संशोधित एक नए?
मैं माफी चाहता हूँ, लेकिन क्या बिल्ली?
कॉल करने वालों को इस सब के बारे में चिंता करने की ज़रूरत नहीं होनी चाहिए । आपके द्वारा बनाया गया सिस्टम अत्यंत है नाजुक है। यह केवल एक गूंगा गलती लेता है (शायद अपने आप से भी, जैसा कि हम सभी ने किया है) एक छोटे से गलत बदलाव के लिए और पूरी चीज ताश के पत्तों की तरह ढह जाती है।
यहाँ शायद एक बेहतर विचार है:
- क्या आपका कार्य स्वीकार है
List
।
- कुछ तरीके हैं जिनसे आप ऑर्डर करने की समस्या को संभाल सकते हैं।
- फेल फास्ट अप्लाई करें। यदि फ़ंक्शन को आवश्यकता होती है तो सूची में त्रुटि नहीं है। (नोट: आप समस्या 2 से सॉर्ट इंडेक्स का उपयोग यह बताने के लिए कर सकते हैं कि यह है।)
- अपने आप को एक क्रमबद्ध प्रतिलिपि बनाएँ (फिर समस्या 2 से सूचकांक का उपयोग करके)।
- क्रम में नक्शा खुद बनाने के लिए एक तरह से चित्रा।
- आंतरिक रूप से फ़ंक्शन के लिए आवश्यक मानचित्र का निर्माण करें, इसलिए कॉलर को इसकी परवाह नहीं करनी चाहिए।
- अब आपके पास जो भी आदेश प्रतिनिधित्व है उस पर पुनरावृति करें और जो आपके पास है उसे करें।
- नक्शा लौटाएँ, या इसे उचित वापसी मूल्य में बदलें
एक संभावित भिन्नता एक छांटे गए प्रतिनिधित्व का निर्माण करने के लिए हो सकती है और फिर सूचकांक की कुंजी का एक नक्शा बना सकती है । यह आपको गलती से डुप्लिकेट बनाए बिना, अपनी सॉर्ट की गई कॉपी को संशोधित करने देगा।
या शायद यह अधिक समझ में आता है: data
पैरामीटर से छुटकारा पाएं और processData
वास्तव में अपना डेटा प्राप्त करें। तब आप यह दस्तावेज़ कर सकते हैं कि आप ऐसा कर रहे हैं, क्योंकि इसमें उस डेटा की बहुत विशिष्ट आवश्यकताएं हैं जिस पर डेटा प्राप्त होता है। दूसरे शब्दों में, फंक्शन को अपना बनाएं को पूरी प्रक्रिया का , न कि केवल इसका एक टुकड़ा; अंतर-निर्भरताएं तर्क को छोटे टुकड़ों में विभाजित करने के लिए बहुत मजबूत हैं। (प्रक्रिया में फ़ंक्शन का नाम बदलें।)
शायद ये आपकी स्थिति के लिए काम नहीं करेंगे। मैं समस्या के पूर्ण विवरण के बिना नहीं जानता। लेकिन मैं एक नाजुक और भ्रामक डिजाइन जानता हूं जब मैं सुनता हूं।
सारांश
मुझे लगता है कि यहां समस्या अंततः यह है कि शैतान विवरण में है। जब मैं इस तरह से मुसीबत में दौड़ना शुरू करता हूं, तो यह आमतौर पर होता है क्योंकि मेरे पास वास्तव में हल करने की कोशिश कर रहे समस्या के लिए मेरे डेटा का अनुचित प्रतिनिधित्व है । सबसे अच्छा समाधान एक बेहतर प्रतिनिधित्व है , और फिर मेरी समस्या को हल करने के लिए सरल (शायद आसान नहीं है, लेकिन सीधा) हो जाता है।
किसी ऐसे व्यक्ति को खोजें जो उस बिंदु को प्राप्त करता है: आपका काम आपकी समस्या को सरल, सीधे लोगों के एक समूह में कम करना है। तब आप मजबूत, सहज ज्ञान युक्त कोड बना सकते हैं। उनसे बात करो। अच्छा कोड और अच्छा डिज़ाइन आपको लगता है कि कोई भी बेवकूफ उन्हें सोच सकता था, क्योंकि वे सरल और सीधे हैं। हो सकता है कि एक वरिष्ठ डेवलपर है जिसके पास वह मानसिकता है जिससे आप बात कर सकते हैं।