क्यों सभी सक्रिय रिकॉर्ड से नफरत है? [बन्द है]


103

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

अक्सर, लोग कहते हैं कि यह अच्छी तरह से स्केल नहीं करता है (ट्विटर को उनके प्रमुख उदाहरण के रूप में उद्धृत करते हुए) - लेकिन कोई भी वास्तव में नहीं समझाता है कि यह अच्छी तरह से स्केल क्यों नहीं करता है; और / या बिना विपक्ष के एआर के पेशेवरों को कैसे प्राप्त किया जाए (एक समान लेकिन अलग पैटर्न के माध्यम से?)

उम्मीद है कि यह डिजाइन पैटर्न के बारे में एक पवित्र युद्ध में नहीं बदल जाएगा - मैं यह जानना चाहता हूं कि **** विशेष रूप से **** है जो सक्रिय रिकॉर्ड में गलत है।

यदि यह अच्छी तरह से पैमाने पर नहीं है, तो क्यों नहीं?

इसमें और क्या समस्याएं हैं?


9
मुझे लगता है कि सामान्य तौर पर बहुत सारे नफरत और नापसंद के खिलाफ नापसंद गलत उपयोग से जुड़े हैं। लोग अधिक उपयोग करते हैं और उन्हें गलत संदर्भ में उपयोग करते हैं और मूल से अधिक जटिल समाधान के साथ समाप्त होते हैं
terjetyl

1
रूबी का सक्रिय रिकॉर्ड कार्यान्वयन ORM की तरह है।
जिमी टी।

1
एक सामाजिक घटना है जो प्रशंसा प्राप्त करने के लिए है, अधिक मान्यता, होशियार और काटने-खून-बहाने वाला लगता है, लोग किसी भी मौजूदा मानक, मॉडल, व्यापक रूप से अपनाई गई तकनीक की उपेक्षा के यांत्रिक रूप से किसी भी तरह का दोहराव करते हैं, इसे भ्रमित करते हैं। अगली लहर के लिए क्रांतिकारी प्रगति।
आंद्रे फिग्यूएरेडो

जवाबों:


90

नहीं है ActiveRecord डिजाइन पैटर्न और ActiveRecord रेल ORM लाइब्रेरी , और वहाँ भी और अन्य भाषाओं नेट के लिए दस्तक नापसंद, की एक टन है।

ये सभी अलग-अलग चीजें हैं। वे ज्यादातर उस डिज़ाइन पैटर्न का पालन करते हैं, लेकिन इसे कई अलग-अलग तरीकों से बढ़ाते हैं और संशोधित करते हैं, इसलिए किसी को भी "ActiveRecord बेकार" कहने से पहले "जो ActiveRecord है, वहाँ ढेर है?"

मैं केवल Rails के ActiveRecord से परिचित हूं, मैं उन सभी शिकायतों को दूर करने की कोशिश करूंगा जो इसे इस्तेमाल करने के संदर्भ में उठाई गई हैं।

@BlaM

मैं सक्रिय रिकॉर्ड्स के साथ जो समस्या देख रहा हूं, वह यह है कि यह हमेशा केवल एक तालिका के बारे में है

कोड:

class Person
    belongs_to :company
end
people = Person.find(:all, :include => :company )

यह SQL के साथ उत्पन्न करता है LEFT JOIN companies on companies.id = person.company_id, और स्वचालित रूप से संबंधित कंपनी ऑब्जेक्ट्स को उत्पन्न करता है ताकि आप कर सकें people.first.companyऔर इसके लिए डेटाबेस को हिट करने की आवश्यकता नहीं है क्योंकि डेटा पहले से मौजूद है।

@ pix0r

सक्रिय रिकॉर्ड के साथ अंतर्निहित समस्या यह है कि डेटाबेस क्वेरी स्वचालित रूप से उत्पन्न होती है और वस्तुओं को आबाद करने और डेटाबेस रिकॉर्ड को संशोधित करने के लिए निष्पादित होती है

कोड:

person = Person.find_by_sql("giant complicated sql query")

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

@ तैम सुलीवन

... और आप मॉडल के कई उदाहरणों का चयन करते हैं, आप मूल रूप से एक "सेलेक्ट * ..." कर रहे हैं

कोड:

people = Person.find(:all, :select=>'name, id')

यह केवल डेटाबेस से नाम और आईडी कॉलम का चयन करेगा, मैप की गई वस्तुओं में अन्य सभी 'विशेषताएँ' केवल शून्य होंगी, जब तक कि आप उस ऑब्जेक्ट को मैन्युअल रूप से पुनः लोड नहीं करते हैं, और इसी तरह।


ताकतवर! मुझे उस विशिष्ट सुविधा के बारे में पता नहीं था। फिर भी एक और प्रो-एआर ने मुझे अपने शस्त्रागार में डाल दिया।
टिम सुलिवन

ज्वाइनिंग एक्टिव रिकॉर्ड पैटर्न से आगे जाती है।
जिमी टी।

"Person.find_by_sql" सक्रिय रिकॉर्ड पैटर्न नहीं है। इसका बहुत अधिक "सक्रिय रिकॉर्ड" मुझे विफल रहा है इसलिए मुझे इसे मैन्युअल रूप से पैच करने की आवश्यकता है।
Magallanes

52

मैंने हमेशा पाया है कि ActiveRecord त्वरित CRUD- आधारित अनुप्रयोगों के लिए अच्छा है जहाँ मॉडल अपेक्षाकृत सपाट है (जैसा कि, बहुत वर्ग पदानुक्रम नहीं है)। हालांकि, जटिल OO पदानुक्रम के साथ अनुप्रयोगों के लिए, एक DataMapper शायद एक बेहतर समाधान है। जबकि ActiveRecord आपकी तालिकाओं और आपके डेटा ऑब्जेक्ट्स के बीच 1: 1 का अनुपात मानता है, उस तरह का संबंध अधिक जटिल डोमेन के साथ अस्पष्ट होता है। पैटर्न पर अपनी पुस्तक में , मार्टिन फाउलर बताते हैं कि ActiveRecord उन परिस्थितियों में टूट जाता है जहां आपका मॉडल काफी जटिल है, और विकल्प के रूप में एक DataMapper का सुझाव देता है ।

मैंने इसे व्यवहार में सही पाया है। ऐसे मामलों में, जहां आपके डोमेन में बहुत अधिक विरासत है, आपके आरडीबीएमएस से विरासत को मैप करना कठिन है, जितना कि संघों या रचना को मैप करना है।

जिस तरह से मैं करता हूं वह "डोमेन" ऑब्जेक्ट है जो आपके नियंत्रकों द्वारा इन DataMapper (या "सर्विस लेयर") कक्षाओं के माध्यम से एक्सेस किया जाता है। ये सीधे डेटाबेस को दर्पण नहीं करते हैं, लेकिन कुछ वास्तविक दुनिया की वस्तु के लिए आपके OO प्रतिनिधित्व के रूप में कार्य करते हैं। मान लें कि आपके डोमेन में एक उपयोगकर्ता वर्ग है, और उस उपयोगकर्ता ऑब्जेक्ट को पुनः प्राप्त करते समय पहले से लोड की गई अन्य वस्तुओं के संदर्भ, या संग्रह करने की आवश्यकता है। डेटा कई अलग-अलग तालिकाओं से आ रहा हो सकता है, और एक ActiveRecord पैटर्न इसे वास्तव में कठिन बना सकता है।

उपयोगकर्ता ऑब्जेक्ट को सीधे लोड करने और ActiveRecord शैली API का उपयोग करके डेटा तक पहुँचने के बजाय, आपका नियंत्रक कोड उपयोगकर्ता ऑब्जेक्ट को UserMapper.getUser () विधि के उदाहरण के लिए कॉल करके पुनर्प्राप्त करता है। यह वह मैपर है जो अपने संबंधित तालिकाओं से किसी भी संबंधित ऑब्जेक्ट को लोड करने और कॉल करने के लिए पूरा उपयोगकर्ता "डोमेन" ऑब्जेक्ट को वापस करने के लिए जिम्मेदार है।

अनिवार्य रूप से, आप कोड को अधिक प्रबंधनीय बनाने के लिए अमूर्तता की एक और परत जोड़ रहे हैं। चाहे आपके DataMapper क्लासेस में कच्चे कस्टम SQL हों, या डेटा एब्स्ट्रैक्शन लेयर API पर कॉल करें, या खुद ActiveRecord पैटर्न भी एक्सेस करें, वास्तव में उस कंट्रोलर कोड के लिए कोई फर्क नहीं पड़ता जो एक अच्छा, पॉप्युलर यूजर ऑब्जेक्ट प्राप्त कर रहा है।

वैसे भी, मैं इसे कैसे करते हैं।


5
लगता है जैसे आप ActiveRecord के साथ बस अपरिचित हैं। "ActiveRecord आपके तालिकाओं के बीच 1: 1 अनुपात मानता है"। बस सच नहीं है। ActiveRecord में सभी प्रकार के uber- भयानक रिलेशनल मैजिक हैं। देखें api.rubyonrails.org/classes/ActiveRecord/Associations/...
tybro0103

16
@ JoãoBragança - शायद व्यंग्यात्मक टिप्पणी के बजाय, आप वास्तव में उन कठिनाइयों की व्याख्या कर सकते हैं जो तब होती हैं जब किसी का डेटा शार्प किया जाता है - इसलिए हममें से कुछ लोग कुछ सीख सकते हैं :)
टैरिन ईस्ट

11

मुझे लगता है कि ActiveRecord पर लोग "नफरत" क्यों कर रहे हैं और इसके लिए "गलत" क्या है, इसके बीच बहुत अलग कारणों की संभावना है।

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

टिप्पणीकारों के उत्तर देने के विषय में जोड़ने के लिए, जो कहते हैं कि चीजें एक कोड स्निपेट रेज़िंडर के साथ ActiveRecord में कठिन हैं

@Sam McAfee कहो कि आपके डोमेन में एक उपयोगकर्ता वर्ग है, और उस उपयोगकर्ता ऑब्जेक्ट को पुनः प्राप्त करते समय पहले से लोड की गई अन्य वस्तुओं के संदर्भ, या संग्रह करने की आवश्यकता है। डेटा कई अलग-अलग तालिकाओं से आ रहा हो सकता है, और एक ActiveRecord पैटर्न इसे वास्तव में कठिन बना सकता है।

user = User.find(id, :include => ["posts", "comments"])
first_post = user.posts.first
first_comment = user.comments.first

शामिल विकल्प का उपयोग करके, ActiveRecord आपको डिफ़ॉल्ट आलसी-लोडिंग व्यवहार को ओवरराइड करने देता है।


8

मेरा लंबा और देर से जवाब, पूरा भी नहीं, लेकिन एक अच्छी व्याख्या क्यों मुझे इस पैटर्न, राय और यहां तक ​​कि कुछ भावनाओं से नफरत है:

1) लघु संस्करण: सक्रिय रिकॉर्ड डेटाबेस और एप्लिकेशन कोड के बीच " मजबूत बंधन " की " पतली परत " बनाता है । जो कोई तार्किक नहीं, कोई समस्या नहीं, कोई समस्या नहीं। IMHO यह प्रोग्रामर के लिए कुछ सिंटैक्टिक शुगर को छोड़कर कोई वैल्यू प्रदान नहीं करता है (जो तब कुछ डेटा तक पहुंचने के लिए "ऑब्जेक्ट सिंटैक्स" का उपयोग कर सकता है, जो एक रिलेशनल डेटाबेस में मौजूद है)। प्रोग्रामर के लिए कुछ आराम पैदा करने का प्रयास (IMHO ...) बेहतर स्तर के डेटाबेस एक्सेस टूल में निवेश किया जाना चाहिए, जैसे कि सरल, आसान, सादे के कुछ रूपांतरhash_map get_record( string id_value, string table_name, string id_column_name="id" ) और इसी तरह के तरीकों के (निश्चित रूप से, अवधारणाएं और लालित्य बहुत भिन्न होते हैं) भाषा का इस्तेमाल किया)।

2) लंबा संस्करण: किसी भी डेटाबेस-संचालित परियोजनाओं में जहां मुझे चीजों का "वैचारिक नियंत्रण" था, मैंने एआर से परहेज किया, और यह अच्छा था। मैं आमतौर पर एक स्तरित वास्तुकला का निर्माण करता हूं (आप जितनी जल्दी या बाद में अपने सॉफ़्टवेयर को परतों में विभाजित करते हैं, कम से कम मध्यम-से-बड़े-बड़े आकार के प्रोजेक्ट में करते हैं:

A1) डेटाबेस ही, टेबल, संबंध, यहां तक ​​कि कुछ तर्क अगर DBMS इसे अनुमति देता है (MySQL भी अब बड़ा हो गया है)

A2) बहुत बार, एक डेटा स्टोर की तुलना में अधिक है: फ़ाइल सिस्टम (डेटाबेस में ब्लॉब्स हमेशा एक अच्छा निर्णय नहीं होता है ...), विरासत प्रणाली (खुद को "कैसे" उन्हें एक्सेस किया जाएगा, कई किस्में संभव हैं .. लेकिन thats बात नहीं ...)

बी) डेटाबेस एक्सेस लेयर (इस स्तर पर, टूल मेथड्स, डेटाबेस में डेटा को आसानी से एक्सेस करने के लिए हेल्पर्स का बहुत स्वागत है, लेकिन AR कुछ सिंटैक्टिक शुगर को छोड़कर यहां कोई मूल्य प्रदान नहीं करता है)

सी) एप्लिकेशन ऑब्जेक्ट्स लेयर: "एप्लिकेशन ऑब्जेक्ट्स" कभी-कभी डेटाबेस में एक टेबल की सरल पंक्तियां होती हैं, लेकिन ज्यादातर बार वे कंपाउंड ऑब्जेक्ट्स होते हैं , और कुछ उच्च तर्क संलग्न होते हैं, इसलिए इस स्तर पर एआर ऑब्जेक्ट्स में समय का निवेश करना केवल स्पष्ट रूप से बेकार है , कीमती कोडर समय की बर्बादी, क्योंकि "वास्तविक मूल्य", उन वस्तुओं के "उच्च तर्क" को एआर वस्तुओं के शीर्ष पर लागू करने की आवश्यकता है, वैसे भी - एआर के साथ और बिना! और, उदाहरण के लिए, आप "लॉग एंट्री ऑब्जेक्ट्स" का अमूर्त उपयोग क्यों करना चाहेंगे? ऐप लॉजिक कोड उन्हें लिखते हैं, लेकिन क्या उन्हें अपडेट करने या हटाने की क्षमता होनी चाहिए? मूर्खतापूर्ण लगता है, और App::Log("I am a log message")कुछ परिमाण की तुलना में उपयोग करना आसान हैle=new LogEntry(); le.time=now(); le.text="I am a log message"; le.Insert(); । और उदाहरण के लिए: आपके आवेदन में लॉग दृश्य में "लॉग एंट्री ऑब्जेक्ट" का उपयोग करना 100, 1000 या 10000 लॉग लाइनों के लिए काम करेगा, लेकिन जितनी जल्दी या बाद में आपको अनुकूलन करना होगा - और मैं ज्यादातर मामलों में शर्त लगाता हूं, आप बस अपने ऐप लॉजिक में उस छोटे से सुंदर SQL सेलेक्ट स्टेटमेंट का उपयोग करें (जो AR विचार को पूरी तरह से तोड़ देता है ..), कठोर स्टेटमेंट में उस छोटे स्टेटमेंट को रैप करने के बजाय बहुत सारे कोड कोड के साथ AR आइडिया फ्रेम तय करते हैं और उसे छिपाते हैं। लिखने और / या AR कोड बनाने के साथ आपके द्वारा व्यर्थ किए गए समय को लॉग-प्रविष्टियों की सूची पढ़ने के लिए बहुत अधिक चतुर इंटरफ़ेस में निवेश किया जा सकता था (कई, कई तरीके, आकाश की सीमा है)।उनके आवेदन तर्क को महसूस करने के लिए जो कि उपयुक्त एप्लिकेशन को फिट करते हैं, और न कि मूर्खतापूर्ण तरीके से फिर से लागू करने के लिए, वह पहली नजर में अच्छा लगता है!

डी) एप्लिकेशन लॉजिक - ऑब्जेक्ट्स को इंटरैक्ट करने और बनाने, लॉजिक एंड लिस्टिंग (!) ऑफ एप्लिकेशन लॉजिक ऑब्जेक्ट्स (NO) के लॉजिक को लागू करता है, उन कार्यों को शायद ही कभी लॉजिक लॉजिक ऑब्जेक्ट्स में एंकर किया जाना चाहिए: क्या आपके डेस्क पर पेपर की शीट बताती है आप अपने कार्यालय में अन्य सभी शीट्स के नाम और स्थान रखते हैं। वस्तुओं को सूचीबद्ध करने के लिए "स्थिर" तरीकों को भूल जाते हैं, जो मूर्खतापूर्ण है, मानव के सोचने के तरीके को खराब करने के लिए बनाया गया एक बुरा समझौता [कुछ-नहीं-सभी-एआर-फ्रेमवर्क-जैसे -] एआर सोच)

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

खैर, माना जाता है कि यह सब व्यक्तिपरक है, लेकिन इसका मेरा अनुभव (रूबी ऑन रेल्स को बाहर रखा गया है, यह अलग हो सकता है, और मुझे उस दृष्टिकोण के साथ शून्य व्यावहारिक अनुभव है)।

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

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

तो, अंत में: इस कारण से मैं उस मूर्खतापूर्ण "सक्रिय रिकॉर्ड पैटर्न" से नफरत करता हूं, और जब भी संभव हो मैं इसे करूंगा और इससे बचूंगा।

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

यह पैटर्न सिंटैक्टिक शुगर के साथ लचीलेपन को बदल देता है!

इसके बारे में सोचें, AR आपके लिए किस समस्या का समाधान करता है?


1
यह एक डेटा सोर्स आर्किटेक्चरल पैटर्न है। शायद आपको फाउलर के पैटर्न ऑफ एंटरप्राइज एप्लीकेशन आर्किटेक्चर को पढ़ना चाहिए? वास्तव में पैटर्न / ओआरएम का उपयोग करने से पहले मेरे पास आपके विचार समान थे और यह पाया कि चीजों को कितना सरल बनाया।
मैटमेक्नाइट

1
मैं आपकी भावनाओं को साझा करता हूं। मुझे कुछ गलत गंध आती है जब एक फ्रेमवर्क यौगिक कुंजियों का समर्थन नहीं करता है .... मैंने SQLAlchemy से पहले किसी भी तरह के ORM से परहेज किया था, और हम अक्सर इसे SQL जनरेटर के रूप में निचले स्तर पर उपयोग करते हैं। यह डेटा मैपर को लागू करता है और बहुत लचीला है।
मार्को मरियानी

1
दो दिनों के बाद से मैं एक ऐसी परियोजना में शामिल हूं जो "अत्याधुनिक" ओआरएम का उपयोग करती है, शायद कार्यान्वयन अब परिपक्व हो गए हैं (कुछ वर्षों पहले मैंने जो काम किया था उसकी तुलना में)। शायद, मेरा मन बदल जाएगा, हम तीन महीनों में देखेंगे :-)
फ्रून्सी

2
परियोजना की जाती है, और आप जानते हैं कि क्या है? ओआरएम अभी भी बेकार है, मैंने मैपिंग की समस्याओं के साथ इतना समय बर्बाद किया है जो आसानी से "वस्तु-उन्मुख कोड" के एक गुच्छा के लिए एक संबंधपरक तरीके से व्यक्त किया जाता है। ठीक है, बेशक ओआरएम ने ओओपी + एसक्यूएल-मिक्स के एक प्रकार के प्रश्नों को व्यक्त करने के तरीके प्रदान किए हैं - बेशक एक ओओपी-जैसे सिंटैक्स में - लेकिन यह सिर्फ एसक्यूएल क्वेरी लिखने की तुलना में अधिक समय लेता है। अमूर्त रिसाव, OOP के शीर्ष पर "OOPSQLExperiment" - उपयोगकर्ताओं को OOP वाक्यविन्यास में SQL लिखने की अनुमति देने के लिए सबसे बुरा विचार था। नहीं, फिर कभी।
फ्रांसीसी

1
मैंने कई सालों तक सब कुछ के लिए कच्ची एसक्यूएल लिखी। रेल मुझे कभी-कभी निराश करती है और निष्क्रिय क्वेरी के लिए मैं लगभग आपके साथ सहमत हूं लेकिन यह वही है जो हल करता है: 1) यह डेटा को बचाने के लिए उपयुक्त रूप से कठिन बनाता है जो सत्यापन विफल हो जाता है। 2) ट्रैकिंग जो पिछले बनी हुई है के बाद से स्मृति में बदल गई। 3) बिंदु 2 का उपयोग करके before_saveरिकॉर्ड 4 के भीतर स्थिरता बनाए रखने के लिए समझदार कॉलबैक लिखने के after_commitलिए ) बाहरी सर्विस ट्रिगर्स के लिए हुक। 5) डीडीएल को बदलावों (माइग्रेशन) में व्यवस्थित करने के लिए एक अच्छा डीएसएल। (वहाँ अभी भी दर्द है, लेकिन कोई पैटर्न खराब नहीं है जब> 1 डेवलपर।)
एडमंडिश

6

कुछ संदेश मुझे भ्रमित कर रहे हैं। कुछ जवाब "ओआरएम" बनाम "एसक्यूएल" या कुछ इस तरह से जा रहे हैं।

तथ्य यह है कि एआर सिर्फ एक सरलीकरण प्रोग्रामिंग पैटर्न है जहां आप अपने डोमेन ऑब्जेक्ट्स का लाभ उठाते हैं ताकि वहां डेटाबेस एक्सेस कोड लिखा जा सके।

इन वस्तुओं में आमतौर पर व्यावसायिक गुण (बीन के गुण) और कुछ व्यवहार (ऐसी विधियां जो आमतौर पर इन गुणों पर काम करती हैं) होती हैं।

AR सिर्फ डेटाबेस से संबंधित कार्यों के लिए "इन डोमेन ऑब्जेक्ट्स में कुछ विधियाँ जोड़ें" कहता है।

और मुझे कहना है, मेरी राय और अनुभव से, कि मुझे पैटर्न पसंद नहीं है।

पहली नजर में यह बहुत अच्छा लग सकता है। स्प्रिंग रू जैसे कुछ आधुनिक जावा उपकरण इस पैटर्न का उपयोग करते हैं।

मेरे लिए, वास्तविक समस्या सिर्फ OOP की चिंता है। एआर पैटर्न आपको किसी तरह से अपनी वस्तु से लेकर अविनाशी वस्तुओं तक पर निर्भरता जोड़ने के लिए मजबूर करता है। ये infraestructure ऑब्जेक्ट डोमेन ऑब्जेक्ट को AR द्वारा सुझाए गए तरीकों के माध्यम से डेटाबेस को क्वेरी करने देते हैं।

मैंने हमेशा कहा है कि एक परियोजना की सफलता के लिए दो परतें महत्वपूर्ण हैं। सर्विस लेयर (जहाँ bussiness लॉजिक रहता है या किसी प्रकार की रीमोटिंग तकनीक के माध्यम से निर्यात किया जा सकता है, उदाहरण के लिए Web Services) और डोमेन लेयर। मेरी राय में, यदि हम AR पैटर्न को हल करने के लिए डोमेन लेयर ऑब्जेक्ट्स में कुछ निर्भरताएं (वास्तव में आवश्यक नहीं) जोड़ते हैं, तो हमारी डोमेन ऑब्जेक्ट्स अन्य परतों या (दुर्लभ) बाहरी अनुप्रयोगों के साथ साझा करना कठिन होगा।

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

एक और दृष्टिकोण। कल्पना करें कि हम अपनी वस्तुओं को संग्रहीत करने के लिए एक संबंधपरक डेटाबेस का उपयोग नहीं करते हैं। उदाहरण के लिए, एक NoSQL डेटाबेस में या सिर्फ XML फ़ाइलों में हमारे डोमेन ऑब्जेक्ट्स को स्टोर करने की कल्पना करें। क्या हम अपने डोमेन ऑब्जेक्ट में इन कार्यों को करने वाले तरीकों को लागू करेंगे? मुझे ऐसा नहीं लगता है (उदाहरण के लिए, एक्सएम के मामले में, हम अपने डोमेन ऑब्जेक्ट्स के लिए एक्सएमएल से संबंधित निर्भरता जोड़ेंगे ... सचमुच दुखद यह सोचते हैं)। फिर हमें डोमेन ऑब्जेक्ट्स में रिलेशनल DB विधियों को लागू करना होगा, जैसा कि Ar पैटर्न कहता है?

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


एसओ में आपका स्वागत है। आपकी टिप्पणी की सराहना की लेकिन इस सवाल को बंद नहीं किया गया क्योंकि NullUserException द्वारा 17 दिसंबर को 1:17 बजे
टोनी रेड

3

प्रश्न सक्रिय रिकॉर्ड डिज़ाइन पैटर्न के बारे में है। ऑरम टूल नहीं।

मूल सवाल रेल के साथ टैग किया गया है और ट्विटर पर संदर्भित है जो रूबी ऑन रेल्स में बनाया गया है। रेलर के भीतर ActiveRecord फ्रेमवर्क फाउलर के एक्टिव रिकॉर्ड डिजाइन पैटर्न का कार्यान्वयन है।


2

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

बेशक, अलग-अलग कार्यान्वयन इसे अलग तरीके से संभालेंगे। फिर भी, यह एक मुद्दा है।

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

मैं, मैं सक्रिय रिकॉर्ड खोदता हूं। :-)

HTH


2
"इसे सक्रिय रिकॉर्ड के साथ करने के लिए आवश्यक है कि आप सभी स्तंभों का चयन कर रहे हैं, लेकिन केवल सिटी का उपयोग कर रहे हैं।" यह वास्तव में एक चयन खंड निर्दिष्ट करने के लिए बेहद आसान है।
१०

1

मैं प्यार करता हूँ जिस तरह से SubSonic एक स्तंभ केवल बात करता है।
भी

DataBaseTable.GetList(DataBaseTable.Columns.ColumnYouWant)

, या:

Query q = DataBaseTable.CreateQuery()
               .WHERE(DataBaseTable.Columns.ColumnToFilterOn,value);
q.SelectList = DataBaseTable.Columns.ColumnYouWant;
q.Load();

लेकिन जब भी आलसी लोडिंग की बात आती है तो लिनक राजा ही होता है।


1

@BlaM: कभी-कभी मैंने ज्वाइन करने के परिणामस्वरूप एक सक्रिय रिकॉर्ड को लागू किया। हमेशा रिलेशन टेबल नहीं होना चाहिए <-> एक्टिव रिकॉर्ड। क्यों नहीं "एक सम्मिलित कथन का परिणाम" <-> सक्रिय रिकॉर्ड?


1

मैं एक डिज़ाइन पैटर्न के रूप में एक्टिव रिकॉर्ड के बारे में बात करने जा रहा हूं, मैंने ROR नहीं देखा है।

कुछ डेवलपर्स सक्रिय रिकॉर्ड से घृणा करते हैं, क्योंकि वे स्वच्छ और स्वच्छ कोड लिखने के बारे में स्मार्ट किताबें पढ़ते हैं, और ये पुस्तकें बताती हैं कि सक्रिय रिकॉर्ड एकल प्रतिक्रिया सिद्धांत का उल्लंघन करता है, डीडीडी नियम का उल्लंघन करता है कि डोमेन ऑब्जेक्ट लगातार अज्ञानी होना चाहिए, और इस तरह की पुस्तकों के लिए कई अन्य नियम। ।

सक्रिय रिकॉर्ड में दूसरी चीज डोमेन ऑब्जेक्ट डेटाबेस के साथ 1-टू -1 होती है, जिसे किसी तरह के सिस्टम (एन-टियर ज्यादातर) में सीमा माना जा सकता है।

बस सार बातें, मैं इस पैटर्न के वास्तविक कार्यान्वयन रेल पर रूबी नहीं देखा है।


0

मैं सक्रिय रिकॉर्ड्स के साथ जो समस्या देख रहा हूं, वह यह है कि यह हमेशा केवल एक तालिका के बारे में है । यह ठीक है, जब तक आप वास्तव में सिर्फ एक तालिका के साथ काम करते हैं, लेकिन जब आप ज्यादातर मामलों में डेटा के साथ काम करते हैं तो आप कहीं न कहीं किसी न किसी तरह से जुड़ेंगे।

हाँ, में शामिल होने के आम तौर पर भी बदतर है की तुलना में कोई सब पर शामिल होने जब यह प्रदर्शन की बात आती है, लेकिन शामिल होने के आम तौर पर की तुलना में बेहतर है "नकली" में शामिल होने के लिए पहले पूरे तालिका एक पढ़ने और फिर प्राप्त की गई जानकारी का उपयोग पढ़ सकते हैं और फिल्टर तालिका बी द्वारा


@ ब्लैक: आप बिल्कुल सही कह रहे हैं। हालाँकि मैंने कभी भी सक्रिय रिकॉर्ड का उपयोग नहीं किया है, मैंने अन्य बोल्ट-ऑन ORM सिस्टम (विशेष रूप से NHibernate) का उपयोग किया है, और मेरे पास दो बड़ी शिकायतें हैं: वस्तुओं को बनाने के लिए मूर्खतापूर्ण तरीके (यानी, .hbm.xml फ़ाइलें, जिनमें से प्रत्येक प्राप्त होती हैं। अपनी खुद की विधानसभा में संकलित) और प्रदर्शन सिर्फ लोडिंग ऑब्जेक्ट्स के लिए मारा (NHibernate कई सेकंड के लिए एक सिंगल-कोर प्रॉप को स्पाइक कर सकता है जो क्वेरी को निष्पादित करने के लिए कुछ भी नहीं लोड करता है, जब एक समान SQL क्वेरी लगभग कोई प्रसंस्करण नहीं लेता है)। निश्चित रूप से सक्रिय रिकॉर्ड के लिए विशिष्ट नहीं है, लेकिन मुझे सबसे अधिक ORM सिस्टम (और ORM जैसी प्रणालियां) लगती हैं
TheSmurf

Hbm.xml फ़ाइलों का उपयोग करने के लिए कई विकल्प हैं। उदाहरण के लिए देखें NHibernate.Mapping.Attributes और धाराप्रवाह nhibernate।
मौरिसियो शेफ़र

ऑब्जेक्ट क्रिएशन परफॉर्मेंस के बारे में, मैं कभी भी इस तरह की परफेक्ट प्रॉब्लम में नहीं आया, आप प्रोफाइलर से जांच कर सकते हैं।
मौरिसियो शेफ़र

@ मूस: एक प्रोफाइलर की जरूरत नहीं है। यह एक काफी प्रसिद्ध मुद्दा है। पता नहीं कि यह नवीनतम संस्करण पर लागू होता है (जो मैं अभी तक अपनी नौकरी में उपयोग नहीं कर रहा हूं)। ayende.com/Blog/archive/2007/10/26/…
TheSmurf

4
का उपयोग करना: joins या: इसमें IE ग्राहक शामिल हैं। हम (: सभी,: = =: संपर्क,: स्थितियां => "सक्रिय = 1") SQL जॉइन करेंगे, न कि पूर्ण तालिका स्कैन।
तिलेंडोर

0

ActiveRecord के साथ समस्या यह है कि आपके द्वारा स्वचालित रूप से उत्पन्न क्वेरीज़ प्रदर्शन समस्याओं का कारण बन सकती हैं।

आप प्रश्नों को अनुकूलित करने के लिए कुछ अनपेक्षित चालें करते हैं जो आपको आश्चर्यचकित करते हैं कि अगर यह पहली बार हाथ से क्वेरी लिखने के लिए अधिक प्रभावी होता।


0

हालाँकि SQL ऑप्टिमाइज़ेशन के बारे में अन्य सभी टिप्पणियां निश्चित रूप से मान्य हैं, लेकिन सक्रिय रिकॉर्ड पैटर्न के साथ मेरी मुख्य शिकायत यह है कि यह आमतौर पर प्रतिबाधा बेमेल की ओर जाता है । मुझे अपने डोमेन को साफ-सुथरा और ठीक से रखना पसंद है, जिसे सक्रिय रिकॉर्ड पैटर्न आमतौर पर करने की सभी आशाओं को नष्ट कर देता है।


ActiveRecord वास्तव में एक संबंधपरक स्कीमा के खिलाफ आपको OO फैशन में कोड देकर प्रतिबाधा बेमेल समस्या को हल करता है।
मौरिसियो शेफ़र

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

एक संबंधपरक स्कीमा के लिए विरासत के नक्शे के तीन ज्ञात तरीके हैं। Ref: Castleproject.org/ActiveRecord/documentation/trunk/usersguide/…
मौरिसियो शेफ़र

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

मैं सिर्फ संदर्भ के रूप में कैसल उद्धृत कर रहा था। RoR के ActiveRecord ने एकल तालिका वंशानुक्रम केवल ( martinfowler.com/eaaatalog/singleTableInheritance.html ) लागू किया है, लेकिन अन्य रणनीतियों पर विचार किया जा रहा है ( blog.zerosum.org/2007/2/16/… )
मौरिसियो शेफ़र

0

कई बहुरूपियों के संबंध में कई करने की कोशिश करें। इतना आसान नही। खासकर जब आप एसटीआई का उपयोग नहीं कर रहे हैं।

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