2010-08-12 10 views
7

अब "एनओएसक्यूएल" या "ऑब्जेक्ट केवल" स्टोरेज सिस्टम जैसे मोंगोडीबी या मेमकैच वास्तव में दुनिया में भाप उठा रहे हैं। मैं सोच रहा था कि क्या कोई अनुरोध है कि उन पर नहीं किया जा सकता है जिन्हें एकाधिक ऑब्जेक्ट जॉइन (एसक्यूएल में JOIN "table") का उपयोग करके किया जा सकता है। दूसरे शब्दों में, क्या कोई बहु-टेबल प्रश्न हैं जिन्हें पंक्ति में कई एकल तालिका प्रश्नों से नियंत्रित नहीं किया जा सकता है?डेटा ऑब्जेक्ट स्टोरेज - टेबल जॉइन कर सकता है क्या एक टेबल क्या चयन नहीं कर सकता है?

असल में, क्या कोई उपयोग-मामला मल्टी-टेबल शामिल होता है जिसे ऑब्जेक्ट आधारित स्टोरेज सिस्टम में एक समय में एक टेबल तक पहुंचकर दोहराया जा सकता है?

has_man और has_many_through संबंधों का उपयोग कर सामान्य 3NF क्वेरी के कुछ उदाहरण यहां दिए गए हैं। ये सबसे जटिल प्रश्न नहीं हैं - लेकिन उन्हें आपको अवधारणा के लिए एक प्रारंभिक बिंदु देना चाहिए। ध्यान दें कि {} में कोई भी मान अंतिम क्वेरी के परिणाम का मान है।


कंपनी कई उपयोगकर्ता

SELECT user.*, company.name as company_name FROM user 
LEFT JOIN company ON company.id = user.company_id 
WHERE user.id = 4 

बनाम

SELECT * FROM user WHERE id = 4 
SELECT * FROM company WHERE id = {user.comany_id} 

क्लब की सदस्यता के माध्यम से कई छात्रों गया है

SELECT student.* FROM student LEFT JOIN membership on 
membership.student_id = sudent.id WHERE membership.club_id = 5 

बनाम

SELECT * FROM membership WHERE club.id = 5 
SELECT * FROM student WHERE id = {membership.student_id} 

कारण मैं सोच रहा हूँ, क्योंकि मुझे पता है कि अगर वस्तु आधारित प्रणाली (है कि एक समय में एकल तालिका वस्तुओं तक पहुँचने पर भरोसा करते हैं) क्या PostgreSQL या जैसे डेटाबेस RDBMS क्या कर सकते हैं MySQL कर सकते हैं।

अभी तक एकमात्र चीज गलत प्रतीत होती है कि अधिक प्रश्न आवश्यक हैं।

उत्तर

3

1 - चल रहा है कई अलग प्रश्नों आप consurrency गंदगी के साथ छोड़ देता है - बार जब आप तालिका 1 से कुछ इसे नष्ट कर दिया जा सकता था मिल गया द्वारा और यह अभी भी तालिका 2 में हो सकता है - अब 5 सहसंबंधित टेबल मानें।

2 - फ़ील्ड्स नहीं पौराणिक आईडी हैं कम से कम मामूली जटिल तर्क के साथ क्वेरी चलाने

3 - प्राप्त किए गए डेटा की मात्रा (आप शायद ही कभी डेटा जो deserialize करने की जरूरत है की 50% से अधिक की जरूरत है नियंत्रित/वैध ऑब्जेक्ट्स और यहां तक ​​कि जुड़े ऑब्जेक्ट्स के पूरे पेड़ भी खराब करें)

4 - सहसंबंधित प्रश्न (नेस्टेड चयन) जो SQL सर्वर अनुकूलन जटिलता या बेहतर में शामिल होने की तरह ऑप्टिमाइज़ करेगा (| टी 1 | + | टी 2 | + | टी 3 | + | टी 4 |) जबकि किसी भी ओआरएम या गैर एसक्यूएल को आंतरिक प्रश्नों को दोहराना और बहुविकल्पीय जटिलता को जन्म देना होगा (| टी 1 | | टी 2 | | टी 3 | * | टी 4 |)

5 - डेटासेट आकार, स्केलेबिलिटी न केवल डेटासेट आकार में बल्कि अपडेट के तहत समेकन को संभालने में भी। यहां तक ​​कि ओआरएम-एस जो लेनदेन बनाए रखता है उन्हें इतना लंबा बना देता है कि डेडलॉक्स की संभावना तेजी से बढ़ जाती है।

6 - अंधेरे अपडेट (किसी भी कारण से बहुत अधिक डेटा छुआ नहीं गया) और उनकी निर्भरता और अंधेरे उपकरण के आधार पर विफलता (पौराणिक संस्करण जो यथार्थवादी रूप से संबंधपरक डेटा मॉडल के 1% में कहने की आवश्यकता है लेकिन ओआरएम और समानताएं हैं यह हर जगह)

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

8 - डेटा अखंडता - कुछ कोड अभी टी 1 से आज के ऑर्डर रिकॉर्ड के आधे हटा दिए गए हैं क्योंकि इसे रोकने के लिए टी 2 की कोई विदेशी कुंजी नहीं थी। अलग-अलग प्रश्नों के साथ सामान्य रूप से सामान्य बात करना।

9 - नकारात्मक परिपक्वता प्रवृत्ति - टूटने के बजाय मानकीकरण का रहता है - यह 20 साल देने के लिए और शायद यह स्थिर

इतना ही नहीं बल्कि मिल जाएगा - यह किसी भी compexity को कम नहीं करता (डेटा के बीच एक ही सह-संबंध अब भी है वहां) लेकिन जटिलता को ट्रैक करने और प्रबंधित करने में बहुत मुश्किल होती है या कुछ गलत होने पर कोई यथार्थवादी उपाय या पारदर्शिता होती है। और यह 1-2 परतों की जटिलता जोड़ता है। अगर आपकी एसक्यूएल टेबल में कुछ गलत हो जाता है तो आपके पास अपने डेटा को खोजने और यहां तक ​​कि ठीक करने के लिए टूल और प्रश्न हैं। आप क्या करने जा रहे हैं जब कुछ ओआरएम आपको बताता है कि इसमें "अमान्य सूचक" है और निश्चित रूप से आप अपवाद फेंकते हैं क्योंकि आप "अमान्य वस्तु" नहीं चाहते हैं?

मुझे लगता है कि यह पर्याप्त है :-)

+0

यह इस विषय के लिए मैंने कभी भी देखा है कि विपक्ष की सबसे अच्छी सूची है। आपने वहां कुछ महत्वपूर्ण बिंदुओं की ओर इशारा किया है कि मेरा मानना ​​है कि इस सवाल का जवाब दिया गया है। – Xeoncross

+0

आइए बस यह कहें कि मैंने ओआरएम टाई-अप से कोडबेस को पुनर्प्राप्त करने में 2 एम खर्च किए हैं :-) और ऐसा करने के दौरान मुझे एक और 2 ओआरएम "फ्रेमवर्क" द्वारा लुभाया गया था। पेर्फ छत के माध्यम से चला गया, सीपीयू का उपयोग नीचे फर्श पर है और यह कनेक्शन स्थिरता और पूलिंग को अब स्वीकृत करता है, जो गरीब प्रोग्रामर के लिए स्वास्थ्य लाभ के रूप में गिना जाता है :-)) – ZXX

+0

+1 उत्कृष्ट उत्तर। –

4

सिर्फ इसलिए कि आप कर सकते हैं, इसका मतलब यह नहीं है कि होना चाहिए।

कई SELECT कथन विकल्प विपक्ष:

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

बिल्कुल कोई जवाब नहीं है लेकिन आपने कुछ अच्छे अंक लाए हैं। 1) डेटाबेस के लिए कम यात्रा एक प्लस है। लेकिन मुझे यकीन नहीं है कि इसके लिए भुगतान करने की बात कहां से आती है क्योंकि आवेदन एक निजी लैन का उपयोग करते हैं। 2) बहुत सच है। हालांकि मैं वास्तव में एक मामले के बारे में सोच नहीं सकता। 3) संभवतः, हालांकि जॉइन डेटा के उपयोग के बिना किसी भी कैश कई बार छोटे होंगे क्योंकि वे केवल डेटाबेस से 1: 1 ऑब्जेक्ट्स संग्रहित कर रहे हैं। 4) एक और अच्छा मुद्दा - अधिक कोड लिखा गया - अधिक पुनः लिखा जाना चाहिए। फिर फिर, परियोजनाओं को कितनी बार एक भाषा से दूसरी भाषा में ले जाना है? क्या यह आपके आवेदन डिजाइन को आकार देना चाहिए? – Xeoncross

+0

@Xeoncross: आप बहुत सारे पूर्ण मानते हैं ... हर कोई एक लैन पर अपने डेटा तक नहीं पहुंच रहा है - कट्टर सेटअप में अलग-अलग भौगोलिक स्थान पर डेटा केंद्र होंगे। पुन: विभिन्न भाषाओं में कोडिंग - यह ग्राहक की जरूरतों पर निर्भर करता है, और वे इच्छानुसार बदल सकते हैं। मैं असहमत हूं कि यह "बिल्कुल सही नहीं है" - मैंने आपके द्वारा पोस्ट किए गए वैकल्पिक प्रश्नों की कमियों को इंगित किया। कुछ हाथों की स्थिति पर लागू होते हैं, कुछ नुकसान केवल मध्यम से बड़ी परियोजनाओं पर दिखाई देते हैं। इसका मतलब यह नहीं है कि छोटी परियोजनाएं लाभ नहीं उठा सकती हैं; न्यूनतम अंतर का मतलब यह नहीं है कि यह हमेशा ऐसा होता है। –

+0

सही, मैं मान रहा था कि यह केवल एक ही डेटा केंद्र के साथ एक छोटा/मध्यम आकार का व्यवसाय था। सस्ते बैंडविड्थ की आवश्यकता के बारे में आपका बिल्कुल सही अधिकार। फिर फिर, 3x पैकेट की लागत बनाम 4kb जॉइन में सभी डेटा की लागत बहुत अधिक नहीं हो सकती है। उस समय स्थानांतरित डेटा की लागत काफी करीब है - केवल प्रतीक्षा समय समस्या है। – Xeoncross

1

आप पुराने रूप से 'पदानुक्रमित' डेटाबेस की तरह भी हो सकते हैं!

ओएमजीपीनी के उत्तरों के अलावा, रिपोर्टिंग करना मुश्किल है।

स्केलिंग के बारे में - यह सही नहीं है। nosql स्केलिंग के लिए है, अगर आप इसे सही इस्तेमाल करते हैं।

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

यदि डेटाबेस एकल उद्देश्य है (usu। उच्च वॉल्यूम ऐप्स के मामले में) nosql ठीक होने की संभावना अधिक है।

बहुउद्देश्यीय - OLTP - व्यवसाय की रेखा - एसक्यूएल के साथ जाएं।

मैं जा सकता था लेकिन यह मेरे दोपहर के भोजन के ब्रेक में खा रहा है। ऐसा नहीं है कि मैं कभी भी कार्य समय में खाऊंगा। मैं सिर्फ अपने लंच ब्रेक के दौरान खाना पसंद करता हूं।

2

वास्तव में सबसे बड़ी समस्याओं में से एक यह है कि कुछ नोएसक्यूएल डेटाबेस कई प्रश्नों में लेनदेन नहीं कर रहे हैं। हाइबरनेट जैसे ओआरएम कभी-कभी "जुड़ने" के साथ कई प्रश्न पूछेंगे लेकिन लाभ होगा कि वे एक ही लेनदेन में हैं।

नोएसक्यूएल के साथ आपके पास वह लक्जरी नहीं है।

SELECT * FROM user WHERE id = 4 
SELECT * FROM company WHERE id = {user.comany_id} 

user.company_id के लिए कंपनी के पास दो बयान कॉल के बीच हटा दी जाती है, तो: तो यह बहुत आसानी से भ्रामक परिणाम प्राप्त हो सकते। यह इन डेटाबेस के साथ एक प्रसिद्ध मुद्दा है। इस पर ध्यान दिए बिना कि आप सही तरीके से जुड़ सकते हैं या नहीं, इस मुद्दे पर लेनदेन नहीं होंगे।

नहीं तो आप कुछ भी इतने लंबे समय के मॉडल के रूप में यह बाइट्स स्टोर कर सकते हैं कर सकते हैं :)

+0

अच्छा बिंदु - डीबी में जो कुछ भी मेल नहीं खाता है, वह देखने के लिए कुछ है। हालांकि, मुझे यकीन नहीं है कि "असफल" सही शब्द है क्योंकि दूसरी क्वेरी से "0" पंक्तियों के परिणामस्वरूप पूरी तरह से स्वीकार्य होगा। असल में, मुझे एक ऐसी क्वेरी का उपयोग करने के बजाय इस वास्तविक समय की बातचीत की अधिक आवश्यकता होगी जिसमें उस डेटा को शामिल किया जा सकता है जो मुझे प्राप्त होने तक अस्तित्व में नहीं था। – Xeoncross

+0

@Xeoncross आप सही हैं। यह एक मानसिक/शब्दकोष पर्ची थी। –

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