是否有合理的理由将国际代码与其他数字分开存储?

时间:2012-11-13 16:50:55

标签: database-design internationalization phone-number

我见过Google图书馆libphonenumber,我正在考虑使用它来格式化国际网站上用户输入的电话号码。最终结果需要保持一致,因为内部CRM与电话系统集成在一起,以便在客户打电话时提取正确的用户帐户详细信息。电话系统将始终包含该用户的国际代码,即使该呼叫来自与办公室相同的国家/地区内。

因此,我打算提供一个带有国际拨号代码的下拉菜单,然后将其余的电话字段保留为自由格式,但仅限于数字,空格,括号和短划线。然后通过删除除数字之外的所有内容来清理条目。

libphonenumber会进行初步的健全性检查以确定它是否是有效数字,然后将其转换为正确的国际格式。

我认为分别区域代码和用户号码分开会有点过分,但我的问题是,是仅存储最终的完全国际格式化条目,还是将国际代码分别存储到其余数字(例如2分贝字段) 。这样做有合理的技术原因,还是仅仅是商业决策?

2 个答案:

答案 0 :(得分:2)

  

...我的问题是,是仅存储最终的完全国际格式化条目,还是将国际代码分别存储到其余数字(例如2个数据库字段)。这样做有合理的技术原因,还是仅仅是商业决策?

每次在数据库行中创建字段时,都需要有商业原因来存储该信息。

在您的示例中,分别存储国际拨号代码可以确定您从不同国家/地区拨打的客户数量(对国际拨号代码进行分组和汇总)。此外,在同一国家/地区内拨打电话时,您不需要国际拨号代码。因此,在大多数情况下,在没有国际拨号代码的情况下显示电话号码可能会让用户感到困惑。

对于大多数企业而言,将国际电话号码分解为不同的领域可能会非常困难。但是,如果您有这样做的商业原因,您可以将大多数电话号码分解为区域,区域和地区段。 (我不熟悉所有国际电话号码格式,因此您可能需要额外的细分。)

答案 1 :(得分:0)

在数据库中存储两个字段:

  
      
  1. 两位数的国家/地区代码(字符串)
  2.   
  3. 电话号码的国内部分(字符串)
  4.   

使用libphonenumber,您可以解析该数字,以生成您可能希望在数据库外部使用的不同格式。

例如:

| countryCode | nationalNumber
--------------------------------
| US          | 800-flowers

可以如下使用(假设这是Javascript lib):

// Google's libphonenumber library
import libphonenumber from 'google-libphonenumber';

// Grab the parts of the lib we'll need
const phoneUtil = libphonenumber.PhoneNumberUtil.getInstance();
const phoneFormat = libphonenumber.PhoneNumberFormat;

// Parse the number -- assume we already got this from the DB
let parsed;

try {
  parsed = phoneUtil.parse(db.nationalNumber, db.countryCode);
} catch(e) {
   throw new Error("Couldn't parse the phone number");
}

// Now print a few examples
console.log(phoneUtil.format(parsed, phoneFormat.NATIONAL));
console.log(phoneUtil.format(parsed, phoneFormat.INTERNATIONAL));
console.log(phoneUtil.format(parsed, phoneFormat.E164));

将输出:

  

(800)356-9377

     

+1 800-356-9377

     

18003569377

...这足以分别显示给本地用户,进行国际拨号和编程使用(例如,短信)。