ero*_*ppa 5 mysql sql database database-design
我的应用程序想要在mysql数据库中存储国际电话号码列表.然后,应用程序需要查询数据库并搜索特定的数字.听起来很简单,但实际上这是一个很大的问题.
由于用户可以使用不同的格式搜索该号码,因此我们每次都必须对数据库进行全面扫描.
例如.我们可能将数字17162225555存储在数据库中(以及另外500万个条目).现在用户出现并尝试使用7162225555进行搜索.另一个用户可能会尝试搜索2225555等等.换句话说,数据库必须使用"like%number%"发出SQL查询,这将导致全扫描.
我们该如何设计这个应用程序?有没有办法调整Mysql以更好地处理这个问题?或者我们根本不应该使用SQL?
PS.我们每秒有数百万个条目和10个搜索请求.
这很奇怪,在过去的15年里,我一直在努力解决这个问题很多次,并且通常会提出将区号,国家代码和数字分成单独的字段等的结构.但在阅读你的问题时,另一个解决方案刚刚爆发在我的脑海里,它确实需要一个单独的领域,所以可能不适合你.
您可以有一个名为reverse_phone_number的单独字段,由数据库引擎自动填充,然后当人们搜索时,只需反转搜索字符串并使用索引的反向字段,只需在同一字符串末尾有一个%,从而允许使用指数.
根据您的数据库引擎,您可以基于用户定义的函数创建索引,该函数可以反过来为您提供额外的字段.
在某些国家/地区,例如英国,您可能会遇到前导零问题.英国电话号码表示为(区号)(电话号码),例如01634 511098,当国际化时,区域代码的前导零被删除,国际拨号代码(+或00)和国家代码(44)是添加.这导致国际电话号码为+441634511098.搜索0163451109的任何用户如果以国际化格式输入,将找不到电话号码.您可以通过从搜索字符串中删除前导零来克服此问题.
编辑 根据Ollie Jones的建议,您应该存储用户输入的数字,然后在反转和存储在反转字段之前从数字中删除前导零,标点符号和空格.然后,只需使用相同的算法在反转之前去除搜索字符串,找到记录,然后将最初输入的数字显示给用户.
| 归档时间: |
|
| 查看次数: |
2187 次 |
| 最近记录: |