2009-05-21 12 views
44

पहली नज़र से, यह जाहिर होता मैं दो बुनियादी विकल्प हैं एक डेटाबेस तालिका में ZIP codes संग्रहीत करने के लिए: यानी char(5) या varchar(9) 4 विस्तार का समर्थन करने के लिएक्या डेटाबेस में यूएस ज़िप कोड संग्रहित करने के लिए एक पूर्णांक कॉलम का उपयोग करना एक अच्छा विचार है?

  1. पाठ (शायद सबसे आम),
  2. संख्यात्मक अर्थात 32-बिट पूर्णांक

दोनों डेटा की आवश्यकताओं को पूरा करेंगे, अगर हम मानते हैं कि कोई अंतर्राष्ट्रीय चिंता नहीं है। अतीत में हम आम तौर पर सिर्फ पाठ मार्ग चला चुके थे, लेकिन मैं सोच रहा था कि कोई भी विपरीत करता है? बस संक्षिप्त तुलना से यह लग रहा है पूर्णांक विधि की तरह दो स्पष्ट लाभ हैं:

  • यह अपनी प्रकृति के साधन, स्वचालित रूप से केवल numerics तक ही सीमित द्वारा, है (जबकि मान्यता के बिना पाठ शैली पत्र और ऐसे कौन-सी नहीं संग्रहीत कर सकती है , मेरे ज्ञान के लिए, कभी भी ज़िप कोड में मान्य)। यह का अर्थ यह नहीं है कि हम सामान्य रूप से उपयोगकर्ता इनपुट को मान्य करने के लिए/चाहेंगे/चाहें!
  • 5 या 9 बाइट्स के बजाय 4 बाइट्स (जो 9 अंकों के ज़िप कोड के लिए भी बहुत कुछ होना चाहिए) में कम जगह लेती है।

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

क्या ऐसी कोई चीज है जो int का उपयोग यूएस-केवल ज़िप कोड के लिए डेटाटाइप के रूप में करने से हतोत्साहित करेगी?

+0

मैं कसम खाता हूँ सकता है यह एक कई बार धोखा है, लेकिन मैं हो रही है उन्हें खोजने में परेशानी ... – rmeador

+1

@rmeador: http://stackoverflow.com/questions/310540/best-practices-for-storing-postal-addresses-in-a-database-rdbms बहुत समान है, जबकि http://stackoverflow.com/questions/747802/integer-vs-string-in-डेटा विषय पर भी छूता है। – Shog9

+1

स्लिपिंग टूस्ट्रिंग पर एक बग होने का इंतजार है: क्या होगा यदि 00001 ज़िप कोड बन जाए? फिर आप 10001 और 00001-0001 के बीच नहीं बता सकते हैं। – Mark

उत्तर

97

एक संख्यात्मक ज़िप कोड - एक छोटे से तरीके से - भ्रामक है।

संख्याओं का मतलब कुछ होना चाहिए संख्यात्मक। ज़िप कोड किसी भी संख्यात्मक परिचालन में जोड़ या घटा या भाग नहीं लेते हैं। 1230 9 - 12345 डाउनटाउन शेंगेक्टडी से मेरे पड़ोस में दूरी की गणना नहीं करता है।

अनुमोदित, ज़िप कोड के लिए, कोई भी उलझन में नहीं है। हालांकि, अन्य संख्या-जैसे क्षेत्रों के लिए, यह भ्रमित हो सकता है।

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


संपादित

"अग्रणी शून्य के लिए ..." मेरा मुद्दा है। संख्याओं में अग्रणी शून्य नहीं है। ज़िप कोड पर सार्थक अग्रणी शून्य की उपस्थिति अभी तक एक और सबूत है कि वे संख्यात्मक नहीं हैं।

+6

दुर्भाग्य से (क्या यह दुर्भाग्यपूर्ण है?) आप वास्तव में एक अच्छा अर्थपूर्ण बिंदु बनाते हैं। ;) –

+5

@Yadyn: मुझे नहीं लगता कि यह भाग्य के कारण है कि उसने वास्तव में एक अच्छा मुद्दा बनाया! :) –

+2

मुझे इस तरह की सोच पसंद है ;-) –

21

क्या आप कभी भी गैर-यूएस डाक कोड स्टोर करने जा रहे हैं? कुछ पत्रों के साथ कनाडा 6 वर्ण हैं। मैं आमतौर पर सिर्फ 10 वर्ण फ़ील्ड का उपयोग करता हूं। डिस्क स्पेस सस्ता है, आपके डेटा मॉडल को फिर से काम करना है।

+0

यह नहीं कि कनाडा का एकमात्र अन्य स्थान दुनिया है, बस इसे एक उदाहरण के रूप में उपयोग करें। – Tom

+1

यूके अल्फा न्यूमेरिकल पोस्ट (ज़िप) कोड – ChrisF

+8

का भी उपयोग करता है, भले ही आपको केवल यूएस ज़िप कोड की आवश्यकता हो, जैसे ही आपकी कंपनी में विपणन/बिक्री को पता चलता है कि वे कहीं और पैसा कमा सकते हैं, आपको अन्य लोगों का समर्थन करना होगा :) यह अब इसका समर्थन करने के लिए कोई अतिरिक्त प्रयास नहीं करता है, लेकिन बाद में बहुत कुछ ले जाएगा। – rmeador

17

सत्यापन के साथ एक स्ट्रिंग का उपयोग करें। ज़िप कोड 0 से शुरू हो सकते हैं, इसलिए संख्यात्मक एक उपयुक्त प्रकार नहीं है। साथ ही, यह अंतर्राष्ट्रीय डाक कोड (उदाहरण के लिए यूके, जो 8 अक्षरों तक है) के लिए अच्छी तरह से लागू होता है। संभावित मामले में डाक कोड एक बाधा हैं, आप इसे 10 वर्णों तक सीमित कर सकते हैं, लेकिन पहले अपना target formats देखें।

Here are ब्रिटेन, अमेरिका और कनाडा के लिए सत्यापन regexes।


हाँ, आप पैड अग्रणी शून्य वापस पाने के लिए कर सकते हैं। हालांकि, आप सैद्धांतिक रूप से जानकारी को फेंक रहे हैं जो त्रुटियों के मामले में मदद कर सकता है। अगर किसी को डेटाबेस में 1235 मिलते हैं, तो क्या वह मूल रूप सेहै, या कोई अन्य अंक याद किया गया है?

सर्वश्रेष्ठ अभ्यास कहता है कि आपको कहना चाहिए कि आपका क्या मतलब है। एक ज़िप कोड एक कोड है, संख्या नहीं। क्या आप add/subtract/multiply/divide ज़िप कोड पर जा रहे हैं? और व्यावहारिक परिप्रेक्ष्य से, यह अधिक महत्वपूर्ण है कि आप विस्तारित ज़िप को छोड़ रहे हैं।

+0

यह अच्छा है --- हमने अतीत में प्रत्यर्पण के लिए regexes मिल गया है और उपयोग किया है। मुझे वैसे भी करना होगा, क्योंकि उपयोगकर्ता अभी भी टेक्स्टबॉक्स स्ट्रिंग के माध्यम से इनपुट करेंगे, चाहे इसे पार्स किया जाएगा और संख्यात्मक रूप से संग्रहीत किया जाएगा या नहीं, मुझे अभी भी सबमिट करने से पहले टेक्स्टबॉक्स को सत्यापित करना होगा। –

+6

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

0

इंटीजर अच्छा है, लेकिन यह केवल यूएस में काम करता है, यही कारण है कि ज्यादातर लोग ऐसा नहीं करते हैं। आम तौर पर मैं सिर्फ एक वर्चर (20) या तो का उपयोग करता हूं। शायद किसी भी लोकेल के लिए overkill।

+3

यदि मुझे गलत नहीं है, तो यूएस में ज़िप कोड 0 से शुरू हो सकते हैं, जिससे चलने से पूर्णांक हो सकता है। – TheTXI

+0

@TheTXI - सच है, लेकिन यदि आप केवल यूएस को मानते हैं, तो आप हमेशा प्रदर्शन उद्देश्यों के लिए अग्रणी शून्य के साथ 5 अंकों तक पैड कर सकते हैं। –

+0

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

9

आम तौर पर आप एक गैर-संख्यात्मक डेटाटाइप का उपयोग करेंगे जैसे कि वर्चर जो अधिक ज़िप कोड प्रकारों की अनुमति देगा।यदि आप केवल 5 अंकों [XXXXX] या 9 अंकों [XXXXX-XXXX] ज़िप कोड की अनुमति देने पर मृत सेट हैं, तो आप एक char (5) या char (10) का उपयोग कर सकते हैं, लेकिन मैं इसकी अनुशंसा नहीं करता। वर्चर सबसे सुरक्षित और सबसे अधिक पसंद है।

संपादित करें: यह भी ध्यान दिया जाना चाहिए कि यदि आप फ़ील्ड पर संख्यात्मक गणना करने की योजना नहीं बनाते हैं, तो आपको संख्यात्मक डेटा प्रकार का उपयोग नहीं करना चाहिए। ज़िप कोड इस अर्थ में एक संख्या नहीं है कि आप इसके खिलाफ जोड़ते या घटाते हैं। यह केवल एक स्ट्रिंग है जो आम तौर पर संख्याओं से बनती है, इसलिए आपको इसके लिए संख्यात्मक डेटा प्रकारों का उपयोग करने से बचना चाहिए।

7

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

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

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

एक सुझाव यह है कि पूरे प्रविष्टि को एक इकाई के रूप में मान्य करना है जो यह सत्यापित करता है कि शेष पते की तुलना में ज़िप कोड सही है। यदि यह गलत है, तो पते के लिए वैकल्पिक मान्य ज़िप कोड की पेशकश करने से उनके लिए वैध डेटा इनपुट करना आसान हो जाएगा।इसी तरह, यदि ज़िप कोड सड़क पते के लिए सही है, लेकिन सड़क संख्या उस ज़िप कोड के डोमेन के बाहर होती है, तो उस ज़िप कोड/सड़क संयोजन के लिए वैकल्पिक सड़क संख्याएं प्रदान करें।

+0

हां, मैं अत्यधिक सत्यापन के कारण SW1A 1AA डाल चुके समय की गणना नहीं कर सकता। यदि आप किसी पता डेटाबेस की सदस्यता ले सकते हैं, तो आप अपने डेटा की गुणवत्ता में काफी सुधार करेंगे। आप डेटाबेस में अंतराल की पहचान करने में भी सक्षम होंगे (और इसलिए इसे सुधारना जारी रखें)। – Mark

+0

हम अपने लिए कनाडा पोस्ट डेटाबेस की सदस्यता लेते हैं और मूल डेटाबेस केवल शुरुआत है। यह वास्तव में उपयोगी बनाने के लिए काफी अस्पष्ट तर्क और कुछ रचनात्मक एल्गोरिदम लेता है। – BenAlabaster

2

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

आशा इस मदद करता है,

विधेयक

0

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

1

ज़िप कोड वास्तव में एक कोडित नामस्थान है, यदि आप इसके बारे में सोचते हैं। परंपरागत रूप से अंक, लेकिन यह भी एक हाइफन और बड़े अक्षर:

"10022 के जूते"

http://www.saksfifthavenue.com/main/10022-shoe.jsp

वास्तविक, व्यावसायिक अनुप्रयोगों का एक बहुत, इस बढ़त मामले का समर्थन की जरूरत नहीं होगी, भले ही वह वैध है ।

1

नहीं, क्योंकि

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

मैं learned recently कि रूबी एक कारण आप इस वजह से वहाँ कुछ पिन कोड की है कि प्रमुख शून्य के साथ शुरू कर रहे हैं से बचने के लिए चाहते हो जाएगा, जो-अगर संग्रहीत है जैसा कि पूर्णांक में स्वचालित रूप से ऑक्टल में परिवर्तित हो जाएगा।

the docs से

:

आप एक विशेष उपसर्ग का उपयोग कर सकते दशमलव, षोडश आधारी, अष्टाधारी या बाइनरी फार्मेट में नंबर लिखने के लिए। दशमलव नंबर के लिए, 0 दिन का एक उपसर्ग का उपयोग के लिए हेक्साडेसिमल संख्याओं, 0x का एक उपसर्ग का उपयोग ऑक्टल अंक के लिए 0 या 0o का एक उपसर्ग का उपयोग करें ...

संबंधित मुद्दे

 संबंधित मुद्दे