प्रति डेटाबेस तालिका मॉडल?


11

मैं कोडिग्निटर का उपयोग कर रहा हूं, और खुद को ऐसी ही स्थिति में पाया है जहां मैंने मॉडल के तरीकों को दोहराया है। मैं एक मॉडल प्रति नियंत्रक बना रहा हूं। लेकिन मैं एक डेटाबेस प्रति डेटाबेस तालिका बनाना अच्छा अभ्यास माना जाएगा? इस तरह तरीके दो बार नहीं लिखे गए हैं।

मॉडल प्रति नियंत्रक या कई छोटे मॉडल के बजाय जो साझा किए जाते हैं।

उदाहरण अगर मेरे पास एक मॉडल विधि get_user ($ user_id) है तो मैं इसे users_models.php पर लिख सकता हूं ...

डाउनसाइड्स में से एक मैं यह देख रहा हूं कि मुझे केवल नियंत्रणीय_मॉडल .php के बजाय कई मॉडलों को कॉल करना पड़ सकता है।

कई मॉडलों को लोड करना जहां नियंत्रक से कई तरीकों का उपयोग नहीं किया जा सकता है, प्रदर्शन और गति को प्रभावित करते हैं? इससे निपटने का सबसे अच्छा तरीका क्या हो सकता है?

नोट: इसी तरह के प्रश्न हैं, लेकिन वे प्रति डेटाबेस तालिका मॉडल के आधार को कवर नहीं करते हैं।

जवाबों:


8

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


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

1
एक उदाहरण के रूप में, "एनीमिक मॉडल" एसओएलआईडी अनुपालन है - क्या वास्तव में एक उद्देश्य (स्टोर डेटा) के साथ एक वस्तु होना बुरा है? जबकि मैं बहुत सारी चीजों का सम्मान करता हूं जो श्री फाउलर कहते हैं, यह एक बकवास था।
टी। सर

7

सामान्य तौर पर आपको अपने मॉडलों को प्रति तालिका या प्रति नियंत्रक नहीं बल्कि प्रति व्यावसायिक वस्तु के अनुसार बनाना चाहिए। कभी-कभी यह शायद आपके टेबल संरचना या आपके नियंत्रकों के साथ 1: 1 संबंध होता है, लेकिन आवश्यक नहीं।

आपके उदाहरण में आपके पास एक users_modelवर्ग हो सकता है जिसे कई नियंत्रकों से कहा जाता है। यह ठीक है और कभी-कभी वांछनीय भी है। हालाँकि ज्यादातर मामलों में users_modelकक्षा को कई तालिकाओं से अपना डेटा मिलेगा।
उदाहरण के लिए, वर्ग last_login_dateकी संपत्ति एक अलग तालिका से प्राप्त की जा users_modelसकती है ( नहीं होनी चाहिए ) जिसका user_auditमुख्य usersतालिका के साथ एक-से-कई संबंध हैं ।

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


3

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

ऑब्जेक्ट / रिलेशनल मैपिंग लेयर का उपयोग करना उपयोगी होता है, इसलिए आपके डोमेन मॉडल में डेटा स्कीम लेयर की पुनरावृत्ति कॉल की आवश्यकता के बिना डेटाबेस स्कीमा के समान ही संबंध होते हैं। की जाँच करें सुवक्ता एक उदाहरण के रूप PHP के लिए। स्कीमा और डोमेन मॉडल दोनों को व्यावसायिक प्रक्रियाओं का समर्थन करने के लिए डिज़ाइन किया जाना चाहिए।

यह मार्जन वेनमा के उत्तर के पहले भाग की ओर जाता है:

मैं कहता हूं कि प्रति तालिका एक मॉडल सिर्फ एक वर्ग संरचना में आपके डेटाबेस को फिर से बना रहा है। इसे एनीमिक मॉडल के रूप में जाना जाता है और इसे एक एंटी-पैटर्न माना जाता है।

एक एनीमिक डोमेन मॉडल एक विरोधी पैटर्न है। वेनेमा का सुझाव है कि एक "मॉडल प्रति तालिका" को "अपने डेटाबेस को फिर से बनाना" के रूप में देखा जा सकता है, हालांकि यह कहना बिल्कुल गलत है कि यह एक एनीमिक डोमेन मॉडल है।

मार्टिन फॉलर से:

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

(जोर, मेरा)

एनीमिक डोमेन मॉडल का मुख्य कारक डोमेन मॉडल कक्षाओं पर व्यवहार या विधियों की कमी है।

ऐसा इसलिए है क्योंकि कक्षाओं का उद्देश्य डेटा और व्यवहार दोनों हैं। यदि आप अपने मॉडलों को एक ही टेबल पर सीमित रखते हैं, तो आप कोड (व्यवहार) को कहां रखते हैं, जिसमें कई तालिकाओं से डेटा और व्यवहार से निपटने की आवश्यकता है?

फिर से, आप अपने डोमेन मॉडल में व्यवहार कर सकते हैं, और करना चाहिए, भले ही वे केवल एक तालिका में मैप करें। व्यवहार जो कई तालिकाओं को प्रभावित करता है वास्तव में कई वस्तुओं को प्रभावित करता है जो कई तालिकाओं को मैप करने के लिए होता है। डोमेन ड्रिवेन डिज़ाइन ठीक उसी समस्या के लिए एक दृष्टिकोण है जिसका उल्लेख वेनेमा ने किया: "आपने कोड (व्यवहार) को कहां रखा है जिसमें कई तालिकाओं से डेटा और व्यवहार से निपटने की आवश्यकता है?"

और इसका जवाब एक एग्रिगेट रूट है । मार्टिन फाउलर कहते हैं:

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

(जोर, मेरा)

एक "डोमेन ऑब्जेक्ट्स का क्लस्टर" को "डोमेन मॉडल के रूप में भी देखा जा सकता है जो कई टेबल पर मैप करता है।" व्यवहार जो कई तालिकाओं को प्रभावित करता है, उसे एग्लगेट रूट पर परिभाषित किया जाना चाहिए - एक ऐसा वर्ग जो "तालिका" को अलग करता है जो कई तालिकाओं या वस्तुओं को प्रभावित करता है:

फिर से, मार्टिन फाउलर से:

एक समुच्चय में अक्सर साधारण क्षेत्रों के साथ, पारस्परिक संग्रह शामिल होंगे।

ओपी के मूल प्रश्न का उत्तर देने के लिए:

... एक डेटाबेस प्रति डेटाबेस तालिका बनाना अच्छा अभ्यास माना जाएगा? इस तरह तरीके दो बार नहीं लिखे गए हैं।

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

नियंत्रक प्रति एक मॉडल अच्छा अभ्यास नहीं होगा, हालांकि वहाँ एक दृश्य मॉडल कहा जाता मॉडल की भिन्नता यह है कि करता है नियंत्रक परत में फिट। एक दृश्य मॉडल एक निश्चित प्रकार के प्रदर्शन को फिट करने के लिए डोमेन मॉडल का पुनर्गठन है, यह एक वेब पेज या GUI अनुप्रयोग में रूप है।

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