2010-07-23 82 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