2010-07-23 69 views
5

我的應用程序想要將國際電話號碼列表存儲在mysql數據庫中。然後應用程序需要查詢數據庫並搜索特定的數字。聽起來很簡單,但它實際上是一個巨大的問題。掙扎着一個MySQL數據庫的電話號碼

由於用戶可以用不同的格式搜索該號碼,我們必須每次都對數據庫進行全面掃描。

例如。我們可能會將數字17162225555存儲在數據庫中(還有500萬條記錄)。現在用戶出現並嘗試使用7162225555進行搜索。另一個用戶可能試圖用2225555等進行掃描。換句話說,數據庫必須使用「like%number%」來發出SQL查詢,這會導致全面掃描。

我們應該如何設計這個應用程序?有什麼方法可以調整Mysql來更好地處理這個問題嗎?或者我們應該不使用SQL?

PS。我們有數百萬條目,每秒有10個這樣的搜索請求。

+0

你可以構造應用程序來輸入特定的字段,然後打破數字。 I.E.國家代碼,7位數字等等。然後,您將匹配索引列而不是全文搜索。 – JNK 2010-07-23 19:45:32

+0

你只存儲美國號碼,還是你有國際號碼?如果它只是美國的數字,應該很容易按照JNK的建議格式化數字。如果你使用的是國際電話號碼,我懷疑它會困難得多。 – 2010-07-23 19:49:31

+0

這個相關的問題討論了國際數字分解爲組成部分,如果這是你想要的方式http://stackoverflow.com/questions/2543938/how-to-split-mobile-number-into-country-code -area-code-and-local-number/2544066#2544066 – 2010-07-23 20:01:46

回答

8

這很奇怪,在過去的15年中,我一直在努力解決這個問題,並且通常會將區號,國家代碼和號碼分隔成不同的字段等結構。但是在閱讀您的問題時另一個解決方案剛剛進入我的腦海,它確實需要一個單獨的領域,所以可能不適合你。

你可以有一個單獨的字段叫做reverse_phone_number,讓數據庫引擎自動填充這個字段,然後當人們搜索時只是簡單地顛倒搜索字符串,並在類似字符串的末尾使用帶有索引的反向字段,索引的使用。

取決於您的數據庫引擎,您可以基於用戶定義的函數創建索引,該函數反過來可以避免需要額外的字段。

在一些國家,例如,英國,你可能會遇到一個前導零的問題。英國電話號碼錶示爲(區號)(電話號碼),例如01634 511098,當這是國際化時,地區代碼的前導零被刪除,國際撥號代碼(+或00)和國家代碼(44)被添加。這導致國際電話號碼爲+441634511098。任何搜索0163451109的用戶如果以國際化格式輸入,都不會找到該電話號碼。您可以通過從搜索字符串中刪除前導零來克服此問題。基於從奧利·瓊斯的建議

編輯 你應該存儲的號碼作爲用戶輸入,然後倒車,並在反場存儲之前,從數剝離前導零,標點和空格。然後,只需使用相同的算法在倒車之前去除搜索字符串,找到記錄,然後將原來輸入的號碼顯示回給用戶。

+0

Steve說反向#領域是天才。 – JNK 2010-07-23 19:56:08

+0

爲了確保我明白你的意思,你有第二個表存儲他們所有的查詢,一個橋表匹配它帶來的電話號碼?爲每個新的查詢自動填充,所以如果有人進入現有的搜索,它只會看看舊的結果?漂亮的想法。 – Tarka 2010-07-23 19:56:22

+1

doh!你幾秒鐘就打敗了我。我認爲reverse_phone_number字段是一個非常好的解決方案,只要我們可以假設用戶總是知道他們正在搜索的電話號碼的最後幾位。 – 2010-07-23 19:57:08