Я нахожусь в процессе создания системы, в которой пользователи должны зарегистрироваться. Эти пользователи, вероятно, также будут частью более крупной базы данных клиентов, и я хотел бы связать регистрацию с идентификатором пользователя в более крупной базе данных клиентов.
База данных клиентов несколько неполная. У некоторых клиентов просто есть номер телефона, и в нем могут быть пробелы в разных местах в зависимости от того, кто/что ввел его. У других клиентов есть только адрес электронной почты, и в нем вполне могут быть опечатки из-за того, что он был написан от руки, а затем обработан кем-то другим. Настоящий кошмар на самом деле.
Я хотел бы найти ближайшую запись к тому, что пользователь ввел в систему, которую я создаю. Эти данные довольно просты и будут проверены. Эти данные:
- Имя
- Фамилия
- Дата рождения (ГГГГ-ММ-ДД)
- Адрес электронной почты
- Номер телефона
Моя первоначальная мысль состоит в том, чтобы использовать алгоритм расстояния Левенштейна для вычисления «расстояния между строками» для каждого из полей, если они не пусты, а затем упорядочить по общему баллу. Не показано в приведенном ниже коде, чтобы все было красиво и читабельно, но я, очевидно, обрежу (возможно, даже просто удалю) все пробелы.
Как псевдокод:
SELECT c.customerID
FROM customers c
WHERE ( c.first_name IS NULL OR ( Levenshtein(c.first_name, $first_name) < 3 ) )
AND ( c.last_name IS NULL OR ( Levenshtein(c.last_name, $last_name) < 3 ) )
AND ( c.email IS NULL OR ( Levenshtein(c.email, $email) < 3 ) )
AND ( c.telephone IS NULL OR ( Levenshtein(c.telephone, $telephone) < 3 ) )
Просто к вашему сведению, я использую PHP (Laravel) и MySQL для обеих баз данных.
Я на правильном пути или мне следует использовать что-то другое, кроме Левенштейна? Должен ли я сравнить какую-то комбинацию оценок всех полей?