Skip to content
isdnetworks
Go back

중복되는 말단 코드

외부에서 받은 카테고리 삼천 건을 데이터베이스의 기존 목록과 비교해 신규만 뽑아야 했다. 기존 행의 형식을 보다가 말단 코드로 행을 찾으면 여러 개가 나오는 것을 발견했다.

Table of contents

Open Table of contents

여러 곳에 있는 같은 말단 코드

같은 말단 코드가 서로 다른 상위 경로 아래에 각각 존재하고 있었다. 말단 코드는 형제 안에서만 유일하고 트리 전체에서는 유일하지 않았다.

표로 펼쳐 놓고 보면 그냥 코드 컬럼처럼 보이므로 식별자로 쓰고 싶어진다. 계층 구조를 평평한 표로 볼 때 생기는 착시였다.

유니크 제약이 걸린 자리

테이블을 보니 유니크 제약이 말단 코드가 아니라 전체 경로 코드에 걸려 있었다. 외부 응답도 말단 코드와 전체 경로를 나란히 담고 있었다.

두 값이 나란히 있으면 어느 쪽이 키인지는 응답만 봐서는 알 수 없다. 어느 컬럼이 식별자인지는 스키마의 유니크 제약이 알려 주고 그것을 확인하지 않으면 짧은 쪽을 쓰게 된다.

틀려도 오류가 안 나는 이유

말단 코드로 중복을 제거하면 서로 다른 카테고리가 하나로 합쳐지고 신규 항목이 조용히 빠진다. 말단 코드로 조인하면 엉뚱한 행이 매칭되어 갱신이 다른 카테고리에 들어간다.

두 경우 다 쿼리는 성공하고 건수도 그럴듯하게 나온다. 사후에 발견하려면 누군가 특정 카테고리가 이상하다고 말해 줘야 하므로 발견 시점이 한참 뒤가 된다.

스크립트 안의 집합 연산

삼천 건 비교를 임시 테이블에 넣고 조인하는 방법도 있지만 대량 삽입문을 만들어야 하고 도구가 한 번에 문장 하나만 실행해서 번거로웠다. 응답과 조회 결과를 각각 전체 경로를 키로 하는 사전으로 만들어 집합 연산으로 비교했다.

키 집합의 차집합으로 신규와 삭제가 나오고 교집합에서 이름이 다른 것으로 변경이 나온다. 이번 결과는 신규만 백 건이고 이름 변경과 삭제는 없었다.

신규와 변경과 삭제

차이를 하나의 숫자로 보고하지 않고 세 갈래로 나눠 적었다. 백 건 차이라고만 하면 그것이 전부 신규인지 신규와 삭제가 섞인 것인지 알 수 없다.

삭제가 있으면 성격이 완전히 다른 이야기가 되는데 외부에서 카테고리를 접었다는 뜻이고 그 아래 붙은 상품을 어떻게 할지 정해야 한다. 이번에는 삭제가 없어서 신규만 넣으면 되는 작업으로 끝났다.

정리


Share this post on:

Previous Post
의미의 정본은 코드다
Next Post
아무도 강제하지 않으면 안 깨진다