7

मेरे प्रश्न के पहले भाग के बारे में: मैं हाल ही में खुद से पूछ रहा था कि संबंधपरक डेटाबेस में कुछ तालिकाओं के लिए एक अद्वितीय पहचानकर्ता होने के लाभ और व्यापार-बंद क्या हैं। एक उदाहरण के रूप में, फेसबुक (एफबी) ग्राफ एपीआई एक ही यूआरएल का उपयोग करते हुए विभिन्न प्रकार की ऑब्जेक्ट्स जैसे "यूजर", "इवेंट्स", "पन्ने" इत्यादि लाने की इजाजत देता है, उदाहरण के लिए https://domain/251906384206 "इवेंट" प्रकार का ऑब्जेक्ट देता है जबकि https://domain/195466193802264 "समूह" प्रकार का ऑब्जेक्ट देता है।संबंधपरक डेटाबेस में विश्व स्तर पर अद्वितीय पहचानकर्ता को लागू करने के तरीकों/विपक्ष के तरीके और विपक्ष?

कम "जेनेरिक" एपीआई प्रदान करने की तुलना में इस दृष्टिकोण का लाभ क्या है, जिसका उपयोग इस तरह किया जाएगा: https://domain/event/251906384206 या https://domain/group/195466193802264। इस मामले में, एक समान पहचानकर्ता का उपयोग विभिन्न ऑब्जेक्ट प्रकारों के लिए किया जा सकता है क्योंकि प्रत्येक ऑब्जेक्ट प्रकार में इसका पहचानकर्ता गुंजाइश है।

प्रश्न के दूसरे भाग के बारे में: एक वैश्विक रूप से अद्वितीय पहचानकर्ता लागू करने के लिए विकल्प क्या हैं?

दो विकल्प है कि मेरे दिमाग में आ रहे हैं:

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

  2. 3 कॉलम युक्त तालिका प्रदान करना,

    • अद्वितीय पहचानकर्ता,
    • ऑब्जेक्ट प्रकार specifc primar कुंजी है, और
    • तालिका नाम हैं।

    अतिरिक्त ऑब्जेक्ट प्रकार प्रति ऑब्जेक्ट प्रकार जिसमें अद्वितीय कुंजी पहचानकर्ता को विदेशी कुंजी के रूप में संदर्भित किया गया है। प्रत्येक ऑब्जेक्ट प्रकार विशिष्ट तालिका में इसका अपना प्राथमिक कुंजी दायरा होता है।

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

वहाँ एक विश्व स्तर पर अद्वितीय पहचानकर्ता के पेशेवरों/विपक्ष के बारे में कोई अनुभव हैं और यह लागू करने के लिए सर्वोत्तम प्रथाओं क्या हैं?

उत्तर

0

वैश्विक पहचानकर्ता को लागू करने के आपके प्रस्तावित तरीकों में से दोनों में बड़ी तालिकाओं में शामिल होना शामिल है और आपके डेटाबेस में रिकॉर्ड्स की संख्या की प्रभावी दोगुना शामिल है (प्रत्येक वस्तुएं स्वयं ही मौजूद हैं लेकिन उनके माता-पिता/इसके वैश्विक आईडी के साथ रिकॉर्ड भी हैं)।

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

यदि आप स्पीफ टेबल के लिए आईडी निर्दिष्ट करते समय त्रुटियों से डरते हैं, तो आप एक चेक बाधा जोड़ सकते हैं जो आईडी को लागू करेगा (उदा। आईडी < 4000 और आईडी> 10000)। यदि आप अपने पहचानकर्ता में ऑब्जेक्ट के प्रकार के लिए बर्बाद बिट्स/बाइट्स के लिए चिंतित हैं, तो आप केवल अपने डेटाबेस एक्सेस एपीआई में वैश्विक आईडी का पर्दाफाश कर सकते हैं, जो ऑब्जेक्ट्स आईडी (वास्तव में एक तालिका में संग्रहीत) को उनके टाइप आईडी के साथ जोड़ देगा (ऑब्जेक्ट प्रकार से व्युत्पन्न)।

0

"एक समस्या अच्छी तरह से कहा गया है, एक समस्या पहले से ही आधा हल है।"

मुझे लगता है कि आप कई अवधारणाओं मिश्रण कर रहे हैं। आप अन्य डेटाबेस ऐप्स की जांच करते हैं, लेकिन ऐसा लगता है कि आपको अधिक जानकारी के बजाय अधिक भ्रमित हो गया है।

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

साथ ही, आप एक ग्लोबल विशिष्ट पहचान संख्या (G.U.I.D.) का उपयोग करने के व्यवसाय/प्रोग्रामिंग वस्तु और एक तालिका में एक पंक्ति के रूप में एक वस्तु दोनों की पहचान करना चाहते हैं।

साथ ही, आपको भी एक G.U.I.D. उपयोग करना चाहते हैं किसी वर्ग या किसी प्रकार की वस्तु की पहचान करने के लिए।

मान लें कि आप एक ऐप बना रहे हैं। जहां आपके पास कई वस्तुएं हैं। "उपयोगकर्ता", "घटनाक्रम", "पृष्ठ" और अन्य जैसे ऑब्जेक्ट्स के कई वर्ग हैं। आपके पास एक ही कक्षा/प्रकार की कई वस्तुएं हो सकती हैं, लेकिन आपको किसी दूसरे से पहचानने के लिए एक तरीका चाहिए। मिशिगन से "जॉन डो" की पहचान करने के लिए, "जॉन डो" क्वींसलैंड के रूप में। आइए कहें कि आपकी वस्तुएं जी.यू.आई.डी. के प्रकार की संपत्ति का उपयोग करने जा रही हैं।

तो आइए मान लें कि आप प्रत्येक वर्ग ("उपयोगकर्ता" के लिए "उपयोगकर्ता", टेबल मानक आईडी के लिए एक टेबल बनाते हैं। एकवचन और लोअरकेस है, altought आप इसे अनदेखा कर सकते हैं, "घटनाओं" के लिए "घटना", और इसी तरह) । प्रत्येक तालिका में कई फ़ील्ड होते हैं जो प्रत्येक ऑब्जेक्ट के गुणों का प्रतिनिधित्व करते हैं। तो "उपयोगकर्ता" में "user_key GUID" जैसे फ़ील्ड होंगे, और शायद "user_name varchar (100)", और "user_birthdate डेटाटाइम" होगा। अन्य टेबल के लिए भी यही है।

मैं थे, लेकिन "supertable" है केवल एक बहुत ही विशेष आम नहीं क्षुधा के लिए। मुझे नहीं लगता कि आपको एक टेबल की आवश्यकता है जो "उपयोगकर्ता", "ईवेंट", "पेज" को मिश्रित करे। मेरे पास एक ऐसा मामला था जहां हमारे पास एक विशिष्ट "फ़ील्ड", प्लस "कंपनी" और "व्यक्ति" उप-विशिष्ट विशिष्ट फ़ील्ड थे। कभी-कभी, हमें सभी ग्राहकों के लिए बिक्री की जांच करना पड़ता था, और "ग्राहकों" तालिका में शामिल होना था। कभी-कभी, हमें उत्पादों के लिए कॉर्पोरेट छूट प्रदान करना पड़ता था, और "कंपनी" सबटेबल ब्राउज़ करना था।

यदि आप यह सामान्यीकरण/"एक है" सुपरटेबल चाहते हैं, तो आपको सुपरटेबल प्राथमिक कुंजी और विस्तार तालिका प्राथमिक कुंजी के लिए एक अलग फ़ील्ड रखने की आवश्यकता नहीं है, उसी प्रकार का हो सकता है।

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

जी.यू.आई.डी. एक पूर्णांक कुंजी की तुलना में अधिक मेमोरी और डिस्क स्पेस का उपयोग करता है, लेकिन, एक कुंजी प्राप्त करने के लिए यह बहुत तेज़ और आसान है जिसे डुप्लिकेट करना बहुत मुश्किल है।

फिर से, आप सवाल, कैसे एक डेटाबेस में वस्तुओं का प्रतिनिधित्व करने के लिए और अधिक है G.U.I.D. के उपयोग से

+0

"फिर से, आप सवाल है कि कैसे एक डेटाबेस में वस्तुओं का प्रतिनिधित्व करने के लिए और अधिक, है G.U.I.D. के उपयोग की तुलना में" गलत, मेरे प्रश्न का पहला भाग एक उपयोग बिंदु दृश्य से एक वैश्विक रूप से अद्वितीय पहचानकर्ता का उपयोग करने के पेशेवरों और विपक्ष को संदर्भित करता है (उदाहरण के लिए उपयोग करने में आसान एपीआई डिज़ाइन करने में सक्षम होना)। एक वैश्विक रूप से अद्वितीय इंडेंटिफायर को मानना ​​आवश्यक है, मेरे प्रश्न का दूसरा भाग वैश्विक स्तर पर अद्वितीय पहचानकर्ता को कार्यान्वित करने के सवाल को संदर्भित करता है।स्पष्ट रूप से कई विकल्प हैं। प्रश्न के बाद के हिस्से की एक चर्चा को डेटबेस डिजाइन जारी करने पर विचार करना है। – Scholle

+0

जीयूआईआईडी (एस) उपयोगी हैं, जब बड़ी मात्रा में रिकॉर्ड्स का उपयोग किया जा रहा है या/और कई क्लस्टर या सर्वरों में एक ही डेटाबेस का उपयोग किया जा रहा है, क्योंकि कोई डुप्लीकेट कुंजी नहीं है। – umlcat

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