RESTful API के लिए SQL डेटाबेस संरचना


11

मैं एक RESTful API बना रहा हूं। मैं अपने संसाधनों के चारों ओर अपने डेटाबेस तालिकाओं को डिजाइन करने का सबसे अच्छा तरीका तय करने के लिए संघर्ष कर रहा हूं।

प्रारंभ में, मैं हालांकि प्रति संसाधन एक तालिका जाने के लिए एक अच्छा तरीका होगा, लेकिन मुझे अब चिंता है कि इससे आपके द्वारा जाने वाले संसाधन श्रृंखला में और भी बड़ी तालिकाओं का परिणाम होगा।

उदाहरण के लिए, कल्पना करें कि मेरे पास तीन संसाधन हैं - उपयोगकर्ता, ग्राहक, बिक्री। उपयोगकर्ता मेरे एपीआई के ग्राहक हैं, ग्राहक उपयोगकर्ता ग्राहक हैं, और बिक्री प्रत्येक ग्राहक द्वारा उपयोगकर्ता खाते में की गई खरीदारी की है।

एक बिक्री संसाधन निम्नानुसार पहुँचा जाता है

GET /users/{userID}/clients/{clientID}/sales/{salesID}

इसलिए यदि 10 उपयोगकर्ता हैं, प्रत्येक के पास 10 ग्राहक हैं, और प्रत्येक ग्राहक के लिए 10 बिक्री हैं, तो टेबल का आकार संसाधन श्रृंखला से और अधिक बड़ा हो जाता है।

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

क्वेरी चलाने से पहले तालिकाओं में शामिल होना भी आवश्यक होगा। कारण यह है कि मैं प्रत्येक उपयोगकर्ता को एक ही नाम के साथ एक ग्राहक रखने की अनुमति देता हूं। गलत क्लाइंट डेटा प्राप्त करने से बचने के लिए, उपयोगकर्ता तालिका और क्लाइंट टेबल {userID} से जुड़ जाते हैं। बिक्री का भी यही हाल है। क्या बड़े टेबल से जुड़ना और पढ़ना और लिखना धीमा हो जाएगा?

जवाबों:


31

मैं अपने संसाधनों के चारों ओर अपने डेटाबेस तालिकाओं को डिजाइन करने का सबसे अच्छा तरीका तय करने के लिए संघर्ष कर रहा हूं।

मत करो।

अपने API को Restful Principes के अनुसार डिज़ाइन करें , सामान्यीकरण सिद्धांतों के अनुसार अपने डेटाबेस को डिज़ाइन करें । एक को दूसरे पर प्रभाव डालने की जरूरत नहीं है।

आपके डेटाबेस में एक SaleResourceतालिका नहीं होनी चाहिए , इसमें एक Sale(या खरीद / आदेश) तालिका होनी चाहिए । उस तालिका में एक प्राथमिक कुंजी शामिल होगी जो विशिष्ट रूप से संबंधित उपयोगकर्ता और ग्राहक तालिकाओं को बिक्री और विदेशी कुंजियों की पहचान करती है।

आप REST एपीआई GET /users/{userID}/clients/{clientID}/sales/{salesID}उपयुक्त डेटाबेस क्वेरी द्वारा पहचाने गए संसाधन के लिए अनुरोध का अनुवाद करेंगे , पंक्ति को पुनः प्राप्त करेंगे, उस संसाधन का निर्माण करेंगे जो किसी सेल का प्रतिनिधित्व करता है और इसे क्लाइंट को लौटाता है।

इस बात का ध्यान रखें कि आप वर्तमान में बाहरी दुनिया के लिए आंतरिक डेटाबेस पहचानकर्ता (UserID / ClientId / SalesID) प्रतीत हो रहे हैं। यह आपके मामले में उचित हो सकता है लेकिन आम तौर पर <entity>IDएक RESTful API में लगता है।


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

3
हाँ। आपके द्वारा उल्लेखित कुछ भी नहीं बताता है कि सामान्यीकृत स्कीमा से भटकना आवश्यक होगा।
मार्क स्टोरी-स्मिथ

9

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

एक साइड नोट के रूप में: आपको user/{userID}URI की आवश्यकता नहीं है । आप किरायेदार (userID) को प्रमाणीकरण जानकारी से जानते हैं।


धन्यवाद- हाँ मुझे आगे पढ़ने की जरूरत है। आज तक की मेरी परियोजनाओं में बहुत कम डेटाबेस का काम हुआ है। मैं आपके द्वारा सुझाए गए संसाधन को
पढ़ूंगा

मुझे लगता है कि साझा-साझा मेरे लिए जाने का रास्ता है। मेरे 'उपयोगकर्ता' 'किरायेदार' नहीं हैं। उन्हें अलग-थलग डेटा की आवश्यकता नहीं है और उन्हें किसी भी डेटाबेस प्रबंधन कार्यों के लिए सीधी पहुँच की आवश्यकता नहीं होगी। मैं जो भी पढ़ता हूं, यह सुझाव देगा कि साझा-साझा सबसे अच्छा है? तुम क्या सोचते हो?
गज़_एज

2
साझा करना सबसे आसान है। आपको user_idप्रत्येक तालिका में एक कुंजी के रूप में जोड़ना होगा और left.user_id = right.user_idप्रासंगिक जोड़ (आमतौर पर, सभी) में जोड़ना होगा। कुछ ORMs का समर्थन scopping पहुँच। और मूर्ख नहीं बनाया जा रहा है, अपने उपयोगकर्ताओं हैं किरायेदारों, जब से तुम उपयोगकर्ता foo 'नहीं करना चाहते को देखने के लिए / उपयोगकर्ता' बार 'की बिक्री को संशोधित।
रेमस रुसानु

धन्यवाद। Im यह देखने के लिए शुरुआत करता है कि अनुक्रमित मेरी डेटाबेस संरचना बनाने के लिए महत्वपूर्ण हैं।
गज_एज

0

बस जो पहले से ही यहां कहा गया है उसे जोड़ने के लिए - आप वास्तविक एपीआई और अपने डेटाबेस परत के बीच एक इंटरफ़ेस बनाना चाहते हैं। यह लाइन के नीचे कैशिंग और सारांश तालिकाओं को जोड़ना आसान बनाता है ...


1
कुछ लिंक या आगे की व्याख्या सहायक होगी
Gaz_Edge

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