2012-03-28 20 views
5

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

हमारे उत्पादों तालिका एक incrementing प्राथमिक कुंजी है कि शून्य है जो हम कितने उत्पादों आवंटित किया गया है यानी यदि उपयोगकर्ता उत्पाद सुरक्षित रखता है और आवंटित हो जाता है 1 का ट्रैक रखने के लिए उपयोग में शुरू होता है, अगले उपयोगकर्ता 2 आदि

हो जाता है समस्या यह है कि संभावित रूप से सैकड़ों हजारों उपयोगकर्ता किसी भी समय में सिस्टम तक पहुंचेंगे। इनमें से सभी इस टेबल को मार देंगे।

चूंकि हमें यह सुनिश्चित करने की आवश्यकता है कि प्रत्येक ग्राहक केवल एक उत्पाद आवंटित किया जाए और कितने उत्पादों को आवंटित किया गया है, इसका ट्रैक रखें, हम प्रत्येक ग्राहक के लिए एक पंक्ति लॉक का उपयोग करते हैं ताकि यह सुनिश्चित किया जा सके कि वे अगले ग्राहक से पहले तालिका में लिख सकें सिस्टम को हिट करता है - यानी पहले आते पहले नियमों को लागू करना।

हम इस समस्या के बारे में चिंतित हैं कि SQL सर्वर 2008 एंटरप्राइज़ संस्करण और पंक्ति लॉक में आने वाले प्रत्येक अनुरोध का प्रसंस्करण समय है।

हम एकाधिक सर्वर का उपयोग नहीं कर सकते हैं क्योंकि हमें प्राइम कुंजी की अखंडता सुनिश्चित करने की आवश्यकता है ताकि प्रतिकृति की आवश्यकता वाले किसी भी काम को काम नहीं किया जा रहा है।

क्या किसी को भी किसी भी अच्छे समाधान के बारे में पता है जो एक डेटाबेस तालिका पर बड़ी संख्या में अनुरोधों को संभालने में विशेष रूप से कुशल है?

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

किसी भी मदद के लिए धन्यवाद के मुकाबले एक उच्च मूल्य उत्पाद प्राप्त किया।

+1

क्या आप पुनः टैग कर सकते हैं, [sqlserver] शामिल कर सकते हैं और क्या आप मुझे अपना प्रश्न संपादित कर सकते हैं और हमें बता सकते हैं कि आपके पास 'SQL2008 एंटरप्राइज़ संस्करण' है, उदाहरण के लिए हम अनुरूप समाधान प्रदान करने में सक्षम हो सकते हैं उदाहरण के लिए तालिका विभाजन SQL 2008 ईई –

+0

धन्यवाद जेरेमी में उपलब्ध है। अतिरिक्त जानकारी जोड़ा गया। –

+0

स्पष्ट पहला सवाल; क्या आपने लेन-देन से सबकुछ छीन लिया है जो कुंजी प्राप्त करता है? जैसे आपको जो कुछ भी जानने की ज़रूरत है उसे प्राप्त करने से पहले आपको पता है, टेबल पर जाएं और अन्य सामान करने से पहले अनलॉक करें? – Karl

उत्तर

5

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

यहां एक महत्वपूर्ण सवाल यह है कि, सभी 1 एम आइटम समान हैं या नहीं? यदि वे हैं, तो इससे कोई फ़र्क नहीं पड़ता कि चाबियाँ किस क्रम में हैं (या यहां तक ​​कि यदि उनके पास ऑर्डर है), ताकि ग्राहक अनुरोध सबमिट कर सकें, तो आप तालिका को अद्यतन करने के लिए बस 'कोशिश करें':

UPDATE TOP(1) dbo.Giveaway -- you can use OUTPUT to return the key value here 
SET CustomerID = @CurrentCustomerID 
WHERE CustomerID IS NULL 

IF @@ROWCOUNT = 0 -- no free items left 
PRINT 'Bad luck' 
ELSE 
PRINT 'Winner' 

यदि दूसरी ओर 1 एम आइटम अलग हैं तो आपको एक और समाधान की आवश्यकता है, उदाहरण के लिए आइटम 1 एक्स है, आइटम 2-10 वाई हैं, 11-50 जेड इत्यादि हैं। इस मामले में अनुरोधों को जमा करने के क्रम में ग्राहकों को चाबियाँ सौंपना महत्वपूर्ण है, इसलिए आपको शायद किसी प्रकार की क्यूइंग सिस्टम देखना चाहिए, शायद सेवा ब्रोकर का उपयोग कर। प्रत्येक ग्राहक कतार में एक अनुरोध जोड़ता है, फिर एक संग्रहीत प्रक्रिया उन्हें एक समय में संसाधित करती है और उन्हें MAX मुक्त कुंजी असाइन करती है, फिर उन्होंने जो भी जीता है उसका ब्योरा देता है।

+0

'सेट ROWCOUNT' को SQL 2008 में बहिष्कृत किया गया है। इसके बजाय' अद्यतन शीर्ष (1) 'का उपयोग करें? http://msdn.microsoft.com/en-us/library/ms188774%28v=sql.100%29.aspx –

+0

@EdHarper हां, यह एक अच्छा बिंदु है और मैंने अपना उदाहरण अपडेट कर दिया है। हालांकि ओपी के लिए मुख्य संदेश निश्चित रूप से यह महत्वपूर्ण नहीं है कि जब तक आप केवल एक अपडेट करते हैं, तब तक आप किस पंक्ति को अपडेट करते हैं। – Pondlife

+0

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

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