ID ID सार्वजनिक होना चाहिए या REST API पर नहीं होना चाहिए?


14

यह आदमी क्या कहता है उसके आधार पर: http://toddfredrich.com/ids-in-rest-api.html

मान लें कि वह यूआईआईडी का उपयोग करने के बारे में सही है ताकि आपी संसाधनों की पहचान कर सकें। फिर मैं इसे इस तरह से लागू करने की कोशिश में परेशानियों में भागता हूं, यह है:

class FooEntity {

    final String id = null;  //auto-generated by my backend (mongodb), not shared
    final UUID uid = UUID.randomUUID();  //the resource id
}

(क्लाइंट और सर्वर के बीच, डीटीओ भेजे और प्राप्त किए जाते हैं, डेटा बेस इकाइयाँ नहीं।)

अब समस्या यह है कि idउपयोगी नहीं है क्योंकि मैं अब इसका उपयोग नहीं कर रहा हूं। ग्राहक अनुरोध करता uidहै कि मैं 2 आईडी को संभालने के लिए परेशान क्यों हूं? फिर हम शुरुआत के उसी मुद्दे पर वापस आते हैं। अगर मैंने UUID को प्राथमिक कुंजी ( _id) के रूप में सेट किया है, तो मैं बैकएंड आईडी को जनता के सामने प्रकट कर रहा हूं।

इसके अलावा, दक्षता विषय है। मैंने पढ़ा है कि ObjectId द्वारा अनुक्रमण यूयूआईडी की तुलना में बहुत अधिक कुशल है।

जवाबों:


7

मैं बैकेंड आईडी जनता के सामने उजागर कर रहा हूं

अनुरोध के माध्यम से वापस लौटने पर आपके पास अपनी संस्थाओं की पहचान करने के लिए और क्या साधन हैं? यह SSN या समान पहचानकर्ताओं की तुलना में पूरी तरह से वैध और सुरक्षित है। यह टोड के बारे में बात कर रहा है - पहचान तकनीक और इकाई को तटस्थ बनाना और वह सही है।

दक्षता विषय

आप दोनों पहचानकर्ता रख सकते हैं यदि ObjectId वास्तव में बहुत अधिक कुशल है। सैद्धांतिक रूप से हमेशा डेटाबेस ऑटो इंक्रीमेंटर की तुलना में पहचानकर्ताओं के लिए यूयूआईडी का उपयोग करना बेहतर होता है ।


आप आईडी को उजागर करने के बारे में सही हैं। दक्षता के बारे में, मैं अभी भी नहीं देख रहा हूं कि मैं दोनों आईडी का उपयोग कैसे कर सकता हूं। यदि ग्राहक uuid के साथ एक अनुरोध करता है, तो मैं uuid फ़ील्ड पर खोज करने वाला एक क्वेरी बनाने वाला हूं और परिणाम प्राप्त करूंगा। मैं ऑब्जेक्ट को तब तक नहीं जान सकता जब तक कि मैं इकाई को पुनः प्राप्त नहीं करता। इसलिए मुझे लगता है कि दोनों का उपयोग करने का कोई मतलब नहीं है।
anat0lius

1
यह विरासत के समर्थन के लिए समझ में आ सकता है। बता दें कि पुरानी ऑटोनोमेरिक आईडी को अभी भी विरासत डेटा या / और सिस्टम द्वारा संदर्भित किया जाता है। अन्यथा, UUID के साथ काम करना पूरी तरह से संभव है
Laiv

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

5

नहीं, जहां तक ​​डेटाबेस जाता है, आंतरिक संरचना के बारे में कुछ भी बाहरी एपीआई से उजागर नहीं होता है। आईडी की कोई बुद्धिमत्ता नहीं है। वे वास्तविक दुनिया में भी अद्वितीय नहीं हैं। आईडी: 47 हर जगह है। ऐसी इकाइयाँ हैं जिनके पास आप पहुँच सकते हैं और संभवतः डेटा में हेरफेर कर सकते हैं, लेकिन क्या यह डेटाबेस एक तालिका या दस में सब कुछ संग्रहीत करता है, वृद्धिशील आईडी को PK के रूप में उपयोग करता है और एक FK से संबंधित है, आप कभी नहीं जान पाएंगे।

यदि आप GetUserAccountByID (12345) बस किसी को GetUserAccountByID (12346) के लिए प्रयास करने के लिए कह रहे हैं। आखिरकार यह अन्य सुरक्षा उपायों के कारण काम नहीं करेगा, कोशिश भी न करें और कंपनी से अकाउंट हैक करने की जानकारी सोशल हैक करने की कोशिश न करें: 12346. जब तक आप डीबीए को कॉल नहीं करते हैं और 2 सप्ताह तक इंतजार करने को तैयार हैं प्रतिक्रिया;)

इसलिए GUID बनाएं, हालांकि आप एक फोन नंबर या ईमेल पते की तरह फिट या किसी अन्य प्राकृतिक कुंजी को देखते हैं। कुछ अस्पष्ट डेटा प्रयास में कुछ अस्पष्ट प्रतिलिपि और पेस्ट प्रयास से बचने के लिए तालिका में फ़ील्ड पर एक अद्वितीय बाधा डालें।

यह बेमानी नहीं है। दोनों क्षेत्र अलग-अलग उद्देश्यों की पूर्ति करते हैं।


0

यूयूआईडी की दक्षता आईडी के बारे में, जब तक कि आपके पास कई मल्टीपल टेबल नहीं होते, जिनमें से प्रत्येक में लाखों रिकॉर्ड होते हैं, यह बहुत अंतर नहीं करेगा। UUID का उपयोग करने से आपके एप्लिकेशन को स्क्रैप करना अधिक कठिन हो जाता है यदि आप सर्वर साइड पर सही की जाँच / आवेदन नहीं करते हैं:

  • प्राप्त [...] / १
  • प्राप्त [...] / 2

आईडी का उपयोग करते समय यह बहुत आसान है, यदि आप इसके बजाय यूयूआईडी का उपयोग करते हैं, तो यह स्क्रेपर के लिए एक कम विकल्प है।

आईडी को आपके एप्लिकेशन के डेटाबेस उदाहरण में आंतरिक से कुछ के रूप में देखा जा सकता है। उस वाक्य में तीन महत्वपूर्ण शब्द हैं:

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.