2013-07-30 6 views
37

यह देखते हुए कि टाइमयूयूआईडी आपको सीपीयू में now() का उपयोग करने की अनुमति देता है, क्या ऐसे कोई कारण हैं जो आप आगे नहीं बढ़ेंगे और हमेशा पुराने पुराने यूयूआईडी के बजाय टाइमयूयूआईडी का उपयोग करेंगे?कैसंड्रा यूयूआईडी बनाम टाइमयूयूआईडी लाभ और नुकसान

उत्तर

51

UUID और TIMEUUID कैसंद्रा में उसी तरह संग्रहीत किए जाते हैं, और वे केवल दो अलग-अलग सॉर्टिंग कार्यान्वयन का प्रतिनिधित्व करते हैं।

TIMEUUID कॉलम पहले उनके कच्चे बाइट्स से, अंत में अपने कच्चे बाइट्स द्वारा अपने समय घटकों द्वारा हल कर रहे हैं, और फिर, जबकि UUID कॉलम पहले अपने संस्करण द्वारा हल कर रहे हैं, तो अगर दोनों अपने समय घटक द्वारा संस्करण 1 हैं, और। क्यूरोसली समय घटक सॉर्टिंग कार्यान्वयन को विभिन्न स्वरूपण को छोड़कर, कैसंड्रा कोड में UUIDType और TimeUUIDType के बीच डुप्लिकेट किया गया है।

मुझे लगता है कि UUID बनाम।TIMEUUID मुख्य रूप से प्रलेखन के रूप में प्रश्न: यदि आप TIMEUUID चुनते हैं तो आप कह रहे हैं कि आप कालक्रम क्रम में चीजें संग्रहीत कर रहे हैं, और ये चीजें एक ही समय में हो सकती हैं, इसलिए एक साधारण टाइमस्टैम्प पर्याप्त नहीं है। UUID का उपयोग करना कहता है कि आपको ऑर्डर की परवाह नहीं है (भले ही अभ्यास में कॉलम समय पर ऑर्डर किए जाएंगे यदि आप उनमें संस्करण 1 यूयूआईडी डालते हैं), तो आप बस यह सुनिश्चित करना चाहते हैं कि चीजों में अद्वितीय आईडी हों।

NOW() का उपयोग UUID मानों को उत्पन्न करने के लिए भी सुविधाजनक है, यह आपके कोड को पढ़ने वाले अन्य लोगों के लिए भी आश्चर्यजनक है।

शायद यह चीजों की भव्य योजना में कोई फर्क नहीं पड़ता है, लेकिन गैर-संस्करण 1 यूयूआईडी को सॉर्ट करना संस्करण 1 की तुलना में थोड़ा तेज़ है, इसलिए यदि आपके पास UUID कॉलम है और यूयूआईडी स्वयं उत्पन्न करें, तो दूसरे संस्करण के लिए जाएं।

+1

गैर-संस्करण 1 यूयूआईडी को सॉर्ट करना कैसे तेज़ होगा? उदाहरण के लिए, संस्करण 4 यूयूआईडी पूरी तरह यादृच्छिक हैं जो मुझे उम्मीद है कि सबसे खराब सॉर्टिंग प्रदर्शन प्रदान करेगा। मैं सहमत हूं कि मुद्दा असमान होना चाहिए। यदि आप यूयूआईडी का उपयोग कर रहे हैं, तो आप कई अच्छे कारणों से ऐसा करते हैं लेकिन प्रदर्शन उनमें से नहीं है। सौभाग्य से, आज के कंप्यूटर अंतरिक्ष और यूयूआईडी द्वारा किए गए मांगों को हल कर सकते हैं। –

+3

यूयूआईडी की सामग्री सॉर्टिंग एल्गोरिदम के प्रदर्शन के लिए प्रासंगिक नहीं है। गैर संस्करण 1 तेजी से _in Cassandra_ प्रकार है क्योंकि टाइमस्टैम्प में बाइट्स का कोई अनपॅकिंग नहीं होता है। यह एक बहुत ही छोटा अंतर है, मैंने सोचा कि यह दिलचस्प था। – Theo

+0

अब() फ़ंक्शन टाइम्यूइड उत्पन्न करने का एकमात्र तरीका है? क्या कस्टम लोगों को उत्पन्न करना संभव है? यह केवल परीक्षण के लिए है कि मुझे कस्टम लोगों की आवश्यकता है। – Pinocchio

19

एक TimeUUID एक सादे पुराने UUIDdocumentation के अनुसार है।

UUID बस 128-bit value है। इसे एक अकल्पनीय रूप से बड़ी संख्या के रूप में सोचें।

विशेष बिट्स कई तरीकों से निर्धारित किए जा सकते हैं। original method में कंप्यूटर के नेटवर्किंग हार्डवेयर के MAC address को शामिल करने, वर्तमान दिनांक और समय के साथ-साथ एक मनमाना संख्या और यादृच्छिक संख्या शामिल है। वास्तव में अद्वितीय संख्या प्राप्त करने के लिए सभी को एक साथ squish।

बाद में, विभिन्न कारणों (सुरक्षा, गोपनीयता) के लिए, यूयूआईडी मूल्य उत्पन्न करते समय बिट्स को इकट्ठा करने के लिए अन्य तरीकों का आविष्कार किया गया। ये अन्य विधियां डेट-टाइम और/या मैक पते को एक घटक के रूप में छोड़ दें। बिंदु यह है कि: सभी यूयूआईडी मानों में एक एम्बेडेड डेट-टाइम मान नहीं है।

कैसंड्रा दस्तावेज़ गलत रूप से इसके टाइमयूयूआईडी को "टाइप 1 यूयूआईडी" के रूप में संदर्भित करता है। सही शब्द संस्करण 1 UUID है। इस संस्करण को कभी-कभी "समय-आधारित संस्करण" कहा जाता है।


सलाह

कैसेंड्रा का एक बिट 128 बिट तक की तिथि और समय भाग निकालने के प्रयोजन के लिए UUID के इस विशेष संस्करण की पहचान करने लगता है। यूयूआईडी से दिनांक-समय निकालना एक बुरा विचार है।

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

यदि आपको दिनांक-समय इतिहास ट्रैक करने की आवश्यकता है, तो स्पष्ट रूप से ऐसा करें। अपने डेटा में डेट-टाइम फ़ील्ड बनाएं। वैसे, UTC में उस दिनांक-समय को ट्रैक करें, लेकिन यह एक और विषय है।

+2

रिकॉर्ड के लिए, कैसंद्रा डॉक्टर ने स्पष्ट रूप से सभी नोड्स में सिस्टम समय सिंक्रनाइज़ करने के लिए एनटीपी का उपयोग करने की सलाह दी। http://www.datastax.com/documentation/cassandra/1.2/webhelp/cassandra/install/installRecommendSettings.html – omnibear

+10

यूटीसी का उपयोग करने पर सहमति हुई। लेकिन अपनी अन्य चिंताओं को दूर करने के लिए: 1) टाइमस्टैम्प घड़ी की बहाव से भी पीड़ित हैं, इसलिए वे समय श्रृंखला डेटा के लिए इस संबंध में टाइमयूयूआईडी से बेहतर नहीं हैं। 2) एक टाइमयूयूआईडी डेटाटाइप का उपयोग कर सीक्यूएल 3 और एक कैसंड्रा स्कीमा के संदर्भ में, यह उम्मीद करना उचित है कि उन कॉलम में सभी यूयूआईडी समय-एन्कोडेड हैं, टाइप 1 यूयूआईडी। 3) सीक्यूएल 3 में आप या तो टाइमयूयूड्स डालने के लिए अब() या विशिष्ट डेटाटाइम का उपयोग कर सकते हैं। तो पुराना डेटा प्रोसेसिंग अभी भी कैसंड्रा टेबल में ऐतिहासिक रूप से सही टाइमयूयूड्स का परिणाम हो सकता है। – platforms

+0

@platforms एक ही मूल्य में दो अलग-अलग उद्देश्यों को स्वीकार करना प्रिंसिपल, खराब अभ्यास में एक बुरा विचार है। इस मामले में, 1. दिनांक-समय इतिहास ट्रैकिंग और 2. प्राथमिक कुंजी पहचानकर्ता। जब दिन आता है कि आप अन्य सिस्टम/स्रोत/सिंक के साथ डेटा निर्यात या आयात करना चाहते हैं, तो आपको खेद होगा। भ्रम के आगे के प्रमाण के रूप में अनिवार्य रूप से बनाया गया है, जबकि ** बदले में कुछ भी नहीं प्राप्त **, इस पृष्ठ के प्रश्न को दोबारा पढ़ें! –

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