2013-03-31 77 views
0

** 的PHP/MySQL这里使用 **数据库设计/性能 - 基于城市/城镇位置按公司覆盖

场景:

配送公司拥有全国各地的许多仓库/仓库国家,每个仓库只覆盖选定的城市/城镇。当用户访问他们的网站时,他们可以搜索最近的/本地的软件仓库。

我看着两个选项,每个解释如下:

方案一(无效):

我存储与纬度和经度各仓库和做一个简单的搜索半径,因此,当用户进入他们的城市/城镇时,我使用谷歌地图进行地理编码,并运行半径查询以将所有仓库的距离限制在25英里以内,这是行得通的。

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

方案二:

店/镇名单城市在另一个表中的一个数据库表和仓库。然后建立关系表,将仓库链接到它们覆盖的城镇/城市。用户必须输入确切的城市(这里使用的mySQL LIKE)名称来返回结果,这将搜索城市表格,然后执行LEFT JOIN到depots表。

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

数据库设计选项二:

车厂表

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

市台

- ID 
- NAME 

关系表

- ID 
- CITY_ID 
- DEPOT_ID 

问题:

有没有其他的选择,我可以采取?

是选项二,正确的方法,并在性能方面可以吗?

谢谢。

回答

0

我看到您描述的关系表没有问题。只要城市表在搜索项(城市名称,我假设)上有一个复合索引,并且外键ID应该完美无缺地工作。

你不想提供完整的通配符搜索(LIKE %ancouv%找到温哥华),但应限制搜索前缀搜索(LIKE vancou%)。否则,索引不会有帮助,数据库服务器将不得不执行全表扫描。

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