0

都市のリストがあり、都市ごとに多数のスペル オプションがあります (例: New-york、New York City、NY、NYC)

オプションの数は一定ではなく、都市によって異なる場合があります。

今のcitiesところ、次のようなテーブルがあります(ダッシュ、コンマなどはalternative_names列に挿入される前に削除されます:

|  id  |     name     |    alternative_names    |
-------------------------------------------------
|  1   |   New-York   |    ny,new york, nyc     |
|  2   |  New Jersey  |  new jersey,jersey,nj   |

ユーザーが入ったとき、NYCまたはNew Yoたとえば - 彼は New-York を取得する必要があります

REGEXまたはで実行できますLIKE '%query%'が、テーブルには何千もの都市が含まれており、非常に効率的ではありません。

そう-大規模なデータベースでこの種の検索を実行するためのより効率的な方法はありますか?

ありがとうございます!

4

3 に答える 3

1

データベース設計の複数値属性に関する記事を参照してください。

于 2012-05-29T14:33:07.870 に答える
0

DB 設計を変更して、行ごとに 1 つのスペル オプションのみを含む 3 列のテーブルを持つようにします。次に、データベースの選択を利用できます。DB が次のようになっている場合:

|  id  | city_id  |   name     |  alternative_names    |
------------------+------------+------------------------
|  1   |      1   | New-York   |  ny                   |
|  2   |      1   | New-York   |  new york             |
|  3   |      1   | New-York   |  nyc                  |
|  5   |      2   | New Jersey |  new jersey           |
|  6   |      2   | New Jersey |  jersey               |
|  6   |      2   | New Jersey |  nj                   |

次に、次のような単純な検索を記述できます。

SELECT city_id, name
FROM cities
WHERE LOWER(name) = LOWER($1)
OR LOWER(alternative_name) = LOWER($1)

または、さらに良いことに、それらを CITIES (id, name) と ALT_CITIES (city_id, alt_name) の 2 つのテーブルに分割し、クエリで JOIN します。

于 2012-05-29T14:38:22.873 に答える