사용자가 가입해야하는 시스템을 구축하는 중입니다. 이 사용자는 또한 더 큰 고객 데이터베이스의 일부가 될 가능성이 있으며 더 큰 고객 데이터베이스의 사용자 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 이외의 것을 사용해야합니까? 모든 필드 점수의 조합을 비교해야합니까?
차갑다. 그건 의미가 있습니다. 내가 언급 한 것처럼 가능한 한 최상의 데이터를 준비하고있을 것입니다. 위의 내 걱정은 데이터베이스에 기존 고객이 전혀 없을 수도 있다는 것입니다. 이 데이터가없는 행 (심지어 수집 할 수없는 주소가있을 수도 있습니다)이있을 수 있으므로 NULL과 NULL을 비교하면 완벽하게 일치합니다. – Mike
맞아요,하지만 이해가가는 것 같아요. 양쪽에있는 특정 속성에 데이터가 없으면 요인에 영향을주지 않습니다. 모든 분야의 어떤 데이터도 문제가되지는 않겠지 만 그게 유효합니다. 내가 anwer 조금 업데이트하자. – ptrk