Борьба с базой данных телефонных номеров MySQL - PullRequest
5 голосов
/ 23 июля 2010

Мое приложение хочет сохранить список международного телефонного номера в базе данных mysql. Тогда приложение должно будет запросить базу данных и найти конкретный номер. Звучит просто, но на самом деле это огромная проблема.

Поскольку пользователи могут искать этот номер в другом формате, нам придется каждый раз выполнять полное сканирование базы данных.

Например. У нас может быть номер 17162225555, хранящийся в базе данных (вместе с еще 5 миллионами записей). Теперь пользователь приходит и пытается выполнить поиск, используя 7162225555. Другой пользователь может попытаться выполнить поиск с помощью 2225555. и т. Д. И т. Д. Таким образом, другими словами, база данных должна выполнить SQL-запрос, используя «как% число%», что приведет к полное сканирование.

Как мы должны разработать это приложение? Есть ли способ настроить Mysql, чтобы справиться с этим лучше? Или мы вообще не должны использовать SQL?

PS. У нас миллионы записей и 10 секунд этих поисковых запросов в секунду.

1 Ответ

8 голосов
/ 23 июля 2010

Это очень странно, я сам много раз боролся с этой проблемой за последние 15 лет и обычно придумывал структуры, которые разделяют коды городов, коды стран и номера на отдельные поля и т. Д. Но, читая ваш вопрос, другой Решение только что появилось в моей голове, оно требует отдельного поля, хотя может не подойти вам.

Вы могли бы иметь отдельное поле с именем reverse_phone_number, чтобы оно автоматически заполнялось механизмом БД, тогда, когда люди будут искать просто перевернуть строку поиска и использовать индексированное обратное поле только с% в конце одинаковой строки, что позволяет использование индекса.

В зависимости от вашего механизма БД вы можете создать индекс на основе пользовательской функции, которая сделает все наоборот, устраняя необходимость в дополнительном поле.

В некоторых странах, например В Великобритании у вас могут возникнуть проблемы с ведущими нулями. Номер телефона в Великобритании представлен как (код города) (номер телефона), например, 01634 511098, когда это интернационализировано, ведущий ноль кода города удаляется и добавляются международный код набора (+ или 00) и код страны (44). Это приводит к международному номеру телефона +441634511098. Любой пользователь, выполняющий поиск 0163451109, не найдет номер телефона, если он будет введен в интернационализированном формате. Вы можете решить эту проблему, удалив начальные нули из строки поиска.

EDIT Основываясь на предложениях Олли Джонса, вы должны сохранить число, введенное пользователем, а затем убрать начальные нули, знаки пунктуации и пробелы из числа перед тем, как обратить и сохранить в обратном поле. Затем просто используйте тот же алгоритм, чтобы убрать строку поиска перед реверсом, найти запись и затем отобразить первоначально введенный номер обратно пользователю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...