2009-06-26 14 views
5

में "जादू" संख्याओं से छुटकारा पाएं कोड में कोई भी वैश्विक रूप से सुलभ स्थिरांक/enums/आदि निर्दिष्ट कर सकता है जिसे उसके बाद एप्लिकेशन के माध्यम से पुन: उपयोग किया जा सकता है। यह '2' जैसी संख्याओं के बजाय 'माज़दा' जैसे सार्थक नामों का उपयोग करने की क्षमता देता है।SQL सर्वर

हम अपने SQL सर्वर संग्रहीत प्रक्रियाओं में ऐसा करना चाहते हैं, लेकिन इसे लागू करने का सबसे अच्छा तरीका सुनिश्चित नहीं है।

निम्न तालिकाओं के लिए जैसे (लौकिक कार स्कीमा):

Car  ManufacturerId 
350Z  1 
Hilux  2 
Yaris  2 

ManufacturerId Name 
1    Nissan 
2    Toyota 

बजाय

SELECT * FROM Car WHERE ManufacturerId = 1 -- Nissan 

लिखने की हम जैसे

SELECT * FROM Car WHERE ManufacturerId = @Nissan 

एक प्रतिबंध कुछ लिखना चाहते हैं हमारे पास यह है कि हम निर्माता पर भरोसा नहीं कर सकते हैं। ऐप के जीवन के लिए वही रहना। हम एक स्तंभ "कोड" कि बदलता है कभी नहीं और इस तरह देखा जाता है मिलती होने के बारे में सोचा:

SELECT * 
FROM Car c 
    INNER JOIN Manufacturer m ON c.ManufacturerId = m.ManufacturerId 
WHERE m.Code = 'Nissan' 

मैं इस पर थोड़ा संकोच कर रहा हूँ के रूप में यह एक अतिरिक्त शामिल होने और स्ट्रिंग तुलना कि गलत वर्तनी किया जा सकता है का उपयोग करता है ।

प्रत्येक संग्रहीत प्रक्रिया में चर घोषित किए बिना इसे पूरा करने का सबसे अच्छा तरीका क्या है?

उत्तर

4

हम ऐसा करने के बाद कुछ तरीके:

  • उपयोगकर्ता-परिभाषित समारोह उस नाम से "जादुई संख्या" देता है।
  • int कॉलम के बजाय एक nchar (4) कॉलम का उपयोग करें और थोड़ा कम अचूक कोड के साथ आते हैं। तो निसान 1 के बजाय "एनआईएसएन" होगा। थोड़ा अच्छा।
+0

पहले सुझाव के साथ खिलवाड़, लेकिन यह दूसरे के लिए बहुत देर हो चुकी है। शायद अगली बार। –

+0

इस समस्या के साथ जो मुश्किल हो रही है वह यह है कि जादू संख्या आमतौर पर आपके ग्राहक कोड में एक enum के अनुरूप होती है। किसी बिंदु पर आप क्लाइंट एनम के साथ अपने एसक्यूएल लुकअप को सिंक्रनाइज़ कर देंगे। एमएस एसक्यूएल सर्वर यहां एक बहुत ही साफ एकीकरण बिंदु प्रदान करता है: आप एनएम मूल्य को वापस करने के लिए एक सीएलआर यूडीएफ कोड कर सकते हैं, अनिवार्य रूप से कुछ रनटाइम प्रकार की सुरक्षा को लागू कर सकते हैं। आपको अभी भी यह सुनिश्चित करने की ज़रूरत है कि आपके प्रश्नों को enum मानों के नाम मिलते हैं, हालांकि, मुझे समस्या के इस हिस्से के आसपास कभी रास्ता नहीं मिला है। –

1

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

व्यक्तिगत रूप से, मैं इस विधि को नापसंद करता हूं, और मेरी तालिकाओं में संग्रहीत प्रत्येक पहचान योग्य वस्तु के लिए एक अद्वितीय आईडी रखना पसंद करता हूं। इसका मतलब है कि एक नई टेबल बनाना जो एक लुकअप है। 2, 'मज़दा'। फिर आप एक ऐसा दृश्य बना सकते हैं जो 'माज़दा' खींचता है जहां डेटाबेस में 2 है, फिर दृश्य के विरुद्ध क्वेरी चलाएं। V_cars से चुनें * निर्माता = 'माज़दा'

+0

व्यवस्था को बदलने में देरी होने के अलावा मैं इन मामलों में प्राकृतिक कुंजी का उपयोग न करने के साथ आपसे सहमत हूं क्योंकि यह कोड में enums का उपयोग करना आसान बनाता है। मुझे दृश्य विचार पसंद है। –