sql - 挣扎于电话号码的 MySQL 数据库

标签 sql mysql database database-design

我的应用程序想要在 mysql 数据库中存储一个国际电话号码列表。然后应用程序需要查询数据库并搜索特定号码。听起来很简单,但实际上是个大问题。

因为用户可以用不同的格式搜索该号码,所以我们每次都必须对数据库进行全面扫描。

例如。我们可能将数字 17162225555 存储在数据库中(以及另外 500 万条条目)。现在用户出现并尝试使用 7162225555 进行搜索。另一个用户可能会尝试使用 2225555 等进行搜索。换句话说,数据库必须使用“like %number%”发出 SQL 查询,这将导致全面扫描。

我们应该如何设计这个应用程序?有什么办法可以让 Mysql 更好地处理这个问题吗?或者我们根本不应该使用 SQL?

附言。我们有数百万个条目,每秒有 10 个这样的搜索请求。

最佳答案

这很奇怪,在过去的 15 年里,我自己曾多次与这个问题作斗争,并且通常想出将区号、国家代码和号码分成不同字段等的结构。但是在阅读你的问题时,另一个解决方案突然出现在我的脑海中,它确实需要一个单独的字段,但可能不适合您。

您可以有一个名为 reverse_phone_number 的单独字段,让数据库引擎自动填充它,然后当人们搜索时只需反转搜索字符串并使用索引的反向字段,在 like 字符串的末尾只有一个 %,从而允许索引的使用。

根据您的数据库引擎,您可以根据用户定义的函数创建索引,该函数为您执行相反的操作,从而避免需要额外的字段。

在一些国家,例如英国,您可能对前导零有疑问。英国电话号码表示为(区号)(电话号码),例如01634 511098,当这是国际化时,区号的前导零被删除,并添加了国际拨号代码(+ 或 00)和国家代码(44)。这导致国际电话号码为 +441634511098。如果以国际化格式输入,任何搜索 0163451109 的用户都找不到该电话号码。您可以通过从搜索字符串中删除前导零来解决此问题。

编辑 根据 Ollie Jones 的建议,您应该存储用户输入的数字,然后在反转和存储在反转字段中之前从数字中去除前导零、标点符号和空格。然后简单地使用相同的算法在反转之前剥离搜索字符串,找到记录,然后将最初输入的数字显示给用户。

关于sql - 挣扎于电话号码的 MySQL 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3321802/

相关文章:

sql - 获取 Swift 中的数据和数据库中的数据的差异

sql - mysql中使用索引进行整数比较

javascript - PHP 表单不会提交到基于 javascript 的 MYSQL 数据库

database - 使 Postgresql 最小尺寸。如何?

mysql - 对具有一对多关系的 3 个表进行 SQL 查询

php - 如何防止 PHP 中的 SQL 注入(inject)?

mysql - 从mysql中的选定行数中查找行的行索引

mysql - "Error ... Could not load file or assembly ' MySql.Data.Entity.EF5,版本=6.9.9.0 ...”

php - 计算 PHP 中的访问者并保存到数据库

database - 使用 :new and :old referencing different tables in SQL