هل من الجيد استخدام عمود عدد صحيح لتخزين رموز البريدية الأمريكية في قاعدة بيانات؟

StackOverflow https://stackoverflow.com/questions/893454

سؤال

من النظرة الأولى، يبدو أن لدي خياران أساسيان للتخزين الرمز البريدي في جدول قاعدة البيانات:

  1. النص (ربما الأكثر شيوعا)، أي char(5) أو varchar(9) لدعم امتداد +4
  2. عدد صحيح، أي عدد صحيح 32 بت

سيولي كلاهما متطلبات البيانات، إذا افترضنا أنه لا توجد مخاوف دولية. في الماضي، ذهبنا عموما طريق النص فقط، لكنني كنت أتساءل ما إذا كان أي شخص يفعل العكس؟ فقط من المقارنة الموجزة تبدو وكأنها الطريقة الصحيحة لها مزايا واضحة:

  • إنه، عن طريق طبيعته، تقتصر تلقائيا على العدامات فقط (في حين أن بدون التحقق من صحة نمط النص قد تخزن الحروف، وهذا ليس كذلك، على حد علمي، ساري المفعول في الرمز البريدي). هذه لا يعني أننا نستطيع / سوف / يجب أن تخلى التحقق من التحقق من التحقق من صحة المستخدم كالمعتاد، على الرغم من!
  • يستغرق الأمر أقل مساحة، كونه 4 بايت (يجب أن يكون الكثير حتى بالنسبة لرموز ZIP 9 أرقام) بدلا من 5 أو 9 بايت.

أيضا، يبدو أنه لن يضر العرض كثيرا. انها تافهة ل صفعة ToString() على قيمة رقمية، استخدم معالجة السلسلة البسيطة لإدراج واصلة أو مساحة أو أي شيء لملحق +4، واستخدم تنسيق السلسلة لاستعادة الأصفار الرائدة.

هل هناك أي شيء من شأنه أن يثبط استخدام int كأنب من نوع البيانات ل US - فقط الرمز البريدي؟

هل كانت مفيدة؟

المحلول

الرمز البريدي الرقمي هو - بطريقة صغيرة - مضللة.

يجب أن تعني الأرقام شيئا رقمي. وبعد لا تضيف رموز ZIP أو طرحها أو المشاركة في أي عمليات رقمية. 12309 - 12345 لا يحسب المسافة من وسط مدينة الشينيكتي إلى منطقتي.

منحت، لرموز البريدية، لا أحد مرتبك. ومع ذلك، بالنسبة للحقول الأخرى تشبه الأرقام، يمكن أن تكون مربكة.

نظرا لأن الرموز البريدية ليست أرقاما - فهي تحدث فقط أن تكون مشفرة بأبجدية مقيدة - أقترح تجنب حقل رقمي. توفير 1 البايت لا يستحق الكثير. وأعتقد أن ذلك المعنى هو أكثر أهمية من البايت.


يحرر.

"أما بالنسبة للأصهار الرائدة ..." هي وجهة نظري. الأرقام لا تملك الأصفار الرائدة. وجود الأصفار الرائدة ذات مغزى على رموز البريدية هو دليل آخر على أنهم ليسوا رقميون.

نصائح أخرى

هل ستتخزين رموز بريدية غير أمريكية؟ كندا هي 6 أحرف مع بعض الحروف. عادة ما أستخدم حقل 10 أحرف. مساحة القرص رخيصة، الاضطرار إلى إعادة صياغة نموذج البيانات الخاص بك ليست كذلك.

استخدام سلسلة مع التحقق من الصحة. يمكن أن تبدأ الرموز البريدية مع 0، لذلك رقم رقمي ليس نوع مناسب. أيضا، هذا ينطبق بدقة على الرموز البريدية الدولية (مثل المملكة المتحدة، والتي تصل إلى 8 أحرف). في الحالة غير المرجعية أن الرموز البريدية هي عنق الزجاجة، يمكنك قصرها على 10 أحرف، ولكن تحقق من الخاص بك التنسيقات المستهدفة أول.

هنا التحقق من صحة Regexes للمملكة المتحدة، الولايات المتحدة وكندا.


نعم، يمكنك وسادة للحصول على الأصفار الرائدة مرة أخرى. ومع ذلك، فأنت ترمي نظريا المعلومات التي قد تساعد في حالة أخطاء. إذا وجد شخص ما 1235 في قاعدة البيانات، فهل هذا في الأصل 01235، أو هل تم تفويت رقم آخر؟

أفضل الممارسات تقول إنك يجب أن تقول ما تقصده. الرمز البريدي هو رمز وليس رقما. هل أنت ذاهب إلى إضافة / طرح / اضرب / الفجوة الرمز البريدي؟ ومن منظور عملي، فمن الأهمية بكثير أنك باستثناء الكود البريدي الموسعة.

عادة ما تستخدم نوع بيانات غير رقمي مثل Varchar الذي يسمح له بمزيد من أنواع الرمز البريدي. إذا كنت قد ماتت في السماح فقط ب 5 أرقام [XXXXX] أو 9 أرقام [XXXXX-XXXXX]، فيمكنك ذلك استخدام سحر (5) أو شار (10)، لكنني لن أوصي به. فارشار هو الخيار الأكثر أمانا والأكثر سرا.

تحرير: تجدر الإشارة أيضا إلى أنه إذا كنت لا تخطط للقيام بعملية حسابات رقمية في الحقل، يجب ألا تستخدم نوع بيانات رقمي. الرمز البريدي ليس رقما بمعنى أنك تضيف أو طرحها ضدها. إنها مجرد سلسلة تحدث تتكون عادة بأرقام، لذلك يجب عليك الامتناع عن استخدام أنواع البيانات العددية لذلك.

من وجهة نظر تقنية، بعض النقاط المثارة هنا هي تافهة إلى حد ما. أنا أعمل مع طباط معالجة البيانات على اليومي أساس - على وجه الخصوص بيانات العناوين التنظيف من جميع أنحاء العالم. انها ليست مهمة تافهة بأي امتداد للخيال. عندما يتعلق الأمر بالرموز البريدية، أنت استطاع تخزينها كعدد صحيح على الرغم من أنه قد لا يكون صحيحا "دلالة". والحقيقة هي أن البيانات هي شكل رقمي سواء كان ذلك أو لا يتحدث بدقة يكون تعتبر رقيقة في القيمة.

ومع ذلك، فإن العيب الحقيقي لتخزينها لأن الأنواع الرقمية هي أن تفقد القدرة على معرفة بسهولة ما إذا تم إدخال البيانات بشكل غير صحيح (أي لديه قيم مفقودة) أو إذا قام النظام بإزالة الأصفار التي تؤدي إلى عمليات التحقق المحتملة بشكل غير صحيح الرموز البريدية التي كانت صحيحة خلاف ذلك.

من الصعب أيضا إجبار المستخدم على إدخال البيانات الصحيحة إذا كانت إحدى التداعيات تأخير للعمل. غالبا ما لا يحصل المستخدمون على الصبر للدخول إلى البيانات الصحيحة إذا لم يكن واضحا على الفور. استخدام Regex هو إحدى طرق ضمان البيانات الصحيحة، ولكن إذا دخل المستخدم قيمة لا تتفق مع وجود خطأ، فقد يتم حذف هذه القيمة تماما أو أدخل شيئا يتوافق ولكنه غير صحيح. مثال على ذلك [استخدام الرموز البريدية الكندية] هو أنه غالبا ما ترى A0A 0A0 تم إدخاله وهو غير صالح ولكنه يتوافق مع Regex للرموز البريدية الكندية. في كثير من الأحيان بدلا من ذلك، يتم إدخال ذلك من قبل المستخدمين الذين أجبروا على تقديم رمز بريدية، لكنهم لا يعرفون ما هو عليه أو لا تملك كل ذلك.

أحد الاقتراحات هو التحقق من صحة الإدخال بأكمله كوحدة التحقق من صحة رمز الرمز البريدي مقارنة ببقية العنوان. إذا كان غير صحيح، فقم بتقديم رموز ZIP صالحة بديلة للعنوان سيجعل من السهل عليهم إدخال بيانات صالحة. وبالمثل، إذا كان الرمز البريدي صحيحا لعنوان الشارع، لكن رقم الشارع يسقط خارج نطاق هذا الرمز البريدي، ثم تقدم أرقام الشوارع البديلة إلى مزيج الرمز البريدي / الشارع.

ما لم يكن لديك متطلبات تجارية لأداء الحسابات الرياضية على بيانات الرمز البريدي، لا توجد نقطة في استخدام int. أنت أكثر من الهندسة.

أتمنى أن يساعدك هذا،

مشروع قانون

لا ل

  • أنت لا تفعل وظائف الرياضيات على الرمز البريدي
  • يمكن أن تحتوي على شرطات
  • يمكن أن تبدأ مع 0
  • تفسر القيم الخالية أحيانا على أنها صفر في حالة أنواع العددية مثل عدد صحيح (على سبيل المثال عند تصدير البيانات بطريقة أو بأخرى)
  • الرمز البريدي، حتى لو كان ذلك عددا، هو تعيين منطقة، وهذا يعني أن هذا اسم بدلا من كمية رقمية من أي شيء

الرمز البريدي هو حقا مساحة اسم مشفرة، إذا كنت تفكر في ذلك. أرقام تقليديا، ولكن أيضا خطابات واصلة ورأسمالية:

"10022-حذاء"

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

بشكل واقعي، لن تحتاج الكثير من التطبيقات التجارية إلى دعم هذه الحالة الحافة، حتى لو كانت صالحة.

عدد صحيح جميل، لكنه يعمل فقط في الولايات المتحدة، وهذا هو السبب في أن معظم الناس لا يفعلون ذلك. عادة ما أستخدم فقط varchar (20) أو نحو ذلك. ربما المبالغة في أي لغة.

إذا كنت تستخدم عدد صحيح للحوامل الأمريكية، فأنت تريد أن تضاعف الجزء الرائد بنسبة 10000 وإضافة +4. الترميز في قاعدة البيانات لا علاقة له بصلاحية الإدخال. يمكنك دائما أن تتطلب الإدخال ساري المفعول أم لا، لكن التخزين يهم كم تعتقد أن متطلباتك أو سيتغير USPS. (تلميح: الاحتياجات الخاصة بك إرادة يتغيرون.)

أنا تعلمت مؤخرا أنه في Ruby One قد ترغب في تجنب ذلك لأن هناك بعض الرموز البريدية التي تبدأ بقيادة الأصفار الرائدة، والتي - إذا تم تخزينها كما في عدد صحيح - سيتم تحويلها تلقائيا إلى Octal.

من المستندات:

يمكنك استخدام بادئة خاصة لكتابة الأرقام بتنسيقات عشرية أو عشرية أو ثمانية أو ثنائية. بالنسبة للأرقام العشرية، استخدم بادئة 0D، لأن الأرقام الست عشرية تستخدم بادئة 0x، لأرقام Octal استخدم بادئة 0 أو 0O ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top