[英]Database Design/Performance – Location search based on city/town covered by company
** 此處使用的PHP / MySQL **
場景:
一家送貨公司在全國各地都有許多倉庫/倉庫,每個倉庫僅覆蓋選定的城市/城鎮。 用戶訪問其站點時,他們可以搜索最近的/本地倉庫。
我研究了兩個選項,每個選項如下:
選項一(無效):
我使用緯度和經度存儲了每個倉庫,並進行了簡單的半徑搜索。因此,當用戶輸入他們的城市/城鎮時,我使用了Google Maps到Geocode並運行了一個半徑查詢,以帶出25英里以內的所有倉庫。
但這有一個很大的缺點,某些倉庫無法覆蓋選定的城鎮/城市,半徑搜索沒有考慮到這一點,因此即使結果未涵蓋該區域,倉庫也會在結果中顯示倉庫/倉庫。
選項二:
將一個城鎮/城市列表存儲在一個數據庫表中,將軟件倉庫存儲在另一個表中。 然后有一個關系表,將倉庫鏈接到它們覆蓋的城鎮。 用戶必須輸入確切的城市名稱(此處使用的是mySQL LIKE
)以返回結果,這將搜索城市表,然后對存儲庫表進行LEFT JOIN
。
這里的缺點是關系表將快速增長,最多可以有500萬條記錄,這可能會在以后出現性能問題。
選項二的數據庫設計:
倉庫表
- ID
- D_NAME
- D_ADDRESS
- D_POSTCODE
- D_TEL
- AND SO ON…
城市表
- ID
- NAME
關系表
- ID
- CITY_ID
- DEPOT_ID
問題:
我還有其他選擇嗎?
選項2是正確的方法嗎?在性能方面可以嗎?
謝謝。
我認為您描述的關系表沒有問題。 只要城市表在搜索詞(我假設城市名稱)和外鍵ID上有一個復合索引,就可以正常工作。
您不希望提供完整的通配符搜索(請使用LIKE %ancouv%
來查找Vancouver),但應將搜索限制為前綴搜索( LIKE vancou%
)。 否則,索引將無濟於事,數據庫服務器將必須執行全表掃描。
測試時,請使用EXPLAIN SELECT ...
命令以確保使用了索引。 另外,您應該始終使用實際數量的測試數據進行測試。 如果只有少量測試數據,則查詢優化器可能會選擇與上述數百萬行不同的路徑。 例如,對於一個很小的表,它可能會決定執行一次完整掃描而不是索引查找可能是一種更好的方法,從而使您認為索引從未使用過。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.