management - database شرح




هل هناك معيار لتخزين أرقام الهواتف العادية في قاعدة بيانات؟ (12)

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

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

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

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

where dbo.f_normalizenum(num1) = dbo.f_normalizenum(num2)

وهو غير فعال بشكل فظيع. كما أن الاستعلامات التي تبحث عن أشياء مثل رمز المنطقة تصبح صعبة للغاية عندما يكون حقل varchar واحد فقط.

[تصحيح]

قدم الناس الكثير من الاقتراحات الجيدة هنا ، شكرًا! كتحديث ، هنا ما أفعله الآن: ما زلت أقوم بتخزين الأرقام تمامًا كما تم إدخالها ، في حقل varchar ، ولكن بدلاً من تطبيع الأشياء في وقت الاستعلام ، لدي مشغل يعمل كل ما يتم إدخاله في السجلات أو تحديثها. لذلك ، لديّ أحبار أو أحجام كبيرة لأية أجزاء أحتاج إلى الاستعلام عنها ، ويتم فهرسة هذه الحقول لجعل الاستعلامات تعمل بشكل أسرع.


المستخدم ودية: +44 (0) 181 464 2542 تطبيع: 00441814642542

ال (0) غير صالح في الشكل الدولي. انظر معيار ITU-T E.123.

لن يكون التنسيق "الطبيعي" مفيدًا للقراء الأمريكيين عندما يستخدمون 011 للوصول الدولي.


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


أعتقد أن النص الحر (ربما varchar (25)) هو المعيار الأكثر استخداماً. سيسمح هذا بأي تنسيق ، سواء محلي أو دولي.

أعتقد أن عامل القيادة الرئيسي قد يكون هو كيفية استفسارك بالضبط عن هذه الأرقام وما تفعله بها.


أولاً ، ما وراء رمز البلد ، لا يوجد معيار حقيقي. حول أفضل ما يمكنك القيام به هو التعرف على رمز البلد ، أي الأمة رقم هاتف معين ينتمي إلى والتعامل مع بقية الرقم وفقا لصيغة ذلك البلد.

بشكل عام ، ومع ذلك ، أجهزة الهاتف وموحدة بحيث يمكنك دائما تقريبا كسر رقم هاتف معين في المكونات التالية

  • C رمز البلد من 1 إلى 10 أرقام (الآن 4 أو أقل ، ولكن قد يتغير ذلك)
  • رمز المنطقة (الولاية / الولاية / الإقليم) رمز 0-10 أرقام (قد ترغب بالفعل في حقل منطقة وحقل مساحة بشكل منفصل ، بدلاً من رمز منطقة واحدة)
  • E Exchange (البادئة ، أو رمز التبديل) رمز 0-10 أرقام
  • لخط رقم 1-10 أرقام

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

علاوة على ذلك ، توجد داخل كل بلد معايير مختلفة. يمكنك دائمًا الاعتماد على EEE-LLLL (AAA) في الولايات المتحدة ، ولكن في بلد آخر قد يكون لديك تبادلات في المدن (AAA) EE-LLL ، وببساطة أرقام الخطوط في المناطق الريفية (AAA) LLLL. سيكون عليك البدء من الأعلى في شجرة ذات شكل ما ، وتنسيقها كما لديك معلومات. على سبيل المثال ، يحتوي رمز البلد 0 على تنسيق معروف لبقية الرقم ، ولكن بالنسبة لرمز البلد 5432 ، قد تحتاج إلى فحص رمز المنطقة قبل فهم بقية الرقم.

قد ترغب أيضًا في التعامل مع الأرقام vanity مثل (800) Lucky-Guy ، والتي تتطلب الاعتراف ، إذا كان رقم الولايات المتحدة ، هناك عدد كبير جدًا من الأرقام (وقد تحتاج إلى تمثيل كامل للإعلان أو لأغراض أخرى) ، في الولايات المتحدة ، تُنظر الحروف إلى الأرقام بشكل مختلف عن ألمانيا.

قد ترغب أيضًا في تخزين الرقم بالكامل بشكل منفصل كحقل نص (مع التدويل) حتى تتمكن من العودة لاحقًا وإعادة تحليل الأرقام كلما تغيرت ، أو كنسخة احتياطية في حالة قيام شخص ما بإرسال طريقة سيئة لتحليل صيغة بلد معين ويفقد المعلومات.


إليك البنية المقترحة ، وسأكون ممتنًا

يجب أن يكون حقل قاعدة بيانات الهاتف varchar (42) بالتنسيق التالي:

كود البلد - عدد x ملحق

لذلك ، على سبيل المثال ، في الولايات المتحدة ، يمكننا الحصول على:

1-2125551234x1234

سيمثل هذا رقمًا أمريكيًا (رمز البلد 1) مع رمز / رقم المنطقة (212) 555 1234 والامتداد 1234.

يؤدي فصل رمز البلد باستخدام شرطة إلى جعل رمز البلد واضحًا لشخص يدعي البيانات. هذا ليس ضروريًا تمامًا لأن رموز البلدان هي " رموز البادئة " (يمكنك قراءتها من اليسار إلى اليمين وستتمكن دائمًا من تحديد البلد بشكل لا لبس فيه). ولكن نظرًا لأن رموز البلد لها أطوال مختلفة (تتراوح بين 1 و 4 أحرف في الوقت الحالي) ، فلا يمكنك بسهولة معرفة رمز البلد في لمحة ما لم تستخدم نوعًا من الفواصل.

يمكنني استخدام "x" لفصل الامتداد ، وإلا لن يكون ممكناً (في كثير من الحالات) معرفة الرقم واللاحقة.

وبهذه الطريقة ، يمكنك تخزين الرقم بالكامل ، بما في ذلك رمز البلد والإضافة ، في حقل قاعدة بيانات واحدة ، والذي يمكنك استخدامه بعد ذلك لتسريع الاستعلامات الخاصة بك ، بدلاً من الانضمام إلى وظيفة محددة من قبل المستخدم كما كنت تفعل بشكل مؤلم حتى الآن .

لماذا اخترت varchar (42)؟ حسنا ، أولا ، ستكون أرقام الهاتف الدولية ذات أطوال متنوعة ، وبالتالي فإن "فار". أنا أقوم بتخزين شرطة و "x" ، بحيث يشرح "char" ، وعلى أي حال ، لن تقوم بحساب صحيح على أرقام الهاتف (أعتقد) لذلك من المنطقي أن نحاول استخدام نوع عددي . أما بالنسبة لطول 42 ، فقد استخدمت أقصى طول ممكن لجميع الحقول المضافة ، بناءً على إجابة آدم ديفيس ، وأضفت 2 للاندفاع و "x".


حسنًا ، بناءً على المعلومات الواردة في هذه الصفحة ، إليك بداية على مدقق رقم الهاتف الدولي:

function validatePhone(phoneNumber) {
    var valid = true;
    var stripped = phoneNumber.replace(/[\(\)\.\-\ \+\x]/g, '');    

    if(phoneNumber == ""){
        valid = false;
    }else if (isNaN(parseInt(stripped))) {
        valid = false;
    }else if (stripped.length > 40) {
        valid = false;
    }
    return valid;
}

يعتمد بشكل فضفاض على نص برمجي من هذه الصفحة: http://www.webcheatsheet.com/javascript/form_validation.php


ربما تخزين أقسام رقم الهاتف في أعمدة مختلفة ، مما يسمح بإدخال فارغة أو فارغة؟


لقد استخدمت 3 طرق مختلفة لتخزين أرقام الهواتف وفقًا لمتطلبات الاستخدام.

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

ماذا عن تخزين عمود freetext الذي يعرض إصدارًا سهل الاستخدام من رقم الهاتف ، ثم إصدارًا عاديًا يزيل المساحات والأقواس ويوسع '+'. فمثلا:

سهل الاستخدام: +44 (0) 181 4642542

Normalized: 00441814642542


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

441234567890 نوع / خطة 0x11 (مما يعني الدولي E.164)

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






database