2012-03-11 12 views
7

मैं वर्तमान में एक पंजीकरण प्रणाली प्रोटोटाइप विकसित कर रहा हूं। यह बहुत सरल है और अनिवार्य रूप से सिर्फ एक .NET रूप है जो मोंगोडीबी में लिखा जाता है।डेटाबेस प्रविष्टियों के लिए कुशल अद्वितीय कुंजी पीढ़ी

जो मैं अटक गया हूं वह प्रत्येक उपयोगकर्ता के लिए एक अद्वितीय आईडी/कुंजी उत्पन्न करने का एक प्रभावी तरीका है। ये आईडी मानव अनुकूल होना चाहिए, इसलिए 7 वर्ण लंबी अल्फान्यूमेरिक स्ट्रिंग जैसे कुछ उदा। A1B2C3X।

समाधान जो मैंने अभी तक देखा है, केवल एक यादृच्छिक स्ट्रिंग उत्पन्न करने के लिए एक साधारण फ़ंक्शन का उपयोग करें और फिर यह देखने के लिए डेटाबेस को जांचें कि यह अद्वितीय है (और यदि आप अद्वितीय नहीं पाते हैं तो दोहराएं)। यह निश्चित रूप से अधिक से अधिक कम्प्यूटेशनल रूप से महंगा हो जाएगा क्योंकि डेटाबेस प्रविष्टियों की संख्या बढ़ती है।

मेरा विचार अद्वितीय आईडी सेट को प्रीकंप्यूट करना है और किसी अन्य डेटाबेस में स्टोर करना है। फिर जब मुझे उपयोगकर्ता डेटाबेस में एक नई प्रविष्टि जोड़ने की आवश्यकता होती है तो मैं अपने आईडी डेटाबेस (निरंतर समय में) से एक आईडी "पॉप" कर सकता हूं और जानता हूं कि यह खोज करने की आवश्यकता के बिना उपयोगकर्ता डेटाबेस में पहले से मौजूद नहीं है।

मुझे यकीन है कि किसी ने पहले ऐसा कुछ किया होगा। क्या कोई बेहतर तरीका है? मुझे नहीं पता कि मैं इसके साथ इतना संघर्ष क्यों कर रहा हूं। आपका इनपुट बहुत सराहना की है।

+2

क्या ऑब्जेक्ट आईडी है, जो मोंगोडीबी चालक द्वारा प्रदान किया गया है, जो आपके उपयोग के मामले में भी असभ्य है? –

+0

मैं सुझाव देने जा रहा था कि @EkinKoc ने क्या सुझाव दिया (और यदि आप 40 अक्षरों के साथ ठीक हैं, तो यह तरीका है)। लेकिन यदि आपको बिल्कुल 7 वर्णों की आवश्यकता है, तो आपके द्वारा रूपरेखा की जाने वाली विधि * कम महंगी *, सरल, और पॉप मानों के लिए अलग डीबी कीस्टोर होने की तुलना में कम त्रुटि प्रवण होनी चाहिए। यादृच्छिक 7-वर्ण अल्फान्यूमेरिक स्ट्रिंग पर टकराव का मौका व्यावहारिक रूप से शून्य है। यह एक दुर्लभ एज केस है जिसे आपको अनुकूलित नहीं करना चाहिए। (और उपयोगकर्ता सृजन वैसे भी दुर्लभ है, डीबी विशिष्टता जांच अपेक्षाकृत दुर्लभ प्रक्रिया के लिए पर्याप्त तेज़ है)। –

+0

@ बेनेली: टकराव की संभावना स्केल के साथ बदलती है :) –

उत्तर

11

एप्लिकेशन में एक यादृच्छिक स्ट्रिंग जेनरेट करना और जांचना कि यह अद्वितीय है, तो यह खराब समाधान नहीं है। इसके बारे में चिंता न करें अक्षम होने के कारण, यह नहीं है - और निश्चित रूप से विकल्पों की तुलना में नहीं। यह db.user.count() चलाने या सटीक आईडी के साथ एक अलग तालिका रखने से निश्चित रूप से तेज़ होगा। आपको बस इसे सही करने की ज़रूरत है।

सबसे पहले, नए उपयोगकर्ता कितनी बार बनाए जाएंगे? शायद अन्य चीजों की तुलना में अक्सर नहीं, इसलिए वास्तव में पूरी दक्षता चर्चा मंथन है। दूसरा, 7 वर्ण ए-जेड, 0-9 के साथ यह 36^7 या कहीं 78 अरब के आसपास है। कम से कम कहने के लिए, टकराव देखने से पहले कुछ समय लगेगा।

आप सिर्फ इस तरह यह करना है, यह जब तक कि वहाँ एक टक्कर (जो बहुत संभावना नहीं है) है किसी भी प्रदर्शन दंड नहीं देना होगा: का उपयोग कर

  • एक अद्वितीय उपयोगकर्ता आईडी
  • अपने उपयोगकर्ता वस्तु डालें उत्पन्न करें, उपयोगकर्ता आईडी _id
  • डुप्लिकेट कुंजी त्रुटियों के लिए जांचें (यह कैसे करें भाषा और ड्राइवर पर निर्भर करता है, लेकिन getLastError कमांड चलाने में शामिल हो सकता है) के मान के रूप में।
  • एक नकली चाबी त्रुटि पर एक नया यूजर आईडी

इस तरह उत्पन्न करके फिर से प्रारंभ वहाँ केवल एक टक्कर की स्थिति में अतिरिक्त काम हो जाएगा (और मैं सच में, सच कैसे अविश्वसनीय रूप से संभव नहीं दिखता तनाव करना चाहते हैं कि होगा हो)।

एक अद्वितीय उपयोगकर्ता आईडी उत्पन्न करने का एक और तरीका है: वर्तमान यूनिक्स टाइमस्टैंप (दूसरे तक नीचे) ले जाएं, होस्टनाम का हैश और फिर प्रक्रिया आईडी, और अंत में काउंटर का वर्तमान मान संलग्न करें। वास्तव में यह कैसे है कि मोंगो का ObjectId जेनरेट किया गया है, और यह गारंटी देता है कि आप प्रति सेकंड, प्रति प्रक्रिया के रूप में कई प्रति वस्तुएं उत्पन्न कर सकते हैं, क्योंकि आपके काउंटर का अधिकतम मूल्य (जो मोंगो में 3 बाइट्स है, इसलिए 16 मिलियन)। ऑब्जेक्टआईडी पर दस्तावेज़ देखें यदि आप विवरण में रूचि रखते हैं: http://www.mongodb.org/display/DOCS/Object+IDs

यह संपत्ति है कि आपकी उपयोगकर्ता आईडी स्वाभाविक रूप से सृजन के क्रम में क्रमबद्ध होंगी, लेकिन यह 12 बाइट लंबा है, इसलिए आपके 7 वर्णों से थोड़ा लंबा, दुर्भाग्य से।आप एक ही विधि का उपयोग कर सकते हैं और होस्टनाम/पिड को छोड़ सकते हैं, और काउंटर को छोटा कर सकते हैं (जो आपको पसंद होने पर यादृच्छिक संख्या भी हो सकता है), तो आप 6 बाइट्स तक नीचे आ जाएंगे, जो शायद 9 में निचोड़ा जा सकता है अक्षर एजेड, 0-9।

+0

आपके विस्तृत उत्तर के लिए धन्यवाद। आपका समाधान सबसे सरल लगता है। यह अब _id का उपयोग करके सम्मिलित करने के लिए समझ में आता है और फिर एक कोलिजन मैन्युअल रूप से (एप्लिकेशन में) की जांच करने के बजाय डुप्ली कुंजी त्रुटि की जांच करें और फिर सम्मिलित करें। मुझे लगता है कि यह सूक्ष्म अंतर मुझे समाधान की दक्षता के बारे में चिंताओं को दे रहा था, जैसा कि आप सही तरीके से इंगित करते हैं, जब तक आप इसे सही तरीके से सही नहीं करते हैं। एक बार फिर धन्यवाद। –

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