【问题标题】:Name-matching against table with alternative spellings使用替代拼写与表进行名称匹配
【发布时间】:2011-03-07 14:17:17
【问题描述】:

我有一张包含国家名称替代拼写的表格:

使用名称、Alt1、Alt2、Alt3、Alt4
[...]
巴哈马,“巴哈马”
玻利维亚
波斯尼亚和黑塞哥维那, 波斯尼亚和黑塞哥维那
[...]

(有些国家有 0 个替代拼写,其他最多 4 个。)

给定一个国家/地区字符串,在性能方面返回第一列中的元素的最佳解决方案是什么? (在大多数情况下,与替代拼写的数量无关,字符串匹配第一列,不必进行名称匹配。在其他情况下,概率均匀分布在第 2-X 列中。

(最好使用 JavaScript 或 PHP,谢谢 :))

【问题讨论】:

    标签: php javascript lookup country-codes name-matching


    【解决方案1】:

    在我看来,我认为你应该把它放在数据库中的两个单独的表中:

    countries: id, ..., ...
    
    countries_names: country_id, default (bool or enum('yes', 'no')), name
    

    在 name 列上放置索引,以便您可以快速搜索正确的 name 和 country_id:

    SELECT name FROM countries_names
    WHERE default = 'yes'
    AND country_id = (SELECT country_id FROM countries_names
                      WHERE name = 'search_string'
                      LIMIT 1)
    LIMIT 1
    

    (如果您需要主表中的更多信息,可以添加LEFT JOIN

    其他选项是仅为替代名称创建表:

    countries: id, name, ..., ...
    
    countries_alternative_names: country_id, name
    

    但是在查找第一个匹配项时,您必须在两个表中进行搜索。


    编辑:静态 JavaScript 解决方案:

    function getCountryName(var name) {
      switch (name) {
        case "Bahamas" :
        case "The Bahamas" :
          return "Bahamas";
        case "Bolivia" :
          return "Bolivia";
        case "Bosnia and Herzegovina" :
        case "Bosnia & Herzegovina" :
          return "Bosnia and Herzegovina"
    
        // ...
    
        default :
          return null;
      }
    }
    

    【讨论】:

    • 如果不使用查询语言,而是使用 javascript 查找等?
    • @dani,如果您正在寻找静态客户端解决方案,一个简单的开关就可以了。请参阅我编辑的答案。
    猜你喜欢
    • 2021-07-07
    • 2012-12-25
    • 2020-12-19
    • 2011-10-16
    • 2018-11-05
    • 2017-07-23
    相关资源
    最近更新 更多