2012-08-31 10 views
24

में कस्टम ऑब्जेक्ट आईडी बनाना मैं एक सेवा बना रहा हूं जिसके लिए मैं मोंगोडीबी को भंडारण बैकएंड के रूप में उपयोग करूंगा। सेवा उपयोगकर्ता इनपुट का हैश उत्पन्न करेगी और फिर देखें कि क्या हमारे हैसेट (+ इनपुट) पहले से ही हमारे डेटासेट में मौजूद है या नहीं।MongoDB

हैश हो जाएगा अद्वितीय अभी तक यादृच्छिक (= गैर वृद्धिशील/अनुक्रमिक), तो मेरे सवाल यह है:

  1. यह एक वस्तु आईडी के लिए एक यादृच्छिक मान का उपयोग करने -legitimate- है? उदाहरण:

$object_id = new MongoId(HEX-OF-96BIT-HASH);

या MongoDB, अन्य सर्वर-उत्पादित लोगों से अलग ढंग से व्यवहार करेगा ObjectID के बाद से एक 'असली' ObjectID भी टाइम स्टांप, machine_id, आदि शामिल हैं?

'यादृच्छिक' मान का उपयोग करने के पेशेवर और विपक्ष क्या हैं? मुझे लगता है कि यह इंजन के लिए इन्सर्ट पर इंडेक्स को अपडेट करने के लिए सांख्यिकीय रूप से धीमा होगा जब नया _आईडी किसी भी तरह से वृद्धिशील नहीं होगा - क्या मैं उस पर सही हूं?

उत्तर

28

हाँ ऑब्जेक्ट आईडी के लिए यादृच्छिक मान का उपयोग करना बिल्कुल ठीक है, अगर कुछ मान संग्रहीत किए जाने वाले दस्तावेज़ के _id फ़ील्ड में मौजूद है, तो इसे ऑब्जेक्ट आईडी के रूप में माना जाता है।

चूंकि _id फ़ील्ड हमेशा अनुक्रमित होता है, और प्राथमिक कुंजी, आपको यह सुनिश्चित करने की आवश्यकता होती है कि प्रत्येक ऑब्जेक्ट के लिए अलग ऑब्जेक्ट उत्पन्न होता है। उपयोगकर्ता परिभाषित ऑब्जेक्ट को अनुकूलित करने के लिए कुछ दिशानिर्देश हैं IID:

http://www.mongodb.org/display/DOCS/Optimizing+Object+IDs#OptimizingObjectIDs-Usethecollections%27naturalprimarykey%27intheidfield

+0

अद्वितीय + यादृच्छिक आईडी जाने का तरीका है। – Sim

+0

@ सिम यह है कि आपने वोट क्यों दिया? हो सकता है कि आप हमारे तर्क को हमारे लिए थोड़ा समझा सकें, आप मूल रूप से वही तर्क बोल रहे हैं क्योंकि मैं और यह उत्तरदाता दोनों करता है। अनिवार्य रूप से ऑब्जेक्टआईडी एक अद्वितीय और यादृच्छिक आईडी है। – Sammaye

+0

@Sammaye क्षमा करें, यह एक बुरी तरह से लक्षित क्लिक किया जाना चाहिए था। :/मैं आपके और इस जवाब दोनों को अप-वोट करना चाहता था क्योंकि वे मेरे से अधिक प्रासंगिक हैं। यदि आप अपना उत्तर संपादित करते हैं तो मैं इसे वोट दे सकता हूं। संपादन के बिना सिस्टम मुझे नहीं जाने देगा। – Sim

6

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

आपकी खुद की आईडी का उपयोग करके कोई अंतर्निहित जोखिम/प्रदर्शन खो देता है। मुझे लगता है कि स्ट्रिंग फॉर्म में इसका उपयोग करने से अधिक इंडेक्स/स्टोरेज/क्वेरीिंग पावर का उपयोग हो सकता है लेकिन वहां आप इसे मोंगोइड (ऑब्जेक्टआईडी) फॉर्म में उपयोग कर रहे हैं, जो इसे एक साधारण स्ट्रिंग में संग्रहीत न करने की ताकत को सुरक्षित रखे।

4

मैं सिर्फ बाहर एक जवाब मेरे सवालों से एक के लिए, अनुक्रमण प्रदर्शन के बारे में पाया:

तो _ id का कुछ हद तक एक अच्छी तरह से परिभाषित क्रम में हैं, आवेषण पर _ id सूचकांक के लिए पूरे बी पेड़ नहीं जरूरत लोड किया जाना चाहिए। बीएसओएन ऑब्जेक्ट्स के पास यह संपत्ति है।

स्रोत: http://www.mongodb.org/display/DOCS/Optimizing+Object+IDs

+0

आह हाँ मैंने अभी देखा है कि वास्तव में दो प्रश्न थे सवाल, ओह क्षमा करें :) – Sammaye

+0

मेरी पहली टिप्पणी को दूर कर लिया क्योंकि मैंने अपना दिमाग बदल दिया है, पूरे बी-पेड़ को लोड करना एक बुरी चीज होगी, मैं पहले से ही सीमा आधारित प्रश्नों के लिए स्किप समस्या को दोहराता हूं। – Sammaye

7

हैश सहित किसी भी मूल्यों,, _id क्षेत्र के लिए इस्तेमाल किया जा सकता है, मैं दो कारणों से यादृच्छिक मान का उपयोग कर के खिलाफ की सिफारिश करेंगे:

  1. आप की आवश्यकता हो सकती यदि आप दो अलग-अलग वस्तुओं के लिए समान यादृच्छिक मान उत्पन्न करते हैं तो एक टक्कर-प्रबंधन रणनीति विकसित करें। प्रश्न में, आप इंगित करते हैं कि आप कुछ प्रकार के हैश एल्गोरिदम का उपयोग करके आईडी उत्पन्न करेंगे। मैं इन मानों को "यादृच्छिक" नहीं मानूंगा क्योंकि वे उस सामग्री पर आधारित हैं जो आप हैश के साथ पच रहे हैं। टकराव की संभावना तब सामग्री की विविधता और हैश एल्गोरिदम का एक कार्य है। यदि आप एमडी 5 या एसएचए -1 जैसे कुछ का उपयोग कर रहे हैं, तो मैं एल्गोरिदम के बारे में चिंता नहीं करता, केवल उस सामग्री को जो आप हैंशिंग कर रहे हैं।यदि आपको टक्कर-प्रबंधन रणनीति विकसित करने की आवश्यकता है तो आपको निश्चित रूप से यादृच्छिक या हैश-आधारित आईडी का उपयोग नहीं करना चाहिए क्योंकि क्लस्टर वातावरण में टक्कर प्रबंधन जटिल है और अतिरिक्त प्रश्नों की आवश्यकता है।

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