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   |

当用户输入NYCNew Yo例如 - 他应该得到 New-York

我可以用REGEXor来做LIKE '%query%',但表格包含数千个城市,效率极低。

所以 - 有没有更好的方法在大型数据库上执行这种搜索?

提前致谢!

4

3 回答 3

1

请参阅有关数据库设计中的多值属性的文章。

于 2012-05-29T14:33:07.870 回答
1

分离alternative_names成一个新表:

city_alternative_names
----------------------
id
city_id
name

并查询此表以获取“官方”城市名称。

SELECT c.name
FROM city c
LEFT JOIN city_alternative_names cn ON c.id=cn.city_id
WHERE cn.name='nyc'
于 2012-05-29T14:34:22.590 回答
0

我会将数据库设计更改为具有三列表,每行只有一个拼写选项。然后您可以使用数据库选择。如果您的数据库如下所示:

|  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) 并在查询时加入。

于 2012-05-29T14:38:22.873 回答