2015-01-13 2 views
1

사용자가 가입해야하는 시스템을 구축하는 중입니다. 이 사용자는 또한 더 큰 고객 데이터베이스의 일부가 될 가능성이 있으며 더 큰 고객 데이터베이스의 사용자 ID로 등록을 연결하고 싶습니다.일부 불완전한 데이터에서 단일 사용자 레코드 찾기?

고객 데이터베이스가 다소 불완전합니다. 일부 고객은 전화 번호 만 갖고 있으며 입력 한 사람/장소에 따라 여러 위치에 공백이있을 수 있습니다. 다른 고객은 전자 메일 주소 만 가지고 있으며 손으로 쓰고 나중에 다른 사람이 처리하여 오타가 발생할 수 있습니다. 정말 악몽입니다.

사용자가 입력 한 시스템에 가장 가까운 레코드를 찾고 싶습니다. 이 데이터는 매우 간단하며 검증 될 것입니다. 이 데이터 :

  • DOB (YYYY-MM-DD)
  • 이메일 주소는
  • 전화 번호

내 초기 생각은을 사용하는 것입니다 Levenshtein 거리 알고리즘은 비어 있지 않은 한 필드의 각각에 대해 '문자열 거리'를 계산 한 다음 전체 점수로 정렬합니다. 멋지고 읽기 쉬운 코드를 유지하기 위해 아래 코드에 표시되지 않았지만 모든 공백을 분명히 다듬을 것입니다. 의사 코드로

: 그냥 참고로 나는 두 데이터베이스를위한 PHP (Laravel)와 MySQL을 사용하고

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)) 

.

여기 올바른 길을 가고 있습니까? 아니면 Levenshtein 이외의 것을 사용해야합니까? 모든 필드 점수의 조합을 비교해야합니까?

답변

0

트랙이 맞지만 몇 가지 노트를 추가합니다. 나는 가능한 모든 소음을 제거하기 위해 데이터를 변환하는 것이 좋습니다 일치를 위해 데이터 모두의

먼저, 준비

, f.i. (위의 "이하 3"와 같은), 둘째 불완전한 데이터

에서 가장 가까운 찾기 등의 전화 번호에서

모든 비 숫자를 제거 임의의 임계 값을 설정, 공백을 제거, 대문자로 문자열을 변환 약간 딱딱하게 만든다. 더 많은 CPU-요구하지만, 당신은 "차이의 요인"에 의해 결과를 정렬 더 좋을 수 있습니다 분명히

SELECT c.customerID 
FROM customers c 
ORDER BY 
Levenshtein(c.first_name, $first_name)) + 
Levenshtein(c.last_name, $last_name) + 
Levenshtein(c.email, $email) + 
Levenshtein(c.telephone, $telephone) asc 
LIMIT 0,1; 

, 당신은 차이가 터무니없이 높을 때 일치하지 않는 몇 가지 안전을 추가 할 수 있습니다,하지만 당신은 아이디어를 얻을 . 두 개체 모두 동일한 필드에 데이터가 부족한 경우 (예 : 둘 다 전자 메일 누락)이 방법은 여전히 ​​유효합니다. 문제가 한쪽이 없어지면 발생합니다. 그런 다음 차이점에 대해 큰 차이를 느낍니다.우리는 그것을 방지하기 위해 조금 더 쿼리를 복잡하게 될 수 있습니다

ORDER BY 
(if(c.first_name is null OR c.first_name = '' OR $first_name = '', 0, Levenshtein(c.first_name, $first_name))) + 
... 

단축 라인 하나에를 간결 - 우리는 거기의 데이터를 비교하는 경우에만 레프의 DIST를 계산합니다.

단점 당신이 인간이 결정하게하는 플래그의 일종으로 생각할 수 X보다 큰은 diff 요소와 일치하는 모든 레코드를 들어

. 얼마간의 검토를 거친 후에는 자동화하는 규칙이 더 필요하다는 것을 확신합니다.

+0

차갑다. 그건 의미가 있습니다. 내가 언급 한 것처럼 가능한 한 최상의 데이터를 준비하고있을 것입니다. 위의 내 걱정은 데이터베이스에 기존 고객이 전혀 없을 수도 있다는 것입니다. 이 데이터가없는 행 (심지어 수집 할 수없는 주소가있을 수도 있습니다)이있을 수 있으므로 NULL과 NULL을 비교하면 완벽하게 일치합니다. – Mike

+0

맞아요,하지만 이해가가는 것 같아요. 양쪽에있는 특정 속성에 데이터가 없으면 요인에 영향을주지 않습니다. 모든 분야의 어떤 데이터도 문제가되지는 않겠지 만 그게 유효합니다. 내가 anwer 조금 업데이트하자. – ptrk