कोई संबंध डेटाबेस के लिए विशिष्ट समाधान की तरह
user_invoice_numbers (user_id int primary key clustered, last_id int)
एक मेज और एक संग्रहीत प्रक्रिया या की तरह
update user_invoice_numbers set last_id = last_id + 1 where user_id = @user_id
select last_id from user_invoice_numbers where user_id = @user_id
एक SQL क्वेरी यदि प्रत्येक उपयोगकर्ता में कुछ है यह उपयोगकर्ताओं के लिए काम करेंगे (हो सकता है साथ ही लेनदेन चलाना) लेकिन कंपनियों के लिए काम नहीं करेगा (उदाहरण के लिए जब आपको company_invoice_numbers की आवश्यकता होती है) क्योंकि एक ही कंपनी के अंदर विभिन्न उपयोगकर्ताओं के लेन-देन एक-दूसरे को अवरुद्ध कर सकते हैं और इस तालिका में एक प्रदर्शन बाधा होगी।
आपको सबसे महत्वपूर्ण कार्यात्मक आवश्यकता की जांच करनी चाहिए क्या आपके सिस्टम को इनवॉइस नंबरिंग में अंतर होने की अनुमति है या नहीं है। जब आप मानक auto_increment का उपयोग करते हैं, तो आप अंतराल की अनुमति देते हैं, क्योंकि अधिकांश डेटाबेस में मुझे पता है, जब आप रोलबैक लेनदेन करते हैं, तो बढ़ी हुई संख्या को वापस नहीं किया जाएगा। इसे ध्यान में रखते हुए, आप निम्नलिखित दिशानिर्देशों में से एक का उपयोग करके प्रदर्शन में सुधार कर सकते हैं
1) लंबे समय से चल रहे लेनदेन से नई संख्या प्राप्त करने के लिए उपयोग की जाने वाली प्रक्रिया को छोड़ दें। मान लीजिए कि चालान प्रक्रिया में डालें जटिल सर्वर-साइड तर्क के साथ एक लंबा चल रहा लेनदेन है। इस मामले में आप पहले एक नई आईडी प्राप्त करते हैं, और फिर, अलग लेनदेन में नए चालान डालें। यदि अंतिम लेनदेन वापस लुढ़का जाएगा, तो ऑटो-नंबर कम नहीं होगा।लेकिन user_invoice_numbers लंबे समय तक लॉक नहीं होंगे, इसलिए बहुत से उपयोगकर्ता एक ही समय में चालान डाल सकते हैं
2) प्रत्येक उपयोगकर्ता के लिए अंतिम आईडी वाले डेटा को संग्रहीत करने के लिए पारंपरिक लेनदेन डेटाबेस का उपयोग न करें। जब आपको चाबियों और मानों की सरल सूची बनाए रखने की आवश्यकता होती है तो वहां बहुत छोटे लेकिन तेज़ डेटाबेस इंजन होते हैं जो आपके लिए यह काम कर सकते हैं। List of Key/Value databases। शायद memcached सबसे लोकप्रिय है। अतीत में, मैंने उन परियोजनाओं को देखा जहां सरल कुंजी/मूल्य भंडार जहां विंडोज रजिस्ट्री या यहां तक कि एक फ़ाइल सिस्टम का उपयोग करके कार्यान्वित किया गया था। एक निर्देशिका थी जहां प्रत्येक फ़ाइल का नाम कुंजी था और प्रत्येक फ़ाइल के अंदर अंतिम आईडी थी। और एसक्यूएल टेबल का उपयोग करते हुए यह मोटा समाधान अभी भी बेहतर था, क्योंकि ताले जारी किए गए और बहुत जल्दी जारी किए गए और लेनदेन के दायरे में शामिल नहीं थे।
ठीक है, अगर आपके प्रोजेक्ट के लिए ऑप्टिमाइज़ेशन के लिए मेरा प्रस्ताव अधिक जटिल लगता है, तो इस बारे में भूल जाओ, जब तक आप वास्तव में प्रदर्शन समस्याओं में भाग नहीं लेते। अधिकांश परियोजनाओं में एक अतिरिक्त तालिका के साथ सरल विधि बहुत तेज काम करेगा।
मैं चालान को संपादित/हटाने की इजाजत नहीं दे रहा हूं, जिससे कि पूरी चीज को थोड़ा सा (कोई अंतर नहीं) सरल हो सके। लेकिन अब मैं प्रदर्शन के बारे में चिंतित नहीं हूं। धन्यवाद –
memcached डेटाबेस इंजन नहीं है: http://code.google.com/p/memcached/wiki/FAQ#How_can_I_use_memcached_as_a_database? –
यदि आप किसी भी तकनीक का उपयोग करते हैं जिसके परिणामस्वरूप अंतराल हो सकता है (जैसा कि यह इस उत्तर से ऑटो-वृद्धि होगी) तो आप अनुक्रम से भागों को पूर्व-प्राप्त करने की अनुमति देकर विवाद को कम कर सकते हैं। सबसे खराब मामला आप अप्रयुक्त खंड खो देते हैं। – djna