दिलचस्प पोस्ट
पुनरावर्तन को समझना एनजीआईएनएक्स प्रॉक्सी वेबसाइट्स को रिवर्स करने और एसएसएल (डब्ल्यूएसएस: //) को सक्षम करने के लिए? जावा विभाजन मेरे पात्रों को खा रहा है जब म्यूट एक्स के बजाय स्पिनल का उपयोग करना चाहिए? जावास्क्रिप्ट के बराबर अपने चरित्र में पूर्णांक को परिवर्तित करें रेलवे कंसोल से डिवाईज का उपयोग करने वाले उपयोगकर्ता में साइन इन कैसे करें? WINMAIN और मुख्य () सी ++ (विस्तारित) में टकन्नेटर में एक बटन कमांड में तर्क कैसे पास करें? रनटाइम पर एक जार फ़ाइल कैसे लोड करें क्या GUID अद्वितीय समय का 100% है? फैक्ट्री, सार फैक्टरी और फैक्टरी विधि प्रदर्शन को समझने के लिए SEGUWithIdentifier "के रूप में?", "जैसा!", और "के रूप में" क्या अंतर है? कैसे सी # में एक अपवाद वस्तु serialize करने के लिए? तार के एक आयामी सरणी को कोणीय संसाधन द्वारा 2d तक पार्स किया जा रहा है

डेटाबेस तालिका में क्रमबद्ध क्रम कॉलम का उपयोग करना

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

मैं रिकॉर्ड्स को क्रमबद्ध करने के लिए उपयोग करने के लिए एक Order कॉलम (पूर्णांक) बना रहा हूं, लेकिन मुझे उस आर्टिकल विधियों के कारण प्रदर्शन के बारे में कुछ सिरदर्द मिलते हैं, जो मुझे वास्तव में बदलने की जरूरत के बाद हर रिकॉर्ड के क्रम को बदलते हैं। एक उदाहरण:

 Id Order 5 3 8 1 26 2 32 5 120 4 

अब ID=26 से 3 के साथ रिकॉर्ड के क्रम को बदलने के लिए मैं क्या कर सकता हूं?

मैंने जो किया वह एक ऐसी प्रक्रिया का निर्माण कर रहा था जो यह निर्धारित करता है कि लक्ष्य ऑर्डर (3) में एक रिकॉर्ड है या नहीं, और यदि पंक्ति के क्रम को अपडेट नहीं किया जाता है (आईडी = 26) यदि लक्ष्य ऑर्डर में कोई रिकॉर्ड है तो यह प्रक्रिया स्वतः ही उस पंक्ति की आईडी को target order + 1 साथ मापदंडों के रूप में भेजती है।

उस जगह को बदलने के लिए हर एक रिकॉर्ड का कारण बनता है जिसे मैं कमरे में बदलने के लिए बदलना चाहता हूं:

 Id Order 5 4 8 1 26 3 32 6 120 5 

तो एक स्मार्ट व्यक्ति क्या करेंगे?

  • मैं SQL सर्वर 2008 R2 का उपयोग करता हूँ

संपादित करें:

किसी मद की ऑर्डर कॉलम की ज़रूरत है जिसमें कोई माध्यमिक चाबियाँ शामिल नहीं होती हैं जो कि इसमें शामिल होती हैं। केवल ऑर्डर कॉलम को अपने रिकॉर्ड के लिए एक अनूठे स्थान निर्दिष्ट करना होगा।

सभी के अलावा, मुझे आश्चर्य है कि अगर मैं किसी लिंक्ड सूची की तरह कुछ भी लागू कर सकता हूं: अगले आइटम आईडी रखने के लिए 'ऑर्डर' कॉलम के बजाय एक 'अगला' कॉलम लेकिन मुझे यह पता नहीं है कि सही क्रम के साथ रिकॉर्ड प्राप्त करने वाली क्वेरी कैसे लिखनी है। अगर किसी के पास भी इस दृष्टिकोण के बारे में कोई विचार है, तो कृपया साझा करें।

वेब के समाधान से एकत्रित समाधान "डेटाबेस तालिका में क्रमबद्ध क्रम कॉलम का उपयोग करना"

 Update product set order = order+1 where order >= @value changed 

हालांकि समय के साथ आप अपने आदेश में बड़ा और बड़ा "रिक्त स्थान" प्राप्त करेंगे, लेकिन यह अभी भी "सॉर्ट"

यह 1 को जोड़ दिया जायेगा मूल्य और उसके बाद प्रत्येक मान एक बयान में, लेकिन उपरोक्त विवरण अभी भी सच है बड़ा और बड़ा "रिक्त स्थान" आपके आदेश में संभवतः एक INT मूल्य से अधिक के बिंदु तक हो जाएगा

वैकल्पिक रिक्त स्थान की कोई इच्छा नहीं दी गई:

के लिए एक प्रक्रिया की कल्पना करें: UpdateSortOrder @NewOrderVal, @ IDToChange के पैरामीटर के साथ, @ OriginalOrderVal

दो कदम प्रक्रिया के आधार पर अगर नया / पुराना आदेश ऊपर या नीचे बढ़ रहा है

 If @NewOrderVal < @OriginalOrderVal --Moving down chain --Create space for the movement; no point in changing the original Update product set order = order+1 where order BETWEEN @NewOrderVal and @OriginalOrderVal-1; end if If @NewOrderVal > @OriginalOrderVal --Moving up chain --Create space for the momvement; no point in changing the original Update product set order = order-1 where order between @OriginalOrderVal+1 and @NewOrderVal end if --Finally update the one we moved to correct value update product set order = @newOrderVal where ID=@IDToChange; 

सर्वश्रेष्ठ अभ्यास के बारे में; अधिकांश वातावरण मैं आमतौर पर श्रेणी के आधार पर वर्गीकृत कुछ और वर्णानुक्रमित सॉर्ट करना चाहता हूं या "लोकप्रियता पर बिक्री" के आधार पर एक उपयोगकर्ता परिभाषित सॉर्ट प्रदान करने की आवश्यकता को नकार देता है।

पुरानी चाल का उपयोग करें जो बेसिक कार्यक्रमों (अन्य स्थानों के बीच) का उपयोग किया गया: ऑर्डर कॉलम में संख्या 10 या कुछ अन्य सुविधाजनक वृद्धि द्वारा छलांग। फिर आप दो मौजूदा संख्याओं (जो कि 10 अलग हैं) के बीच एक पंक्ति (वास्तव में, 9 पंक्तियों तक, यदि आप भाग्यशाली हैं) डालें। या आप 570 ऊपर की ओर से किसी भी पंक्तियों को बदलने के बिना पंक्ति 370 से 565 ले जा सकते हैं।

मैंने हाल में इस्तेमाल किया एक समाधान, कुछ सफलता के साथ, 'ऑर्डर' के बजाय 'वजन' का उपयोग करना है वजन स्पष्ट है, भारी आइटम (यानी: कम संख्या) नीचे के लिए डूबता है, हल्का (उच्च संख्या) शीर्ष पर बढ़ जाता है

इस घटना में मेरे पास एक ही वजन के साथ कई आइटम हैं, मुझे लगता है कि वे एक ही महत्व के हैं और मैं उन्हें वर्णानुक्रम के अनुसार क्रमबद्ध करता हूं

इसका अर्थ है कि आपका एसक्यूएल ऐसा कुछ दिखाई देगा:

 ORDER BY 'weight', 'itemName' 

उम्मीद है की वो मदद करदे।

यहां एक सामान्य तालिका अभिव्यक्ति (सीटीई) का उपयोग करते हुए एक वैकल्पिक दृष्टिकोण है

यह दृष्टिकोण सिकॉर्डर कॉलम पर एक अनूठी इंडेक्स का सम्मान करता है, और क्रमशः क्रम क्रम में किसी भी अंतराल को बंद करेगा जो पूर्व में DELETE संचालन से बचा जा सकता है।

 /* For example, move Product with id = 26 into position 3 */ DECLARE @id int = 26 DECLARE @sortOrder int = 3 ;WITH Sorted AS ( SELECT Id, ROW_NUMBER() OVER (ORDER BY SortOrder) AS RowNumber FROM Product WHERE Id <> @id ) UPDATE p SET p.SortOrder = (CASE WHEN p.Id = @id THEN @sortOrder WHEN s.RowNumber >= @sortOrder THEN s.RowNumber + 1 ELSE s.RowNumber END) FROM Product p LEFT JOIN Sorted s ON p.Id = s.Id 

(अंग्रेजी के लिए खेद है। मैं अध्ययन कर रहा हूं)

बहुत सरल है आपको "कार्डिनलिटी छेद" की आवश्यकता है

संरचना आपको 2 कॉलम की आवश्यकता है

1) पीके = 32 बिट int

2) ऑर्डर = 64 बिट बिल्टीन्ट (बिगिनट, डबल डॉटल !!!)

सम्मिलित / अपडेट

1) जब आप पहली बार नया रिकॉर्ड डालें तो आपको ऑर्डर = राउंड (अधिकतम_बिगिन / 2) सेट करना होगा।

2) यदि आप तालिका की शुरुआत में डालें तो आपको ऑर्डर = राउंड ("पहले रिकॉर्ड का क्रम" / 2) सेट करना होगा

3) यदि आप टेबल के अंत में सम्मिलित करते हैं तो आपको ऑर्डर = राउंड सेट करना होगा ("अधिकतम_बजिंट – अंतिम रिकॉर्ड का क्रम" / 2)

4) यदि आप मध्य में डालें तो आपको ऑर्डर = राउंड सेट करना होगा ("रिकॉर्ड के क्रम से पहले – रिकॉर्ड के क्रम में" / 2)

इस पद्धति में बहुत बड़ी कार्डिटालिटी है यदि आपके पास बाधा त्रुटि है या यदि आपको लगता है कि आपके पास छोटा कार्डिनल है तो आप ऑर्डर कॉलम (सामान्यीकृत) को फिर से बना सकते हैं।

सामान्यीकृत स्थिति (इस संरचना के साथ) में अधिकतम 32 बिट में "कार्डिनेलिटी छेद" हो सकता है

सरल और तेज़ है!

याद नहीं दोहरा !!! केवल इंट-ऑर्डर सटीक मान है!

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

मैंने यह दस्तावेज बनाया है कि यह वर्णन करता है कि हम कैसे क्रम के भंडारण को लागू करने जा रहे हैं, जिसमें एक उदाहरण postgresql है टिप्पणी करने के लिए स्वतंत्र हैं!

https://docs.google.com/document/d/14WuVyGk6ffYyrTzuypY38aIXZIs8H-HbA81st-syFFI/edit?usp=sharing