डेटा सत्यापन के लिए एक ORM समर्थन के लिए, डेटाबेस में भी बाधाओं को लागू किया जाना चाहिए?


13

मैंने हमेशा अपने (ActiveRecord) मॉडल के अलावा डेटाबेस स्तर पर बाधाओं को लागू किया है। लेकिन मैं सोच रहा था कि क्या यह वास्तव में आवश्यक है?

थोड़ी पृष्ठभूमि

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

संभावित लाभ अगर मैं db, imo में बाधाओं को छोड़ता हूं -

  • डेटाबेस को माइग्रेट किए बिना, मॉडल में एक सत्यापन नियम को संशोधित कर सकता है।
  • परीक्षण में सत्यापन को छोड़ सकते हैं।

संभावित नुकसान?

यदि यह संभव है कि ORM सत्यापन विफल हो जाता है या बाईपास हो जाता है, तो भी, डेटाबेस बाधाओं की जाँच नहीं करता है।

तुम क्या सोचते हो?

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


3
यदि आपके ओआरएम (आपके ओआरएम के बिना अन्य ऐप, या उपयोगकर्ताओं द्वारा बदतर, प्रत्यक्ष डीबी पहुंच) के बिना आपके डेटाबेस में डेटा को नियमित रूप से संशोधित किया जा सकता है, तो सत्यापन को डेटाबेस में होना चाहिए।
मार्जन वेनेमा

जवाबों:


16

आपका मार्गदर्शक सिद्धांत खुद को दोहराना नहीं होना चाहिए :

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

ORM अनिवार्य रूप से एक अतिरिक्त लेयर है (या यदि आप चाहें तो टियर), आपके एप्लिकेशन और आपके डेटा स्टोरेज (s) के बीच में आराम से बैठे हैं। आपकी अड़चनें एक ही स्थान पर होनी चाहिए, और एक ही जगह हो, यह ओआरएम या डेटा स्टोरेज हो, अन्यथा बहुत जल्द आप उनमें से विभिन्न संस्करणों को बनाए रखेंगे। आप वास्तव में ऐसा नहीं करना चाहते हैं।

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

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

विफलताओं

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

किसी और चीज के लिए ओआरएम को दरकिनार करना

इसके अलावा एक अच्छा विचार नहीं है। हालाँकि, यह कई कारणों से हो सकता है:

  1. ओआरएम पेश किए जाने से पहले बनाए गए अनुप्रयोग के विरासत भागों।

    यही कारण है कि एक कठिन एक है, और वास्तव में स्थिति मैं के साथ काम कर रहा हूँ है अभी , "रखरखाव नरक" की इसलिए मेरी लगातार दोहराने। या तो आप गैर ORM भागों को बनाए रखते हैं, या आप उन्हें ORM का उपयोग करने के लिए फिर से लिखते हैं। दूसरा विकल्प हो सकता है और अधिक समझ में शुरू में बनाने, लेकिन यह एक निर्णय है कि पूरी तरह से वास्तव में आपके आवेदन के उन हिस्सों क्या कर रहे हैं पर आधारित है, और कैसे मूल्यवान एक बार फिर से लिखने लंबे समय में किया जाएगा है।

    एक बुरी तरह से डिजाइन 2 * 10 ^ 8 पंक्तियों में एक कुंजी बदलने की कोशिश करें MySQL टेबल (डाउनटाइम के बिना) और आप समझ जाएंगे कि मैं कहां से आ रहा हूं।

  2. आवेदन के गैर विरासत भागों जो सीधे डेटा भंडारण से बात करने की जरूरत है:

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

टिप्पणियाँ

डेटा अखंडता के बिंदु से, डेटाबेस पर होना चाहिए, और आवेदन पर होना चाहिए। क्या होगा यदि आपका एप्लिकेशन वेब और डेस्कटॉप एप्लिकेशन, या मोबाइल ऐप, या वेबसेवा से एक्सेस किया गया हो? - लुइज़ दामिम

यह वह जगह है जहाँ एक अतिरिक्त परत जोड़ना बेहद मददगार होगा, और अगर हम एक वेब एप्लिकेशन के बारे में बात कर रहे हैं जो मैं एक REST API के साथ जाना चाहूंगा। इसके लिए एक अति सरल डिजाइन होगा:

यहाँ छवि विवरण दर्ज करें

ORM API और डेटा स्टोरेज के बीच में बैठा होगा, और API के पीछे सब कुछ (इसमें शामिल है) विभिन्न अनुप्रयोगों में से एक एकल इकाई माना जाएगा।


आम तौर पर आप अपने ओआरएम में एक स्कीमा को परिभाषित करते हैं जो तब डेटाबेस में मिरर किया जाता है ताकि आपके पास आश्वासन का दूसरा स्तर हो।
जोश के

2
@ जोश आप आश्वासन के दूसरे स्तर पर कहते हैं, मैं कहता हूं कि रखरखाव नरक है। यह कहते हुए कि आप सही नहीं हैं, हालांकि ...
यानाइस

समझ में आता है। मैं अब इस मार्ग का अनुसरण कर रहा हूं। धन्यवाद!
ना

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

1
डेटा अखंडता के बिंदु से, डेटाबेस पर होना चाहिए, और आवेदन पर होना चाहिए। क्या होगा यदि आपका एप्लिकेशन वेब और डेस्कटॉप एप्लिकेशन, या मोबाइल ऐप, या वेबसेवा से एक्सेस किया गया हो?
लुइज़ डेम

20

यह वास्तव में जवाब देने के लिए एक बहुत मुश्किल सवाल है और मैंने इसे एक बहुत ही विवादास्पद विषय पाया है।

जैसा कि यानिस रिज़ोस ने अपने जवाब में कहा, डेटाबेस और ORM परत दोनों में अड़चन का तर्क DRY का उल्लंघन करता हुआ प्रतीत होगा, जिससे "रखरखाव बुरे सपने, खराब तथ्य और तार्किक विरोधाभास हो सकता है"।

हालाँकि, डेटाबेस से बाधा तर्क को हटाना और इसे केवल ORM परत पर रखना यदि आपके पास निम्न में से कोई भी कार्य नहीं है:

  1. मैनुअल DB अद्यतन (वे हर कंपनी में होने लगते हैं)

  2. डीबी अपडेट एक अन्य प्रणाली से होता है जो हमेशा ओआरएम बाधा तर्क को आसानी से साझा नहीं कर सकती (उदा। एक पर्ल स्क्रिप्ट जो रूटीन कार्य करती है जब ओआरएम परत हाइबरनेट में लागू होती है और दिन में गतिविधि के लिए जावा एप्लिकेशन द्वारा उपयोग की जाती है)

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

आपका अंतिम विकल्प है डीबी बाधाओं (या, वास्तव में ... इसके विपरीत) से ओआरएम (और किसी अन्य प्रणाली) में बाधाओं के निर्माण स्वचालित करना है । यद्यपि आप अंततः बाधाओं के दो या अधिक कार्यान्वयन के साथ समाप्त हो जाएंगे, यह DRY सिद्धांत का उल्लंघन नहीं होगा जैसा कि "द प्रोगैमैटिक प्रोग्रामर" में वर्णित है, क्योंकि वे DRY उल्लंघन से बचने के लिए कोड पीढ़ी के उपयोग की सलाह देते हैं। बेशक, यह इतना आसान नहीं है क्योंकि, उदाहरण के लिए, एक DB बाधा के लिए हर परिवर्तन आपके सभी अनुप्रयोगों को फिर से बनाने और फिर से तैनात करने के लिए मजबूर कर सकता है जो इसका उपयोग करते हैं (स्वचालित करने के लिए तुच्छ नहीं)।

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


2
बस काम बंद हो गया और आप जो पोस्ट कर रहे हैं, उसके जवाब को कमोबेश विस्तार देने की सोच रहे थे। अच्छा उत्तर!
यानि

3

मैं निश्चित रूप से अपने डिफ़ॉल्ट विकल्प के रूप में डेटाबेस में बाधाएं जोड़ूंगा। ऐसा इसलिए है क्योंकि एक उद्यम डेटा के लिए राजा है और डेटा गुणवत्ता सर्वोपरि है। @ यानिस रिज़ोस ने DRY सिद्धांत को चर्चा में लाया। वैसे एक और सिद्धांत है डिफेंस इन डेप्थ। डेटा के लिए मैं इस सिद्धांत का उपयोग करूंगा।

मैंने वास्तविक उद्यमों में काम किया है जहां डीबी ने 30 साल पहले बनाए गए डेटा को बनाया है। यह अभी भी COBOL एप्लिकेशन और अब एक .Net एप्लीकेशन द्वारा एक्सेस किया जाता है। 10 साल के समय में यह एक विक्रेता ऐप हो सकता है, जो जानता है। विलय हुआ और एसक्यूएल का उपयोग करके डेटा की लाखों पंक्तियों को दूसरी कंपनी से इस डेटाबेस में परिवर्तित कर दिया गया। कोई भी ओआरएम ऐसा नहीं कर सकता। लब्बोलुआब यह है कि डेटा बना रहता है, एप्लिकेशन बदल जाते हैं, जिस तरह से डेटा जेनरेट होता है। तो क्यों न डाटा करप्शन की संभावना को कम किया जाए?


2

मुझे लगता है कि आप दोनों कुछ हद तक करते हैं।

  • प्राथमिक बाधाओं को ओआरएम में रहना चाहिए - प्रोग्रामिंग भाषाएं बहुत अधिक लचीली हैं, आवश्यकताओं को बदलने पर परीक्षण करना आसान है और ट्विक करना आसान है; डीडीएल फिक्स के बारे में कम से कम चिंता करने की जरूरत नहीं है। और आप आम तौर पर डेटा प्रतिगमन मुद्दों का परीक्षण करने के लिए कड़ी मेहनत से बचते हैं।

  • कुछ बहुत कठिन और तेज़ बाधाओं को भी डेटाबेस में रहना चाहिए। मैं उदाहरण के लिए गैर-अशक्त नामों के बारे में बात नहीं कर रहा हूँ। मैं संदर्भात्मक अखंडता जैसी चीजों के बारे में बात कर रहा हूं या कुछ बिल्कुल महत्वपूर्ण पहचानकर्ताओं की आवश्यकता है। संरचनात्मक आवश्यकताओं ताकि आपके कोड को "क्या होगा यदि ऑर्डर में एक गैर-मौजूद उत्पाद है" से निपटने की आवश्यकता नहीं है।


1

डेटाबेस IMO ही एक ऐसी जगह है जहाँ DRY का उल्लंघन किया जा सकता है, क्योंकि अगर कुछ आपके ORM को दरकिनार कर देता है और उसका डेटा ख़राब हो जाता है, तो यह है। खेल खत्म। भ्रष्ट डेटा होने से हत्या को झटका लगता है।


केवल डेटाबेस? मैं कई मामलों के बारे में सोच सकता हूं, जहां डेटा से जुड़ा व्यवहार कई परतों (तार्किक या भौतिक) पर मौजूद होना चाहिए, भले ही डेटा बिल्कुल भी जारी न हो। कभी-कभी एकल स्रोत कोड होना और तैनात डीएलई के लिए "दोहराव" को कम करना संभव है।
18:30 पर mike30
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.