2010-12-10 9 views
5

में टेक्स्ट आईडी बढ़ाना मुझे अपने आवेदन में टेक्स्ट आईडी होना चाहिए। उदाहरण के लिए, हमारे पास स्वीकार्य वर्णसेट azAZ09 है, और आईडी की सीमा [aaa] - [cZ9] की अनुमति है। पहली जेनरेट की गई आईडी aaa, तब aab, aac, aad e.t.c. होगीMySQL: डीबी

लेन-देन-फ़ैशन में आईडी & वृद्धि कैसे कम हो सकती है? (बशर्ते कि सैकड़ों समवर्ती अनुरोध हैं और सभी के पास सही परिणाम होना चाहिए)

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

इसके अलावा, कृपया ध्यान दें कि श्रेणी में आईडी की संख्या 2^32 से अधिक हो सकती है।

एक और विचार में 64-बिट पूर्णांक की सीमाएं हैं, और पूर्णांक कनवर्ट करना-> सॉफ़्टवेयर कोड में char आईडी, जहां इसे असीम रूप से किया जा सकता है।

कोई विचार?

+0

क्या आप केवल पूर्णांक प्रकार का उपयोग नहीं कर सकते हैं और आवश्यकता होने पर इसे परिवर्तित कर सकते हैं? – PeeHaa

+0

हाँ मैं कर सकता हूँ। यह अभी तक कार्य को हल नहीं करता है - मुझे अभी भी अनुमति श्रेणी की आवश्यकता है - जिसका मतलब है कि सामान्य ऑटोइनक्रिकमेंट नौकरी नहीं करेगा। – BarsMonster

उत्तर

1

मैं एक अलग सवाल पूछने था एक ही समस्या हल करने के लिए आसान बनाने के लिए: मैं मीटर की सुविधाओं कैसे उपयोग कर सकते हैं मेरी आवश्यकता को लागू करने के लिए वाई डेटाबेस।

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

मेरा मतलब यह है कि: डेटाबेस को संख्यात्मक कुंजी को सामान्य रूप से 0 से शुरू करने दें, फिर उन नंबरों और अपनी टेक्स्ट कुंजियों के बीच कनवर्ट करने के लिए दो फ़ंक्शन लिखें। आपके पास यहां कुछ लचीलापन है: आप इस फ़ंक्शन को डेटाबेस में (दूसरे कॉलम, ट्रिगर, या कुछ ठंडा डेटाबेस सुविधा का उपयोग करके) या जावा की तरह अपने सर्वर परत पर कार्यान्वित कर सकते हैं। यह जटिल नहीं होगा। अंत में, यह किसी भी तरह से सभी बिट्स है ... आप टेक्स्ट कुंजी बिट्स को टुकड़ा करने के लिए एक अलग तरीका है।

शुभकामनाएं!

+0

शानदार प्रारंभिक विचार, और केवल 1 टेबल की आवश्यकता है, अब मुझे सही समाधान दिखाई देता है :-) – BarsMonster

2

एक समाधान long (bigint) संख्या के आधार पर, वर्ण-टू-संख्या और संख्या-टू-वर्ण रूपांतरण सॉफ्टवेयर में किया, होने के साथ - कहते हैं - 32 विभिन्न श्रेणियों

  • 32 टेबल के निर्माण श्रेणी 0 .. लोड करने के लिए रेंज 31 .. 32 रेंज फ़ील्ड वाली एक अनूठी तालिका प्रत्येक पंक्ति को प्रत्येक बार लॉक होने पर अपनी पंक्ति लॉक कर दी जाएगी)

  • 0 बिट्सको 64 बिट्स पर बहुत अधिक मूल्य पर सेट करके श्रेणियों को शुरू करना - शायद 63 यदि आप अपने आवेदन में साइन समस्या से बचना चाहते हैं। आदर्श रूप से 5 बिट्स पर रेंज वैल्यू, 0 से 31 तक। 1 बिट साइन + 5 बिट्स रेंज = 6 बिट्स। आप काउंटर 1 से (2^58-1) या 10^17 से होंगे ... जो पर्याप्त होना चाहिए।

  • सॉफ्टवेयर में सीमा संख्या बेतरतीब ढंग से चुना जाता है, और क्वेरी तालिका नाम तदनुसार बनाया range मैं है जहां मैं 31.

0 से चला जाता है बनाने के टेबल आदेशों कुछ होगा की तरह, का कहना है कि जावा

में
String table; 
    String query; 
    long increment; 

    for (long i=0 ; i<32 ; i++) { 
    table = "range"+i; 
    increment = (i<<58) + 1; 
    query = "CREATE TABLE "+table+" (v bigint auto_increment primary key) auto_increment="+increment; 

    do_query(query); 
    } 
+0

हम्म ... दिलचस्प है, लेकिन मैं उन श्रेणियों को कैसे संभालेगा जो 100 नंबर कहें? – BarsMonster

+0

@ बार्समोन्स्टर 32 के बजाय, यह 128, 2^7 (0..127) होगा, '(i << 58) '' (i << 56) '(अभी भी लगभग 10^16 संभव मान) होगा। –

+0

बेशक आप केवल एक टेबल का उपयोग कर सकते हैं ... ('i <1'' i <1' :-) के साथ 'i <32' को प्रतिस्थापित करें - 2^x auto_increment की जटिलता के पीछे विचार एक ही ऑटो पर एक साथ पहुंच को कम करना था बढ़ी हुई तालिका, और इस प्रकार * ताले * आवृत्ति। इस तरह आपके पास अनन्य होने के बावजूद कुंजियां थीं। –

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