2010-05-10 9 views
6

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

कृपया अपने उत्तरों के साथ विशिष्ट रहें। कुछ कोड दिखाएं या डेटाबेस स्कीमा का वर्णन करें जहां एक ओआरएम संघर्ष करता है। भाषा या ओआरएम से कोई फर्क नहीं पड़ता।

उत्तर

5

मेरे द्वारा किए गए सभी ओआरएम के साथ मैंने जो बड़े मुद्दों पर ध्यान दिया है, उनमें से एक पहले ऑब्जेक्ट को पुनर्प्राप्त किए बिना केवल कुछ फ़ील्ड अपडेट कर रहे हैं।

उदाहरण के लिए, मेरे पास निम्न फ़ील्ड के साथ मेरे डेटाबेस में एक प्रोजेक्ट ऑब्जेक्ट मैप किया गया है: आईडी, नाम, विवरण, owning_user। कहें, AJAX के माध्यम से, मैं सिर्फ विवरण फ़ील्ड को अपडेट करना चाहता हूं। अधिकांश ओआरएम में डेटाबेस आईडी को अपडेट करने का एकमात्र तरीका केवल आईडी और विवरण मान होने पर या तो डेटाबेस से प्रोजेक्ट ऑब्जेक्ट को पुनर्प्राप्त करना है, विवरण सेट करें और फिर ऑब्जेक्ट को डेटाबेस पर वापस भेजें (इस प्रकार दो डेटाबेस ऑपरेशंस की आवश्यकता होती है बस एक साधारण अपडेट के लिए) या संग्रहीत प्रक्रियाओं के माध्यम से इसे अपडेट करने के लिए (जो विधि मैं वर्तमान में उपयोग कर रहा हूं)।

+0

मैं मानता हूं कि यह एक मुद्दा है, और यह ओआरएमएस के साथ मेरा # 1 पालतू शिखर है। मुझे नफरत है कि आपको अपने फ़ील्ड में से किसी एक को अपडेट करने के लिए ऑब्जेक्ट को 'SELECT' करना होगा, जिसके परिणामस्वरूप कई प्रश्न होंगे। यह कुछ है जो मैं आलसी लोडिंग के माध्यम से संबोधित करने जा रहा हूं। – ryeguy

0

ओआरएम एक जटिल समस्या को हल करने की कोशिश कर रहे हैं। किनारे के मामलों में कोई स्पष्ट या स्पष्ट समाधान नहीं है और प्रमुख डिजाइन ट्रेडऑफ हैं। जब आप स्थिति ए के लिए एक ओआरएम डिज़ाइन अनुकूलित करते हैं, तो आप मूल रूप से स्थिति बी को हल करने के लिए इसे अजीब बनाते हैं।

ऐसे ओआरएम हैं जो आलसी लोडिंग और सबक्वायरी को "पर्याप्त पर्याप्त" तरीके से संभालते हैं, लेकिन "अच्छा" से प्राप्त करना लगभग असंभव है पर्याप्त "करने के लिए" महान "।

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

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

अच्छी किस्मत पहिया को पुनर्निर्मित करना।

+1

यही वह है जिसके बारे में मैं बात कर रहा हूं। आप ओआरएम को निंदा करते हैं, फिर भी आप कोई स्पष्ट स्पष्टीकरण नहीं देते हैं। कुछ ओआरएम में केवल "पर्याप्त पर्याप्त" लागू किए गए सबक्वायरीज़ वास्तव में कैसे हैं? "... स्थिति बी को हल करने के लिए अजीब" - कौन सी स्थिति? मैं समझता हूं कि ओआरएम ट्रेडऑफ हैं, लेकिन इन स्थितियों से आप किस परिस्थितियों में बाधा डाल रहे हैं? किस तरह के प्रश्न, विशेष रूप से? – ryeguy

+0

@ryeguy: मैंने ORM को निंदा नहीं किया। मुझे PHP नहीं पता है और मुझे पता है कि ओआरएम जिन्हें आप जानते हैं, इसलिए मुझे नहीं पता कि आपको और अधिक विशिष्ट उदाहरण कैसे दिए जाएंगे। एक प्रसिद्ध ओआरएम ट्रेडऑफ यह है कि आलसी लोडिंग SELECT N + 1 समस्या का खुलासा करती है। –

+0

मैंने अपनी मूल पोस्ट में कहा कि यह अज्ञात हो सकता है, हालांकि। मुझे लगता है कि मैं इसे और अधिक स्पष्ट कर दूंगा। – ryeguy

4

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

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

3

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

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

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

+1

लेकिन क्या आप नहीं कहेंगे कि उनके उचित उपयोग के कारण, ओआरएम कोड उत्पन्न करता है ठीक है? मेरे अनुभव में वे "खराब कोड" उत्पन्न करने का एकमात्र समय तब होते हैं जब उन्हें गलत तरीके से उपयोग किया जा रहा है, जैसे लूप में रिश्तों को प्राप्त करना। – ryeguy

+1

लेकिन मेरा मतलब यह है कि, जब लोग जानते हैं कि वे क्या कर रहे हैं, तो वे अच्छे हैं, जब लोग उन्हें एसक्यूएल सीखने से बचने के लिए क्रैच के रूप में उपयोग करते हैं, तो वे एक गड़बड़ कर सकते हैं। – HLGEM

+0

मैं सहमत हूं, लेकिन क्या आप किसी भी उपकरण के बारे में नहीं कह सकते? अनुभवहीन प्रोग्रामर खराब एसक्यूएल लिख सकते हैं जितना आसान अनुभवहीन ओआरएम उपयोगकर्ता ओआरएम का उपयोग करके खराब प्रश्न लिख सकते हैं। – ryeguy

1

तरह से मैं इसे देख इस तरह है। एक ORM का उपयोग करने के लिए आपको आम तौर पर कई php कार्यों ढेर, और फिर एक डेटाबेस से कनेक्ट और अनिवार्य रूप से अभी भी एक MySQL क्वेरी या कुछ इसी तरह चलाने की है।

क्यों कोड और डेटाबेस के बीच में अमूर्त के सभी? हम जो कुछ भी पहले से जानते हैं उसका उपयोग क्यों नहीं कर सकते? आम तौर पर एक वेब देव अपनी बैकएंड भाषा, उनकी डीबी भाषा (कुछ प्रकार के एसक्यूएल), और एचटीएमएल, सीएसएस, जेएस, आदि जैसे कुछ प्रकार की फ्रंटेंड भाषाएं जानता है ...

संक्षेप में, हम कोशिश कर रहे हैं अमूर्तता की एक परत जोड़ें जिसमें कई फ़ंक्शन शामिल हैं (और हम सभी जानते हैं कि php फ़ंक्शन एक चर निर्दिष्ट करने से धीमे हो सकते हैं)। हां, यह एक सूक्ष्म गणना है, लेकिन फिर भी, यह जोड़ता है।

न केवल हम अब के माध्यम से जाना कई कार्य है, लेकिन हम भी जिस तरह से काम करता है ORM जानने के लिए है, इसलिए कुछ समय वहाँ व्यर्थ है। मैंने सोचा था कि कोड को अलग करने का पूरा विचार आपके कोड को सभी स्तरों पर अलग रखना था। आप दीप दुनिया में हैं, तो बस अपनी क्वेरी बनाने (आप MySQL पता होना चाहिए) और तैयार बयानों के लिए पहले से ही विद्यमान php कार्यक्षमता का उपयोग। किया हुआ!

दीप रास्ता:

  • क्वेरी (स्ट्रिंग) बनाएँ;
  • उपयोग mysqli विवरण तैयार और सरणी में डेटा पुनः प्राप्त।

ORM रास्ता:

  • रन एक समारोह है कि इकाई
  • जो एक MySQL क्वेरी
  • रन एक और समारोह है कि एक और समारोह है कि एक और सशर्त कहते हैं कहते हैं एक सशर्त
  • रन चलाता हो जाता है
  • रन एक और समारोह है कि मिलती है
  • एक और समारोह को चलाने कि एक और समारोह
  • रन में शामिल होने कि
  • रन एक और MySQL क्वेरी
  • रन एक और समारोह है कि डेटा को हासिल करेगा
  • तैयार करता है पर सशर्त, कहते हैं एक और MySQL क्वेरी

है किसी और एक समस्या है चलाता है ओआरएम ढेर के साथ? हम ऐसे आलसी डेवलपर्स क्यों बन रहे हैं?या इतनी रचनात्मक है कि हम अपने कोड को नुकसान पहुंचा रहे हैं? यदि यह तोड़ नहीं है तो इसे ठीक न करें। बदले में, वेब देव की मूल बातें समझने के लिए अपनी देव टीम को ठीक करें।

+0

आपका उत्तर PHP या अन्य भाषाओं/प्लेटफ़ॉर्म के लिए काफी विशिष्ट है जिनके पास कोई टूल समर्थन नहीं है। सी # में मैं बस 'var query = c से db.bustomers जैसे ओ से db.Orders में एक कथन का उपयोग करता हूं जहां o.CustomerId = c.ID नया {c.ID, c.Name, o.Quantity} का चयन करें; ' –

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