중복 등록을 막으려고 이름에서 공백과 구분 기호를 빼고 소문자로 만들어 비교했다. 대부분은 의도대로 걸렸는데 실제 자료에서 다른 상품이 묶이는 경우가 나왔다.
Table of contents
Open Table of contents
비슷한 것을 묶는 정규화
표기만 다르고 같은 상품인 경우를 잡으려는 것이 이 정규화의 목적이었다. 괄호를 쓰든 하이픈을 쓰든 같은 값으로 만들면 묶인다.
같은 규칙이 표기 차이를 지우면서 의미 차이까지 함께 지운다. 그 두 가지를 구분하는 정보가 정규화 뒤에는 남지 않는다.
다른 규격이 묶인 지점
규격을 구분 기호로 표기하는 상품에서 그 기호가 지워지면서 다른 규격이 하나로 묶였다. 사람이 보면 명백히 다른 두 제품이었다.
정규화는 무엇이 같은지를 정하는 규칙이므로 그 규칙이 도메인의 구분을 지우면 판정이 틀린다. 이름이라는 값 자체가 확실한 동일성 기준이 아니었다.
막는 것과 알리는 것
판정을 원문 완전 일치로 바꾸고 정규화 일치는 막지 않고 알리기만 하게 했다. 비슷한 것이 있으면 목록을 보여 주고 사람이 판단한다.
확실한 것만 막고 애매한 것은 알리는 쪽으로 갈랐다. 막으면 등록이 아예 안 되므로 잘못 막았을 때의 비용이 잘못 통과시켰을 때보다 컸다.
확실한 기준은 무엇인가
이름 대신 확실한 기준을 찾으니 공급사가 주는 상품 코드와 바코드가 있었다. 그것들은 표기 차이가 없고 의미가 하나다.
코드가 있으면 데이터베이스 제약으로 막아서 코드로 뚫을 방법이 없게 했다. 이름은 경고만 하고 막힌 시도를 기록하게 했더니 며칠 뒤 그중 상당수가 다른 상품이었다는 것이 드러났다.
정규화를 남긴 자리
정규화를 아예 없애지는 않고 검색에는 계속 썼다. 검색에서 비슷한 것이 함께 나오는 것은 도움이 된다.
같은 값을 검색과 판정에 쓰되 판정 방식만 갈랐고 저장할 때는 앞뒤 공백과 연속 공백만 정리했다. 어디까지 정리할지는 사람이 봐도 같은가로 갈랐는데 구분 기호 유무는 사람이 봐도 다를 수 있어서 안 건드렸다.
정리
- 정규화는 표기 차이와 의미 차이를 함께 지운다
- 그 규칙이 도메인의 구분을 지우면 판정이 틀린다
- 이름은 확실한 동일성 기준이 아니다
- 판정은 원문 완전 일치로 하고 비슷한 것은 알린다
- 막는 것과 알리는 것을 갈라 확실한 것만 막는다
- 코드나 바코드가 있으면 제약으로 막는다
- 막힌 시도를 기록하면 잘못 막은 비율이 드러난다
- 정규화는 검색에 쓰고 판정에는 안 쓴다