0

**这里使用 PHP/MySQL **

设想:

某快递公司在全国有多个仓库/仓库,每个仓库只覆盖选定的城市/城镇。当用户访问他们的站点时,他们可以搜索最近/本地的仓库。

我研究了两个选项,每个选项解释如下:

选项一(无效):

我用纬度和经度存储每个站点并进行简单的半径搜索,因此当用户进入他们的城市/城镇时,我使用谷歌地图进行地理编码并运行半径查询以获取 25 英里内的所有站点,这确实有效。

但它有一个很大的缺点,一些仓库不覆盖选定的城镇/城市,并且半径搜索没有考虑到这一点,导致即使它们不覆盖该区域,它也会在结果中显示仓库/仓库。

选项二:

将城镇/城市列表存储在一个数据库表中,并将站点存储在另一个表中。然后有一个关系表,将站点链接到它们所覆盖的城镇/城市。用户必须输入确切的城市(LIKE此处使用 mySQL)名称才能返回结果,这将搜索城市表,然后执行一个LEFT JOINto depots 表。

这里的缺点是关系表会快速增长,最多可以有 500 万条记录,这可能会在后期出现性能问题。

选项二的数据库设计:

仓库表

-   ID
-   D_NAME
-   D_ADDRESS
-   D_POSTCODE
-   D_TEL
-   AND SO ON…

城市表

-   ID
-   NAME

关系表

-   ID
-   CITY_ID
-   DEPOT_ID

问题:

我还有其他选择吗?

选项二是正确的方法吗?就性能而言是否可以?

谢谢。

4

1 回答 1

0

我认为您描述的关系表没有问题。只要 city 表对搜索词(城市名称,我假设)和外键 ID 有一个复合索引,它就可以完美地工作。

您不想提供完整的通配符搜索(LIKE %ancouv%以查找 Vancouver),但应将搜索限制为前缀搜索(LIKE vancou%)。否则索引将没有帮助,数据库服务器将不得不进行全表扫描。

测试时,使用EXPLAIN SELECT ...命令确保使用您的索引。此外,您应该始终使用实际数量的测试数据进行测试。如果您只有一小部分测试数据,查询优化器可能会选择与上述数百万行不同的路径。例如,对于一个非常小的表,它可能会决定执行完整扫描而不是索引查找可能是更好的方法,从而导致您相信索引永远不会被使用。

于 2013-03-31T15:19:30.280 回答