2013-03-31 104 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 ...命令確保使用索引。此外,您應該始終使用實際數量的測試數據進行測試。如果您只有一小部分測試數據,查詢優化器可能會選擇與上述數百萬行不同的路徑。例如,對於非常小的表格,它可能會決定執行全面掃描而不是索引查找可能是更好的方法,從而導致您認爲該索引從不使用。