Учитывая, что количество цифр в добавочном номере может быть разным для каждой компании и количество цифр в номере может быть разным для каждой страны и кода города, это сложная задача для эффективного решения ,
Даже если вы разбили таблицу данных на базовый номер и добавочный номер, вам все равно придется разделить входящий номер на базовый номер и добавочный номер, что, на мой взгляд, усложняет ситуацию.
Я бы хотел попробовать:
Оригинальный формат
- Попробуйте сопоставить входящий номер с базой данных.
- Если он соответствует одной записи, у вас есть ответ - конкретный человек.
- Если он соответствует более чем одной записи, что-то пошло не так, поэтому не удалось.
- В противном случае вы должны найти компанию:
- Снимите конечную цифру с входящего номера и попробуйте снова сопоставить ее с базой данных.
- Если количество цифр падает ниже порогового значения (вероятно, 6 цифр), то ваш поиск, вероятно, должен завершиться неудачей. Это просто для ограничения количества поисков в базе данных, которые не будут найдены.
- Если он не соответствует ни одной записи, вам нужно повторить этот шаг.
- Если он соответствует более чем одной записи, значит, что-то пошло не так, поэтому не удалось.
- Если он соответствует ровно одной записи, у вас будет следующий лучший ответ - компания.
Например, поиск "+43123456777":
- + 43123456777 соответствует 0 записей.
- + 4312345677 соответствует 0 записей.
- + 431234567 соответствует 1 записи: "Компания A"
Основным режимом сбоя этого подхода является наличие у компании добавочных номеров переменной длины. Например, рассмотрим, что произойдет, если и 431234567890, и 43123456789 являются действительными числами, но только второй находится в базе данных. Если входящий номер 431234567890, то 43123456789 будет совпадать с ошибкой.
Сплит формат
Это немного сложнее, но надежнее.
- Попробуйте сопоставить входящий номер с базой данных.
- Если он соответствует одной записи, у вас есть ответ - компания.
- Если он соответствует более чем одной записи, сопоставьте запись без расширения, и вы нашли компанию.
- В противном случае вам нужно найти номер базовой компании и добавочный номер:
- Снимите конечную цифру с входящего номера и попробуйте снова сопоставить ее с базой данных.
- Если количество цифр падает ниже порогового значения (вероятно, 6 цифр), то ваш поиск, вероятно, должен завершиться неудачей. Это просто для ограничения количества поисков в базе данных, которые не будут найдены.
- Если он не соответствует ни одной записи, вам нужно повторить этот шаг.
- Если он соответствует одной записи, значит, вы нашли свой ответ - компания.
- Если он соответствует более чем одной записи, то вы нашли базовый номер компании и, таким образом, теперь знаете расширение, поэтому можете попытаться найти конкретного человека:
- Снимите базовый номер с начала исходного входящего номера и используйте его для поиска расширений записей с этим базовым номером.
- Если он соответствует ровно одной записи, вы нашли конкретного человека.
- Если это не соответствует конкретному человеку, сопоставьте запись без расширения, и вы нашли компанию.
Например, поиск "+43123456777":
- + 43123456777 соответствует 0 записей.
- + 4312345677 соответствует 0 записей.
- + 431234567 соответствует 2 записям: "empty: Company A" & "890: сотрудник компании A"
- В этих двух совпадениях "77" ничего не соответствует, поэтому верните пустое расширение: "Компания A".
Замечания по реализации
Этот алгоритм, как отмечено выше, имеет некоторые проблемы с эффективностью. Если поиск в базе данных является дорогостоящим, он имеет линейную стоимость, связанную с длиной телефонного номера, особенно в случае, когда в базе данных нет похожих номеров (например, если входящий номер из Казахстана, но нет Казахстана) числа в базе данных * 8 ').
Вы можете относительно легко добавить некоторые оптимизации. Если большинство компаний, с которыми вы работаете, используют расширения из 3 или 4 цифр, вы можете начать с удаления, скажем, 4 цифр с конца, а затем выполнить двоичный код, пока не найдете ответ. Это уменьшит число из 15 цифр до 4 или 5 во многих случаях и не более 6 поисков.
Кроме того, каждый раз, когда вы сужаете выбор, вы можете выбирать только в пределах предыдущего выбора, а не выбирать во всей базе данных.
Дополнительные замечания по реализации
Наконец-то выяснив, как работает Неразумный ответ , я вижу, что это гораздо более простое, более элегантное решение. Хотелось бы мне хотя бы просто найти номер базы данных во входящем номере, а не наоборот.
Меня беспокоит только то, что выполнение этого для каждого telephonenumber
в базе данных может привести к чрезмерным нагрузкам на сервер. Я бы предложил сравнить это решение с максимальной нагрузкой и посмотреть, не вызовет ли оно проблем. Если нет, хорошо - используйте это. Если это произойдет, рассмотрите возможность реализации простой формы моего алгоритма и повторного проведения стресс-тестов. Если производительность все еще слишком низкая, попробуйте мое предложение двоичного поиска.