सिंक में एक एनम और एक टेबल रखते हुए


11

मैं एक प्रोग्राम बना रहा हूं जो एक डेटाबेस में डेटा पोस्ट करेगा, और मैं एक पैटर्न में चला गया हूं जो मुझे यकीन है कि परिचित है: एक एनम के रूप में काम करने वाले सबसे अधिक संभावना (बहुत दृढ़ता से) निश्चित मानों की एक छोटी तालिका। तो नीचे दी गई तालिका को मान लीजिए Status:

  स्थिति
  आईडी विवरण
  --------------
   0 असंसाधित
   1 लंबित
   2 संसाधित
   3 त्रुटि

मेरे कार्यक्रम में मुझे एक और तालिका के लिए एक स्थिति आईडी निर्धारित करने की आवश्यकता है, या संभवतः एक नई स्थिति आईडी के साथ एक रिकॉर्ड अपडेट करें।

मैं एक पहचान में ईद की स्थिति को हार्डकोड कर सकता हूं और आशा करता हूं कि कोई भी कभी भी डेटाबेस में बदलाव न करे। या मैं कर सकता है विवरण के आधार पर मूल्यों प्री-फ़ेच (इस प्रकार हार्डकोड कि बजाय)।

इन दो, एनम और टेबल को सिंक करने के लिए सही तरीका क्या होगा?


आप सिंक में चीजों को क्यों रख रहे हैं और सिंक में नहीं? सिंक (इसे कहते हैं) अजीब है!

1
@suslik वे दोनों समान हैं। सिंक और सिंक
MPelletier

1
एक enum और डेटाबेस टेबल का दोहराव होना जब तक डेटाबेस तालिका का उपयोग अन्य अनुप्रयोगों द्वारा नहीं किया जाता है, मैं तालिका को आगे बढ़ाता हूं और बस एनम का उपयोग करता हूं। यदि तालिका को कई एप्लिकेशन में उपयोग किया जाएगा, तो इसके बजाय रनटाइम पर डेटाबेस से स्थिति लोड करें।
पीटर स्मिथ

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

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

जवाबों:


5

मैं आपके प्रोग्राम के भीतर एनम को हार्ड-कोड कर दूंगा, क्योंकि मुझे संदेह है कि ये विभिन्न स्थितियां आपके प्रोग्राम लॉजिक को प्रभावित करती हैं। यदि आपके पास एक नई स्थिति है, तो आपके कार्यक्रम को इस नई स्थिति पर प्रतिक्रिया कैसे दी जाए?

क्योंकि डेटाबेस आपके आवेदन का हिस्सा है, मुझे नहीं लगता कि यह किसी दूसरे को सलाह दिए बिना प्रभावित करने के लिए समझ में आएगा, बोलने का प्रकार।


यह नए स्टेटस के बारे में बहुत अधिक नहीं है (जो निश्चित रूप से डेटाबेस और प्रोग्राम दोनों के संशोधन को लागू करेगा), लेकिन आईडी मान।
MPelletier

2
मैं यह नहीं देखता कि आप इसका अर्थ बदले बिना आईडी मान क्यों बदलेंगे। इस तरह की गणना ऑटो-इन्क्रिमेंट नहीं होगी, और ये वास्तव में डेटाबेस को डीबग करने वाले लोगों के लिए केवल पठनीयता के लिए होती हैं, जैसा कि आमतौर पर आपका एप्लिकेशन प्रश्न बना रहा होगा, और यह पहले से ही जानता होगा कि आईडी किस लिए pendingहोगी। बेशक एक Statusमेज होने से आपको संदर्भात्मक अखंडता मिलती है, लेकिन यह वह बिंदु है जो मैं बनाने की कोशिश कर रहा हूं।
मैथ्यू

खैर, यह विचार है। लेकिन अगर मैं आईडी को दूसरों के लिए एक जगह पर सेट करता हूं, तो मैं यह मानकर काम कर रहा हूं कि वे दोनों सही हैं। यह एक ढीला लिंक है, नहीं?
MPelletier

3
हम हर समय इन धारणाओं को बनाते हैं, यदि आप एक तालिका परिभाषा के बारे में सोचते हैं, तो हमारा कार्यक्रम मान लेता है जैसे कि एक क्वेरी लिखते समय। Statusतालिका आवेदन के क्रम के माध्यम से गतिशील नहीं माना जाना चाहिए, और इस तरह मुझे नहीं लगता कि आप इस तरह के रूप में यह पढ़ना चाहिए है।
मैथ्यू

8

जब आवेदन शुरू होता है, तो मैं सामान्य रूप से इस डेटा को एक स्थिर कैश (आमतौर पर हैशपेप या ऐसा कुछ) में लोड करूंगा। यह सिर्फ इसलिए recompile करने से बचता है क्योंकि enum को किसी तरह से संशोधित किया गया है।


2

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

यदि आपके पास उदाहरण के लिए एक रिपोर्ट खींचने की आवश्यकता है, तो आपको उनके सही विवरण के साथ डीबी के लिए लिखे गए स्टेटस मान होना चाहिए।

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

अपनी आवश्यकताओं के आधार पर आप थोड़े अलग व्यवहारों को लागू करना चाह सकते हैं, लेकिन कुल मिलाकर यह एक अच्छा विचार है कि उन स्थितियों को वैसे भी कठिन कोडित किया जाए।


2

मेरी परियोजना (विरासत कोड, हुर्रे!) पर हमारे समान मुद्दे हैं। बड़ी समस्या यह है कि "एनम टेबल कभी नहीं बदलते" जब तक वे करते हैं और कोड टूट जाता है। मैं दो रणनीतियों को कम करने के लिए है कि मैं धीरे-धीरे की ओर पलायन कर रहा हूं।

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

जब वह काम नहीं करता है, तो मैं B: कोड जेनरेशन प्लान करने जाता हूं। चूंकि टेबल बार-बार बदलती हैं और हम नियमित रूप से नए बिल्ड प्रकाशित करते हैं, एक कोड जनरेटर एनम टेबल को पढ़ सकता है और एनम कोड लिख सकता है। इस गतिशील रूप से उत्पन्न लाइब्रेरी का उपयोग तब परियोजना में किया जाता है। यदि DB बदल जाता है, तो अगला निर्माण संकलित नहीं होगा, जो रहस्यमय रनटाइम त्रुटियों को प्राप्त करने से बहुत बेहतर है।


आप एक एनम के संदर्भ को कैसे समाप्त करेंगे? उदाहरण के लिए आप इस मामले में किसी स्थिति के आधार पर छाँट रहे हैं या खोज रहे हैं। DB में कुछ जादुई मूल्य होने से मेरे साथ अच्छी तरह से नहीं बैठता है। यह लुकअप टेबल किसके लिए है।
नर्तपल्ली

अतीत में, मैंने इसके विपरीत किया है। जब भी एप्लिकेशन बूट पर Enum में कोड परिवर्तन होता है, यह उन मानों को डेटाबेस में सिंक करता है। यहाँ कोड सत्य का स्रोत है। डेटाबेस इसका एक प्रतिनिधित्व है। आमतौर पर मैं डीबी में उन मूल्यों को अनदेखा करता हूं जो कोड समझ नहीं सकते हैं लेकिन इस तरह, मुझे आवश्यकता पड़ने पर डीबी को स्वचालित रूप से साफ करने के लिए एक तंत्र मिलता है।
अंशुल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.