मुझे आराम करने वाली सेवा में एक सूचीबद्ध सूची संसाधन कैसे डिज़ाइन करना चाहिए?


11

मैं एक ही समस्या में बार-बार भाग गया हूं और मुझे ऐसा कोई समाधान नहीं मिला है जो मुझे वास्तव में महसूस हो।

किसी ऐप में कहें, आपके पास एक ऑर्डर की गई सूची है और आप उपयोगकर्ता को उस ऑर्डर को ड्रैग एंड ड्रॉप या कुछ और से बदलने देते हैं। आप लगातार बने रहने के लिए बदलाव चाहते हैं। आप कैसे मॉडल है?

मुझे एक सूचीबद्ध सूची संसाधन की एक आरामदायक सेवा कैसे डिज़ाइन करनी चाहिए?

विशेष रूप से, मैं कैसे डिजाइन चाहिए listऔर itemएक आरामदायक संसाधन का मॉडल? सबसे आम डिजाइन जो मैंने देखा है वह itemएक orderया positionसंपत्ति वाली इकाई है। एक और दृष्टिकोण जो मैंने सुना है वह वस्तुओं पर एक डबल-लिंक की गई सूची है।

ऐसा कौन सा दृष्टिकोण है जो डेटाबेस में बहुत अधिक नहीं लिखता है और आम तौर पर ग्राहकों के लिए अपडेट और पढ़ने के लिए तेज़ है? एंडपॉइंट को कैसे उजागर किया जाना चाहिए?


जिज्ञासा से बाहर, विशेष रूप से एक ऑर्डर की गई सूची को वापस करना महत्वपूर्ण क्यों है?
एडम वेल्स

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

जवाबों:


14

एक आदेशित सूची का प्रतिनिधित्व करना रिलेशनल डेटाबेस के साथ कठिन समस्याओं में से एक है। सूची-सदस्यता संबंध में एक स्थिति संपत्ति जोड़ना ऐसा करने का सबसे आम तरीका है, क्योंकि आप ORDER BY positionअपनी SQL क्वेरी में जोड़कर आदेशित सूची को आसानी से प्राप्त कर सकते हैं , और क्योंकि आप आसानी से सूची के बीच में आइटम औसत से सम्मिलित कर सकते हैं। पिछली और बाद की सूची के सदस्य के मान, स्थिति को पूर्णांक के बजाय एक तैरता है।

दोहरे लिंक वाली सूचियों का उपयोग करने से बचना चाहिए, क्योंकि गलती से लिंक को असंगत बनाना आसान होता है, और इसके बजाय एक चक्रीय ग्राफ या पेड़ के साथ समाप्त होता है।

हालांकि, रेस्टफुल एपीआई रिलेशनल डेटाबेस के प्रतिबंध से ग्रस्त नहीं हैं। आप बस कुछ ऐसा कर सकते हैं जो एक स्थिति संपत्ति की तरह एक हैक का उपयोग करने के बजाय प्राकृतिक महसूस करता है।

यदि आपके पास सूची में केवल कुछ सौ तत्व हैं, तो बस पूरी सूची को एक अनुरोध में स्थानांतरित करें। यह मानते हुए कि हम [1, 2, 3, 4]सूची के सदस्यों को आईडी करना चाहते हैं, जहां हम पहचान कर सकते हैं

POST /url/of/the/list
Content-type: application/json
...

[1, 2, 4, 3]

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

यदि सूची बड़ी है और आइटम आमतौर पर व्यक्तिगत रूप से अनुरोध किए जाएंगे, तो आप url में एक सूचकांक की अनुमति दे सकते हैं:

GET /page/7

यदि आप HATEOAS में हैं, तो प्रतिक्रिया में नेविगेशन को सरल बनाने के लिए प्रचलित / अगले लिंक शामिल हो सकते हैं, यदि संसाधन आमतौर पर इस तरह से उपभोग किया जाएगा। हालाँकि, इसका अर्थ यह नहीं है कि आपके डेटाबेस में यह दोगुनी-लिंक्ड सूची भी है।

यदि सूची बहुत बड़ी है, तो आप ArrayListइस तरह के / insertया के समान संचालन को उजागर करना चाह सकते हैं । मैं एक कॉल की कल्पना कर सकता था जैसेpushappend

POST /url/of/the/list?at=1357;mode=insert
...

description of the item to insert

यदि reordering एक सामान्य उपयोग का मामला है और reordering को तुरंत प्रतिबद्ध किया जाना चाहिए, तो आप अपने API में एक उपयुक्त समापन बिंदु प्रदान कर सकते हैं:

POST /url/of/the/list/reorder-item?from=783;to=1357

यदि पुन: सूचीबद्ध सूची स्पष्ट रूप से प्रतिबद्ध होनी चाहिए, तो नए आदेश को JSON दस्तावेज़ के रूप में स्थानांतरित करना आसान होगा, ऊपर देखें।

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


1
ध्यान दें कि "संपूर्ण सूची को बदलें" दृष्टिकोण समस्याग्रस्त हो सकता है यदि कई ग्राहक परिवर्तन कर रहे हों। यदि आप कोई सावधानी नहीं बरतते हैं, तो आप किसी और के परिवर्तन ("जीत लिखने के लिए अंतिम") को ओवरराइट कर सकते हैं।
oee

सूची-जैसी कार्रवाइयों में यह समस्या नहीं होनी चाहिए, बशर्ते कि पैरामीटर (पर, से,) आईडी हों, सूची सूचकांक नहीं
oee

2

मुझे लगता है कि विभिन्न दृष्टिकोणों की व्यवहार्यता अंतर्निहित डेटाबेस के उपयोग पर भारी निर्भर करती है।

इस दृष्टिकोण ने आदेश में एक आइटम को स्थानांतरित करने का सुझाव दिया:

POST / url / of / the / list / reorder-item? = 783 से? = 1357 तक

जब तक कि आपके पास अनुक्रमिक लेन-देन न हो, तब तक दौड़ की स्थिति के अधीन हो सकता है। अधिकांश DBs में READ_COMMITTED का डिफ़ॉल्ट स्तर एक दौड़ की स्थिति को समाप्त नहीं करेगा!

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

यह अंतिम-लेखन-जीत से ग्रस्त है, लेकिन यह वास्तव में किसी भी एपीआई का सच है। कोई फर्क नहीं पड़ता कि आप किस एपीआई को लागू कर रहे हैं, किसी अन्य ग्राहक ने पृष्ठ को देखते समय बात को अपडेट किया हो सकता है।

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