कोड में स्थिर डेटाबेस डेटा को संदर्भित करने का सबसे अच्छा तरीका है?


24

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

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

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

कोड में इस स्थिर डेटा को संदर्भित करने का सबसे अच्छा तरीका क्या है? क्यूं कर?

  1. अपने कोड में विवरणों को हार्ड-कोड करें। जरूरत पड़ने पर डेटाबेस से SalesAreaId देखने के लिए इसका उपयोग करें।
  2. अपने कोड में आईडी को हार्ड-कोड करें। जरूरत पड़ने पर SalesAreaDescription देखने के लिए इसका उपयोग करें।
  3. प्रत्येक उद्देश्य के लिए तालिका में एक स्तंभ जोड़ें, उदाहरण के लिए "IsDefaultOnProductLaunchScreen" कॉलम और इतने पर (इनमें से बहुत सारे हो सकते हैं)।
  4. कुछ और।

स्थैतिक डेटाबेस डेटा के साथ काम करते समय मुझे कोई अन्य विशेष विचार करना चाहिए? उदाहरण के लिए, इन तालिकाओं को एक विशेष नाम देना?


1
संभावित डुप्लिकेट: programmers.stackexchange.com/questions/304169/… मेरा मानना ​​है कि उस (एक) पर दिए गए जवाब इस मुद्दे के दिल को थोड़ा बेहतर IMO
जोकूल

जवाबों:


14

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

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


कैशिंग बेशक अच्छा है, लेकिन आप इन मूल्यों को कैसे अपडेट करते हैं? संभवतः एक आवेदन पुनः आरंभ, या कैश अमान्य रणनीति के कुछ प्रकार?
स्टीव

1
@ हां, बिल्कुल। आवेदन पर निर्भर करता है। बार-बार शुरू होने वाली चीज के लिए रिस्टार्ट अच्छा है। लंबे समय तक चलने वाले एप्लिकेशन के लिए, शायद धीमे समय के दौरान दिन में एक बार कैश लोड करना। मेरा सवाल यह होगा कि उस परिदृश्य के बारे में क्या है जहाँ एप्लिकेशन बहुत कम समय तक चलता है। जैसे, शायद एक PHP स्क्रिप्ट या कुछ और परिचित।
टाइलेरमैक

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

@JamesAnderson: आवेदन साधन में कैशिंग वहाँ केवल जाएगा कभी डेटाबेस के लिए एक कॉल हो। हां, डेटाबेस के अपने कैश होंगे लेकिन जिन्हें आपके एप्लिकेशन के नियंत्रण से बाहर की घटनाओं से अमान्य / ताज़ा किया जा सकता है, और आपके पास अभी भी डेटाबेस से एक कनेक्शन होना चाहिए और उस डेटा को प्राप्त करने के लिए एक क्वेरी करना होगा (और आशा है कि यह अंदर है db का कैश)। यह वास्तव में एक सरल इन-एप्लिकेशन कैश को लागू करना उतना मुश्किल नहीं है।
FrustratedWithFormsDesigner 16

7

डीबी या हार्ड कोडिंग का एक विकल्प स्टार्ट-अप समय पर पढ़ी गई एक कॉन्फ़िगर फ़ाइल का उपयोग करना है। आप इस डेटा को अपने कोड के भीतर केवल पढ़ने के लिए संरचना में संग्रहीत कर सकते हैं।

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


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

प्रश्न ने यह नहीं कहा कि यह एक आवश्यकता थी, केवल एक परिदृश्य। यदि इसकी आवश्यकता नहीं है, तो कॉन्फ़िगर फ़ाइल दृष्टिकोण अच्छी तरह से काम करता है।
स्टीव

आप सही हैं, मैं पर्याप्त स्पष्ट नहीं था। लेकिन मुझे खुशी है ... क्योंकि मैंने आपके जवाब से कुछ सीखा है। मैं इस दृष्टिकोण से पहले कभी नहीं आया हूँ।
क्रमी ने

3

यदि डेटा आपके DB में मौजूदा डेटा से संबंधित है, तो संभवत: इसे DB में जोड़ने के लिए उतना ही कुशल है जितना कि इसे कोड में जोड़ना है। यदि यह नहीं होता है, तो मुझे आमतौर पर "उस बुलेट को एक बार लेने" का लालच होता है, और इसे पहली बार बदलने तक कोड में डाल दिया जाता है।

अक्सर हम जो सोचते हैं वह स्थिर नहीं होगा और जब ऐसा होता है, तो आप बदलाव से गुजरने के लिए कोड के रिलीज होने का इंतजार नहीं करना चाहते। जैसे ही एक बार ऐसा होता है, इसे डेटाबेस में रखें और आगे के अपडेट के लिए एक व्यवस्थापक पृष्ठ लिखें।

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


"अक्सर हम जो सोचते हैं कि स्थैतिक हो जाएगा नहीं" - इतना सच है।
क्रामि ने मोनिका

3

सिर्फ हार्ड कोड ही सब कुछ क्यों नहीं? मुख्य समस्या जो मैंने हमेशा की है , वह अनुप्रयोग कोड में DB से स्थिर मानों को संदर्भित कर रहा है । यदि आप सीधे ड्रॉप-डाउन सूची या स्थैतिक मूल्यों से बाहर कुछ बना रहे हैं तो यह एक बात है, लेकिन क्या होगा यदि कुछ एप्लिकेशन लॉजिक डीबी से प्राप्त मूल्यों पर निर्भर करता है?

एक साधारण ऐप में वर्तमान में मेरे पास सामग्री के टुकड़ों के लिए राज्यों को संपादित करने की एक सूची है: ड्राफ्ट, प्रकाशित, संग्रहीत।

सामग्री आइटम को अलग-अलग तरीके से इलाज करने की आवश्यकता होती है, जिसके आधार पर वे किस राज्य में हैं। यदि मैं क्रमशः डीबी, मान 1, 2, 3 के साथ इस राज्य डेटा को रखने के लिए था, तो अगर कुछ ड्रॉफ्ट में है तो मैं कैसे जांच करूंगा? राज्य?

if (content.State == 1)
या
if (content.State == "Draft")?

मैं सिर्फ मुश्किल कोडित मूल्यों है!
अगर आप कैश / हैश टेबल का उपयोग करते हैं तो एक ही बात: आपको अभी भी अपने डेटा को देखने के लिए एक कुंजी के रूप में अपने कोड में लिखे कुछ मूल्य का उपयोग करना होगा।

हार्ड-कोडिंग aproach के नुकसान क्या हैं?


नुकसान के रूप में pdr ने कहा है, "अक्सर हम जो सोचते हैं कि स्थिर हो जाएगा न कि"।
टाइलेरमैक

2
लेकिन यदि आप वास्तव में कोड में स्थिर डेटा मानों का संदर्भ दे रहे हैं, तो आप इसे ऐप को तोड़े बिना डेटाबेस में नहीं बदल सकते। यह सुनिश्चित करने के लिए कि यह डेटा किसके लिए उपयोग किया जा रहा है, इस पर निर्भर करता है: जैसा कि मैंने ऊपर उल्लेख किया है, अगर यह सिर्फ एक यूआई तत्व को पॉप्युलेट कर रहा है ताकि एक उपयोगकर्ता एक मान का चयन कर सके और उसे सीधे दूसरी तालिका में एक रिकॉर्ड के हिस्से के रूप में DB में वापस पाइप किया जाए , फिर DB में स्थैतिक डेटा ऐप कोड से स्वतंत्र रूप से बदल सकता है। मुझे पूरा यकीन है कि स्थिति @pdr के बारे में बात कर रही है: एक एकल आइटम के रूप में स्थैतिक डेटा के सेट को संभालने वाला ऐप।
डेव

2

FrustratedWithFormsDesigner ने जो कहा, उसके समान, यह आमतौर पर कैश के साथ किया जाता है, क्योंकि इसका मतलब है कि आपको केवल एक बार स्थैतिक डेटा लोड करना होगा, लेकिन यह OAOO पैटर्न का अनुसरण करता है, जिसका अर्थ है कि हम डेटा को दो स्थानों (डेटाबेस और में) में परिभाषित नहीं कर रहे हैं तुम्हारा कोड)।

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


एक बार और केवल एक बार। लेकिन अलग-अलग पंक्तियों के इलाज के बारे में क्या?
क्रामि ने मोनिका

1
@Kramii - आप गणन वर्गों की तरह कुछ का उपयोग कर सकते हैं । यदि मेटाडेटा केवल आपके कार्यक्रम से संबंधित है, तो मैं IsDefaultOn...इकाई में एक संपत्ति में व्यावसायिक तर्क ( ) डालूंगा । क्या यह एक इकाई के लिए सही है। यह आपको पूरे संग्रह को देखते हुए, उस इकाई को खोजने की अनुमति देगा। या आप एक नियंत्रक वर्ग का उपयोग कर सकते हैं जो आपको एक विधि कॉल के साथ उपयुक्त इकाई प्रदान करेगा।
स्कॉट व्हिटलॉक

2

यह इसके बदतर समय से पहले का अनुकूलन है।

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

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

यहाँ जाने के लिए केवल दो रास्ते हैं: -

इसे डेटाबेस में संग्रहीत करें और "सामान्य" sql के साथ डेटा एक्सेस करें।

इसे एक फैंसी XML कॉन्फ़िगरेशन फ़ाइल (संभवतः REST या SOAP के माध्यम से एक्सेस) में संग्रहीत करें, जिसे "नीति के रणनीतिक परिवर्तन" होने पर आसानी से संपादित किया जा सकता है।


1

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


1

मुझे पता है कि यह उत्तर स्वीकार कर लिया गया था, लेकिन मैं यह साझा करना चाहता था कि हमने अपने पिछले वेब डेवलपमेंट शॉप पर यह कैसे किया, जहां हमने डेटाबेस I / O को यथासंभव कम करने की कोशिश की।

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

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

हम हमेशा तेज लोड समय की तलाश में थे। इसलिए हमने कई स्टैटिक सर्वर साइड टेक्स्ट फाइल्स को लागू करने का फैसला किया। हमने इसे व्यवस्थापक विजेट के पक्ष में किया। हर बार एक डेटाबेस तालिका अपडेट की गई थी कि हम संबंधित स्थिर पाठ फ़ाइल को फिर से तैयार करेंगे। इससे हमें बहुत लचीला और तेज वातावरण मिला।


0

मेरा यह समाधान, जो सभी स्थितियों में काम नहीं कर सकता है, स्थैतिक डेटाबेस डेटा को हार्ड-कोडित से बाँधना है enum। चूंकि समस्या स्थैतिक तर्क (कोड) से जुड़े डायनेमिक डेटा (डेटाबेस) के होने से आती है, इसलिए इस डेटाबेस तालिका को संबद्ध करने वाले डेटाबेस तालिका के द्वारा इस बंधन को स्पष्ट (और ढीला) करें enum। उदाहरण के लिए:

LooseDBCodeBinding (database table)
   ID : Int32 (key)
   Name : String
   HardCodedTypeID : Int32

// in code:
public enum LooseDBCodeBinding
{
   TYPE_1 = 1,
   TYPE_2 = 2,
   TYPE_3 = 3 // etc...
}

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

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