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

Database design 是否有合法的理由将国际代码与其他数字分开存储?,database-design,internationalization,phone-number,Database Design,Internationalization,Phone Number,我看过谷歌图书馆的libphonenumber,我想用它来格式化国际网站上用户输入的电话号码。最终结果需要一致,因为内部CRM与电话系统集成,以便在客户打电话时提取正确的用户帐户详细信息。电话系统将始终包含该用户的国际代码,即使呼叫来自与办公室相同的国家/地区 因此,我打算提供一个国际拨号代码下拉列表,然后将电话字段的其余部分保留为自由形式,但仅限于数字、空格、括号和破折号。然后通过去除除数字以外的所有内容来清除条目 libphonenumber将进行初始健全性检查,以确定它是否为有效数字,然后

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

因此,我打算提供一个国际拨号代码下拉列表,然后将电话字段的其余部分保留为自由形式,但仅限于数字、空格、括号和破折号。然后通过去除除数字以外的所有内容来清除条目

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

我认为将区号和用户号码分开会有点过分,但我的问题是,是只存储最终的完全国际格式的条目,还是将国际代码单独存储到号码的其余部分(例如,2 db字段)。这样做是否有合法的技术原因,还是纯粹的商业决策

。。。我的问题是,是只存储最终的完全国际格式的条目,还是将国际代码单独存储到数字的其余部分(例如,2 db字段)。这样做是否有合法的技术原因,还是纯粹的商业决策

无论何时在数据库行中创建字段,都需要有存储该信息的业务原因

在您的示例中,单独存储国际拨号代码可以确定您有多少来自不同国家/地区的客户(根据国际拨号代码分组和求和)。另外,在同一个国家拨打电话时,您不需要国际拨号代码。因此,在大多数情况下,显示没有国际拨号代码的电话号码可能不会让用户感到困惑


将国际电话号码划分为不同的领域对大多数企业来说是很困难的,而且可能是矫枉过正的。然而,如果您有这样做的商业理由,您可以将大多数电话号码分为地区、地区和地区段。(我不熟悉所有的国际电话号码格式,因此您可能需要添加额外的段。)

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

  • 两位国家/地区代码(字符串)
  • 电话号码的国家部分(字符串)
  • 使用,您可以解析数字以生成您可能希望在DB之外使用的不同格式

    例如:

    | countryCode | nationalNumber
    --------------------------------
    | US          | 800-flowers
    
    可按如下方式使用(假设如此):

    //谷歌的libphonenumber库
    从“google libphonenumber”导入libphonenumber;
    //抓住我们需要的部分
    const phoneUtil=libphonenumber.PhoneNumberUtil.getInstance();
    const phoneFormat=libphonenumber.PhoneNumberFormat;
    //解析这个数字——假设我们已经从数据库中得到了这个数字
    让我们解析;
    试一试{
    parsed=phoneUtil.parse(db.nationalNumber,db.countryCode);
    }捕获(e){
    抛出新错误(“无法解析电话号码”);
    }
    //现在打印几个示例
    log(phoneUtil.format(已解析,phoneFormat.NATIONAL));
    log(phoneUtil.format(已解析,phoneFormat.INTERNATIONAL));
    log(phoneUtil.format(已解析,phoneFormat.E164));
    
    将输出:

    (800)356-9377

    +1800-356-9377

    +18003569377

    。。。这足以分别显示给本地用户、国际拨号和编程使用(比如短信)