यदि आपके पास कई प्रक्रियाओं के साथ कई वेब सर्वर हैं, तो वास्तव में ऐसा कुछ नहीं है जिसे आप विशिष्टता खोने के साथ हटा सकते हैं।
यदि आप ObjectId
. की प्रकृति को देखें तो :
- एक 4-बाइट मान जो यूनिक्स युग के बाद के सेकंड को दर्शाता है,
- एक 3-बाइट मशीन पहचानकर्ता,
- एक 2-बाइट प्रोसेस आईडी, और
- एक यादृच्छिक मान से शुरू होने वाला 3-बाइट काउंटर।
आप देखेंगे कि वहां बहुत कुछ नहीं है जिसे आप सुरक्षित रूप से हटा सकते हैं। चूंकि पहले 4 बाइट समय हैं, इसलिए एक एल्गोरिथ्म को लागू करना चुनौतीपूर्ण होगा जो टाइम स्टैम्प के कुछ हिस्सों को साफ और सुरक्षित तरीके से हटा देता है।
मशीन आइडेंटिफ़ायर और प्रोसेस आइडेंटिफ़ायर का उपयोग उन मामलों में किया जाता है जहाँ डेटाबेस सर्वर पर क्लाइंट के रूप में कार्य करने वाले कई सर्वर और / या प्रक्रियाएँ होती हैं। यदि आपने इनमें से किसी एक को छोड़ दिया है, तो आप फिर से डुप्लिकेट के साथ समाप्त हो सकते हैं। अंतिम 3 बाइट्स के रूप में यादृच्छिक मान का उपयोग यह सुनिश्चित करने के लिए किया जाता है कि एक ही मशीन पर, एक ही प्रक्रिया के भीतर दो पहचानकर्ता अद्वितीय हैं, भले ही बार-बार अनुरोध किया जाए।
यदि आप इसे एक आदेश के रूप में उपयोग कर रहे थे id
, और आप सुनिश्चित विशिष्टता चाहते हैं, मैं 12 बाइट संख्या से कुछ भी दूर नहीं करूंगा क्योंकि इसे कई जुड़े डेटाबेस क्लाइंट होने पर अद्वितीय संख्या उत्पन्न करने के लिए एक मजबूत और कुशल वितरित तंत्र प्रदान करने के लिए सावधानीपूर्वक डिज़ाइन किया गया था।
यदि आपने ObjectId ... के अंतिम 5 अक्षर लिए हैं, और एक निश्चित अवधि में, संघर्ष की संभावना क्या है?
- प्रक्रिया आईडी
- काउंटर
संघर्ष की संभावना उच्च है . प्रक्रिया आईडी पूरी अवधि के दौरान समान रह सकती है, और दूसरी संख्या केवल एक वृद्धिशील संख्या है जो 4095 आदेशों के बाद दोहराई जाएगी। लेकिन, यदि प्रक्रिया पुन:चक्रित होती है, तो आपके पास यह भी मौका है कि पुराने ऑर्डर आदि के साथ विरोध होगा। और यदि आप एकाधिक डेटाबेस क्लाइंट से बात कर रहे हैं, तो संभावनाएं भी बढ़ जाती हैं। मैं सिर्फ संख्या को ट्रिम करने की कोशिश नहीं करता। ऑर्डर देने की कोशिश करने वाले नाखुश ग्राहकों के लायक नहीं है।
यहां तक कि टाइमस्टैम्प और यादृच्छिक बीज मान भी पर्याप्त नहीं होते हैं जब कई डेटाबेस क्लाइंट ObjectIds
उत्पन्न कर रहे हों . जैसा कि आप विभिन्न टुकड़ों को देखना शुरू करते हैं, विशेष रूप से डेटाबेस क्लाइंट के एक फार्म के संदर्भ में, आपको यह देखना चाहिए कि टुकड़े क्यों हैं, और उन्हें हटाने से ObjectId
में मंदी हो सकती है। पीढ़ी।
मेरा सुझाव है कि आप एक अद्वितीय संख्या बनाने और उसे डेटाबेस में संग्रहीत करने के लिए एक एल्गोरिथ्म लागू करें। करना काफी आसान है। यह प्रदर्शन को थोड़ा प्रभावित करता है, लेकिन यह सुरक्षित है।
मैंने यह
लिखा है ObjectId
. का उपयोग करने की चुनौतियों के बारे में कुछ समय पहले उत्तर दें एक यूआरएल में। इसमें MongoDB का उपयोग करके एक अद्वितीय ऑटो इंक्रीमेंटिंग नंबर बनाने का लिंक शामिल है।