कुछ वर्षों के बाद, यह सवाल अभी भी महत्वपूर्ण है ...
मेरे लिए सरल नियम-ऑफ-थंब: यदि यह एक तार्किक बाधा या सर्वव्यापक अभिव्यक्ति (एकल कथन) है, तो इसे डेटाबेस में रखें (हाँ, विदेशी कुंजी और चेक की कमी व्यावसायिक तर्क है, भी!)। यदि यह प्रक्रियात्मक है, जिसमें लूप और सशर्त शाखाएं शामिल हैं (और वास्तव में इसे एक अभिव्यक्ति में नहीं बदला जा सकता है), इसे कोड में रखें।
कचरा डंप DBs से बचें
एप्लिकेशन कोड में वास्तव में सभी व्यावसायिक तर्क रखने का प्रयास संभवतया (रिलेशनल) डेटाबेस को कचरे के डंप में गिरा देगा, जहां रिलेशनल डिज़ाइन ज्यादातर पूरी तरह से छोड़ा गया है, जहां डेटा में कोई असंगत स्थिति हो सकती है, और सामान्यीकरण गायब है (अक्सर मुख्य रूप से एक्सएमएल, JSON) , सीएसवी आदि ट्रैशबिन कॉलम)।
इस तरह के एप्लिकेशन-ओनली लॉजिक शायद NoSQL के उदय के मुख्य कारणों में से एक है - निश्चित रूप से नकारात्मक पक्ष के साथ कि आवेदन को सभी तर्कों का ध्यान रखना होगा, जो दशकों से संबंधपरक DB में बनाया गया है। हालांकि, NoSQL डेटाबेस इस तरह के डेटा हैंडलिंग के लिए अधिक उपयुक्त हैं, उदाहरण के लिए, डेटा दस्तावेज़ अपने भीतर एक अंतर्निहित "संबंधपरक अखंडता" बनाए रखते हैं। संबंधपरक डीबी के लिए, यह बस दुरुपयोग है, जिससे कभी अधिक परेशानी होती है।
प्रक्रियात्मक कोड के बजाय अभिव्यक्तियाँ (सेट-आधारित)
सर्वोत्तम स्थिति में, प्रत्येक डेटा क्वेरी या ऑपरेशन को प्रक्रियात्मक कोड के बजाय एक अभिव्यक्ति के रूप में कोडित किया जाना चाहिए। इसका एक बड़ा समर्थन तब है जब प्रोग्रामिंग लैंग्वेज अभिव्यक्ति का समर्थन करती हैं, जैसे कि .NET वर्ल्ड में LINQ (दुर्भाग्य से, केवल वर्तमान में प्रश्न, कोई हेरफेर नहीं)। संबंधपरक डीबी पक्ष पर, यह लंबे समय से सिखाया जाता है, प्रक्रियात्मक कर्सर छोरों पर SQL कथन अभिव्यक्तियों को प्राथमिकता देना। तो DB ऑप्टिमाइज़ कर सकता है, ऑपरेशन को समानांतर कर सकता है, या जो भी उपयोगी हो सकता है।
DB डेटा अखंडता तंत्र का उपयोग करें
जब विदेशी कुंजी और चेक बाधाओं के साथ RDBMS की बात आती है, तो गणना किए गए कॉलम, संभवतः ट्रिगर और विचार, यह डेटाबेस में बुनियादी व्यापार तर्क को संग्रहीत करने का स्थान है। उचित सामान्यीकरण डेटा की अद्वितीय और विशिष्ट आवृत्ति सुनिश्चित करने के लिए, डेटा अखंडता को बनाए रखने में मदद करता है। यहां तक कि अगर आपको इसे कोड और DB में डुप्लिकेट करना है, तो डेटा अखंडता के इन बुनियादी तंत्रों को छोड़ा नहीं जाना चाहिए!
संग्रहित प्रक्रियाएं?
संग्रहीत कार्यविधियाँ आजकल शायद ही कभी आवश्यक होती हैं, क्योंकि डेटाबेस SQL के लिए संकलित निष्पादन योजनाओं को रखते हैं और उन्हें फिर से उपयोग करते हैं जब एक ही क्वेरी फिर से आती है, केवल विभिन्न पैरामीटर्स के साथ। इसलिए एसपी के लिए प्रीकंपाइल तर्क अब मान्य नहीं है। एप्लिकेशन या ORM में SQL क्वेरी को ऑटो-जेनरेट या स्टोर कर सकते हैं, जो कि ज्यादातर समय पहले से तैयार क्वेरी प्लान पाएंगे। SQL एक अभिव्यक्ति भाषा है, जब तक आप स्पष्ट रूप से प्रक्रियात्मक तत्वों का उपयोग नहीं करते हैं। तो, सबसे अच्छी स्थिति में, आप कोड अभिव्यक्तियों का उपयोग करते हैं जिन्हें SQL में अनुवादित किया जा सकता है।
जबकि ORM जनरेट किया गया, SQL सहित एप्लिकेशन पक्ष, डेटाबेस के अंदर नहीं है, संग्रहीत प्रक्रियाओं के विपरीत, मैं अभी भी इसे डेटाबेस कोड के रूप में गिनता हूं। क्योंकि इसके लिए अभी भी एसक्यूएल और डेटाबेस ज्ञान (सबसे सरल सीआरयूडी को छोड़कर) की आवश्यकता होती है, और, यदि ठीक से लागू किया जाता है, तो आमतौर पर सी # या जावा जैसी प्रोग्रामिंग भाषाओं के साथ बनाई गई प्रक्रियात्मक कोड की तुलना में बहुत भिन्न होता है।