आईडी के रूप में डोमेन ऑब्जेक्ट कुछ जटिल / सूक्ष्म समस्याएं पैदा करते हैं:
क्रमबद्धता / Deserialization
यदि आप ऑब्जेक्ट को कुंजियों के रूप में संग्रहीत करते हैं तो यह ऑब्जेक्ट ग्राफ को बहुत जटिल बना देगा। stackoverflowपुनरावृत्ति के कारण JSON या XML के लिए एक भोली सीरियलाइज़ेशन करते समय आपको त्रुटियाँ मिलेंगी । फिर आपको एक कस्टम धारावाहिक लिखना होगा, जो ऑब्जेक्ट को क्रमबद्ध करने और पुनरावृत्ति बनाने के बजाय अपनी आईडी का उपयोग करने के लिए वास्तविक वस्तुओं को परिवर्तित करता है।
टाइप सेफ्टी के लिए ऑब्जेक्ट्स में पास करें, लेकिन केवल आईडी स्टोर करें, तो आपके पास एक एक्सेसर विधि हो सकती है जो आलसी संबंधित इकाई को लोड करती है जब इसे कहा जाता है। दूसरे स्तर की कैशिंग बाद की कॉलों का ध्यान रखेगी।
सूक्ष्म संदर्भ लीक:
यदि आप कंस्ट्रक्टर में डोमेन ऑब्जेक्ट्स का उपयोग करते हैं जैसे आपके पास वहां है तो आप गोलाकार संदर्भ बनाएंगे जो ऑब्जेक्ट को सक्रिय रूप से उपयोग नहीं किए जाने के लिए मेमोरी को पुनः प्राप्त करने की अनुमति देना बहुत मुश्किल होगा।
आदर्श स्थिति:
अपारदर्शी आईडी बनाम इंट / लंबे:
एक idपूरी तरह से अपारदर्शी पहचानकर्ता होना चाहिए जो इसकी पहचान के बारे में कोई जानकारी नहीं रखता है। लेकिन इसे कुछ सत्यापन की पेशकश करनी चाहिए कि यह अपने सिस्टम में एक मान्य पहचानकर्ता है।
कच्चे प्रकार इसे तोड़ते हैं:
int, longऔर StringRDBMS सिस्टम में पहचानकर्ताओं के लिए सबसे अधिक इस्तेमाल होने वाले कच्चे प्रकार हैं। व्यावहारिक कारणों का एक लंबा इतिहास है जो दशकों पहले से हैं और वे सभी समझौता करते हैं जो या तो बचत spaceया बचत में फिट होते हैं timeया दोनों।
अनुक्रमिक आईडी सबसे खराब अपराधी हैं:
जब आप एक अनुक्रमिक आईडी का उपयोग करते हैं तो आप अस्थायी रूप से अर्थ संबंधी जानकारी को डिफ़ॉल्ट रूप से आईडी में पैक कर रहे होते हैं। जो तब तक खराब नहीं होता जब तक इसका उपयोग न किया जाए। जब लोग आईडी के शब्दार्थ गुणवत्ता पर व्यावसायिक तर्क लिखना शुरू करते हैं, जो सॉर्ट या फ़िल्टर करते हैं, तो वे भविष्य के रखरखाव के लिए दर्द की दुनिया की स्थापना कर रहे हैं।
String फ़ील्ड समस्याग्रस्त हैं क्योंकि भोले डिजाइनर सामग्री में जानकारी पैक करेंगे, आमतौर पर अस्थायी शब्दार्थ भी।
ये एक वितरित डेटा प्रणाली बनाने के लिए असंभव है, क्योंकि 12437379123यह विश्व स्तर पर अद्वितीय नहीं है । जब एक सिस्टम में पर्याप्त डेटा प्राप्त होता है, तो वितरित सिस्टम में एक और नोड एक समान संख्या के साथ एक रिकॉर्ड बनाएगा, इसकी बहुत अधिक गारंटी है।
फिर हैक्स इसके चारों ओर काम करना शुरू कर देते हैं और पूरी चीज भाप में गड़बड़ी के ढेर में बदल जाती है।
विशाल वितरित सिस्टम ( क्लस्टर ) को अनदेखा करना यह एक पूर्ण दुःस्वप्न बन जाता है जब आप डेटा को अन्य सिस्टम के साथ भी साझा करना शुरू करते हैं। खासकर तब जब दूसरी प्रणाली आपके नियंत्रण में नहीं है।
आप एक ही समस्या के साथ अंत करते हैं, कि कैसे अपनी आईडी को विश्व स्तर पर अद्वितीय बनाया जाए।
UUID को एक कारण के लिए बनाया और मानकीकृत किया गया था:
UUIDऊपर सूचीबद्ध उन सभी समस्याओं से पीड़ित हो सकते हैं जिनके आधार पर Versionआप उपयोग करते हैं।
Version 1एक अद्वितीय आईडी बनाने के लिए एक मैक पते और समय का उपयोग करता है। यह बुरा है क्योंकि यह स्थान और समय के बारे में अर्थ संबंधी जानकारी देता है। यह अपने आप में एक समस्या नहीं है, यह तब है जब भोले डेवलपर्स व्यापार तर्क के लिए उस जानकारी पर भरोसा करना शुरू करते हैं। यह उन सूचनाओं को भी लीक करता है जिनका किसी भी घुसपैठ के प्रयासों में फायदा उठाया जा सकता है।
Version 2का उपयोग करता है एक उपयोगकर्ता UIDया GIDऔर डोमेन के UIDया GUIसमय के स्थान पर Version 1इस बस के रूप में के रूप में बुरा है Version 1डेटा रिसाव के लिए और इस जानकारी को खतरे में डालकर व्यापार तर्क में इस्तेमाल किया जाएगा।
Version 3ऐसा ही है, लेकिन मैक पते और समय को किसी चीज़ MD5के कुछ सरणी के हैश के साथ बदल देता है byte[]जिसका निश्चित रूप से अर्थ अर्थ है। चिंता करने के लिए कोई डेटा रिसाव byte[]नहीं है, से पुनर्प्राप्त नहीं किया जा सकता है UUID। यह आपको निश्चित UUIDरूप से उदाहरणों के रूप और कुछ प्रकार की बाहरी कुंजी बनाने का एक अच्छा तरीका देता है ।
Version 4 केवल रैंडम नंबरों पर आधारित है जो एक अच्छा समाधान है, यह पूरी तरह से कोई शब्दार्थ जानकारी नहीं रखता है, लेकिन यह नियतात्मक रूप से पुन: सृजन योग्य नहीं है।
Version 5के समान है, Version 4लेकिन sha1इसके बजाय का उपयोग करता है md5।
डोमेन कुंजी और लेन-देन डेटा कुंजी
डोमेन ऑब्जेक्ट आईडी के लिए मेरी प्राथमिकता, किसी तकनीकी कारण का उपयोग करने से प्रतिबंधित Version 5या Version 3उपयोग Version 5करना है।
Version 3 लेनदेन डेटा के लिए बहुत अच्छा है जो कई मशीनों में फैला हो सकता है।
जब तक आप अंतरिक्ष के उपयोग के लिए विवश नहीं होते तब तक UUID का उपयोग करें:
वे एक डेटाबेस से अद्वितीय, डंपिंग डेटा की गारंटी देते हैं और दूसरे में पुनः लोड करने के लिए आपको कभी भी डुप्लिकेट आईडी के बारे में चिंता नहीं करनी चाहिए जो वास्तव में विभिन्न डोमेन डेटा का संदर्भ देते हैं।
Version 3,4,5 पूरी तरह से अपारदर्शी हैं और वे इस तरह से होना चाहिए।
आपके पास एक प्राथमिक के रूप में एक एकल कॉलम UUIDहो सकता है और फिर आपके पास एक प्राकृतिक समग्र प्राथमिक कुंजी क्या है के लिए अद्वितीय अनुक्रमित हो सकते हैं।
स्टोरेज भी नहीं होना है CHAR(36)। आप UUIDकिसी दिए गए डेटाबेस के लिए एक मूल बाइट / बिट / संख्या फ़ील्ड में स्टोर कर सकते हैं जब तक कि यह अभी भी अनुक्रमित है।
विरासत
यदि आपके पास कच्चे प्रकार हैं और उन्हें बदल नहीं सकते हैं, तो आप अभी भी उन्हें अपने कोड में दूर कर सकते हैं।
आप का उपयोग करते हुए एक Version 3/5के रूप UUIDमें Class.getName()+ में पारित कर सकते हैं और एक अपारदर्शी संदर्भ कुंजी है जो मनोरंजक और निर्धारक है।String.valueOf(int)byte[]