2

国名の代替スペルの表があります。

名前、Alt1、Alt2、Alt3、Alt4を使用
[...]
バハマ、 "バハマ、"
ボリビア
ボスニアヘルツェゴビナ、ボスニア&ヘルツェゴビナ
[...]

(一部の国では代替スペルが0で、その他は最大4つです。)

国の文字列が与えられた場合、最初の列の要素を返すためのパフォーマンス面での最良の解決策は何ですか?(ほとんどの場合、代替スペルの数に関係なく、文字列は最初の列と一致し、名前を一致させる必要はありません。その他の場合、確率は列2-Xに均等に分散されます。

(できればJavaScriptまたはPHPで、ありがとう:))

4

1 に答える 1

1

私の意見では、これをデータベースの2つの別々のテーブルに配置する必要があると思います。

countries: id, ..., ...

countries_names: country_id, default (bool or enum('yes', 'no')), 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

ただし、最初の一致を探すときは、2つのテーブルを検索する必要があります。


編集:静的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;
  }
}
于 2011-03-07T14:32:50.263 に答える