인터뷰에서 식별자에 대한 단서를 찾아보자
이제 온라인 쇼핑몰 담당자와의 인터뷰 내용을 살펴보자.
Q1. 고객은 어떻게 구분하는가?
분석가: 고객을 구분하기 위해 사용하는 값이 있는가?
담당자: 회원 가입을 하면 고객번호를 자동으로 부여한다.
분석가: 고객번호가 같은 고객이 두 명 존재할 수 있는가?
담당자:그럴 수 없다. 고객마다 서로 다른 고객번호가 부여된다.
분석가: 고객번호는 나중에 바뀔 수 있는가?
담당자: 바뀌지 않는다. 고객이 이름이나 연락처, 이메일을 바꾸더라도 고객번호는 그대로다.
분석가: 탈퇴한 고객의 고객번호를 새 고객에게 다시 부여하는가?
담당자: 재사용하지 않는다. 탈퇴한 고객의 주문 이력도 남겨야 하기 때문이다.
이 인터뷰에서 고객번호는 좋은 식별자 후보로 보인다.
고객마다 값이 다르고 값이 변경되지 않는다. 탈퇴 이후에도 재사용하지 않는다.
고객의 다른 정보가 바뀌어도 동일한 고객을 계속 가리킨다.
Q2. 이메일도 고객을 구분할 수 있는가?
분석가:이메일은 중복될 수 있는가?
담당자:현재는 같은 이메일로 두 번 가입할 수 없다.
분석가:고객이 이메일을 변경할 수 있는가?
담당자:가능하다.
분석가:고객이 탈퇴하면 해당 이메일을 다른 사람이 사용할 수 있는가?
담당자:일정 기간이 지나면 다시 사용할 수 있다.
이메일은 한 시점에서는 유일할 수 있다. 하지만 값이 변경될 수 있다. 탈퇴 후에도 재사용될 수 있다.
따라서 이메일은 고객의 생애 전체를 안정적으로 식별하기 어렵다.
이메일에 중복 방지 규칙을 적용할 수는 있다.
하지만 고객의 대표 식별자로 선택하는 것은 조심해야 한다.
여기서 중요한 점이 있다.
변경 가능한 속성이라고 해서 후보식별자가 절대로 될 수 없는 것은 아니다.
업무 규칙상 유일성이 보장된다면 후보가 될 수 있다.
다만 변경 가능성이 높은 값을 주식별자로 선택하면 그 값을 참조하는 다른 엔터티까지 영향을 받을 수 있다.
고객 이메일을 주문의 외래키로 사용했다고 해보자.
고객이 이메일을 바꾸면 주문에 저장된 고객 이메일도 함께 변경해야 한다.
주문이 수백 건이라면 수백 행이 영향을 받을 수 있다.
참조 관계가 더 많다면 변경 범위는 더 커진다.
식별자는 단순히 유일한 값이 아니라, 관계의 기준으로도 사용된다.
따라서 주식별자는 가능하면 안정적이어야 한다.
본질식별자와 인조식별자
고객의 이메일처럼 업무에서 원래 사용하던 값을 식별자로 사용할 수 있다.
상품의 국제표준도서번호, 국가코드, 사업자등록번호, 사번처럼 업무 자체에서 만들어지고 사용되는 값도 있다.
이러한 업무적 속성을 이용한 식별자를 본질식별자 또는 자연키라고 부른다.
반면 고객일련번호, 주문일련번호처럼 시스템이 식별을 목적으로 새롭게 만든 값을 인조식별자 또는 대리키라고 부른다.
예를 들어 다음과 같은 고객 엔터티가 있다고 해보자.
| 속성 | 설명 |
| 고객일련번호 | 시스템이 자동 부여하는 값 |
| 이메일 | 회원 로그인에 사용하는 값 |
| 고객명 | 고객의 이름 |
| 연락처 | 고객의 연락처 |
| 가입일 | 회원 가입일 |
이때 고객일련번호를 주식별자로 선택하면 인조식별자를 사용한 것이다.
이메일을 주식별자로 선택하면 본질식별자를 사용한 것이다.
둘 중 하나가 무조건 옳은 것은 아니다.
중요한 것은 업무 규칙이다.
이메일이 절대 변경되지 않고, 탈퇴 후에도 재사용되지 않으며, 모든 관련 시스템에서 동일한 기준으로 사용된다면 이메일을 주식별자로 선택할 수 있다.
하지만 이메일이 변경되거나 재사용될 수 있다면 별도의 고객일련번호를 두는 것이 안정적이다.
인조식별자는 업무적 의미가 거의 없다.
고객일련번호 1057이라는 숫자만 보아서는 고객의 이름도 이메일도 알 수 없다.
하지만 업무 속성의 변화로부터 식별자를 분리할 수 있다는 장점이 있다.
반대로 본질식별자는 값 자체에 업무 의미가 있다.
별도의 식별자를 추가하지 않아도 된다.
하지만 업무 규칙이 바뀌어 값이 변경되면 참조 관계에 영향을 줄 수 있다.
따라서 “자연키가 옳다” 또는 “대리키가 옳다”처럼 하나의 방식만 고집해서는 안 된다.
다음 질문을 통해 판단해야 한다.
- 값이 실제로 유일한가?
- 유일성이 업무 규칙으로 보장되는가?
- 값이 변경될 수 있는가?
- 값이 재사용될 수 있는가?
- 값의 생성 주체가 누구인가?
- 외부 기관이나 다른 시스템의 정책에 의존하는가?
- 여러 속성을 조합해야 하는가?
- 다른 엔터티가 이 값을 얼마나 많이 참조하는가?
주문번호는 업무식별자인가, 인조식별자인가
주문번호는 조금 애매하다.
고객에게 다음과 같은 주문번호가 보인다고 해보자.
ORD-20260714-000123
이 번호는 주문일자와 일련번호를 조합하여 시스템이 생성했다.
고객은 이 번호로 주문을 조회한다.
고객센터도 이 번호로 주문을 검색한다.
택배 문의나 환불 문의에도 사용된다.
주문번호는 시스템이 만든 값이라는 점에서는 인조식별자처럼 보인다.
하지만 실제 업무에서 주문을 찾고 소통하기 위해 사용된다는 점에서는 업무식별자의 성격도 가진다.
이처럼 모든 식별자가 본질식별자와 인조식별자로 명확하게 나뉘는 것은 아니다.
중요한 것은 이름을 분류하는 일이 아니다.
식별자의 역할을 이해하는 일이다.
주문번호가 다음 조건을 만족한다면 주문의 주식별자로 사용할 수 있다.
- 주문마다 유일하다.
- 주문 생성 이후 변경되지 않는다.
- 취소되거나 삭제된 주문의 번호를 재사용하지 않는다.
- 주문 이력이 유지되는 동안 계속 같은 주문을 가리킨다.
다만 주문번호에 너무 많은 의미를 넣는 것은 조심해야 한다.
주문번호에 주문일자, 채널, 지역, 고객등급, 상품분류를 모두 포함했다고 해보자.
SEOUL-VIP-MOBILE-20260714-000123
처음에는 번호만 보고 많은 정보를 알 수 있어 편리해 보인다.
하지만 고객등급이 바뀌면 어떻게 할 것인가?
주문 채널의 분류체계가 바뀌면 어떻게 할 것인가?
지역 코드가 통합되면 어떻게 할 것인가?
식별자에 포함된 의미가 변경될 때마다 식별자 변경 문제가 생긴다.
식별자는 가능한 한 안정적이어야 한다.
변경 가능한 업무 속성을 식별자에 지나치게 포함하면 식별자가 업무 변화에 종속된다.
주문상품은 무엇으로 구별해야 할까
주문에는 여러 상품이 포함될 수 있다.
따라서 주문상품 엔터티가 필요하다.
이제 주문상품의 식별자를 정해야 한다.
처음에는 다음 조합을 생각할 수 있다.
주문번호 + 상품번호
주문 1001번에 상품 A와 상품 B가 들어 있다면 다음처럼 구별할 수 있다.
| 주문번호 | 상품번호 | 수량 |
| 1001 | A | 2 |
| 1001 | B | 1 |
하나의 주문에서 같은 상품은 한 줄로 합치고 수량만 증가시키는 업무라면 주문번호와 상품번호의 조합으로 주문상품을 식별할 수 있다.
이것을 복합식별자라고 한다.
복합식별자는 두 개 이상의 속성을 조합하여 인스턴스를 식별하는 방식이다.
여러 컬럼으로 기본키를 구성하면 개별 컬럼에는 중복이 있을 수 있지만 컬럼 조합 전체는 유일해야 한다.
하지만 인터뷰에서 다음과 같은 내용이 나왔다고 해보자.
Q3. 같은 상품이 주문 안에 두 번 들어갈 수 있는가?
분석가: 하나의 주문에 같은 상품이 두 번 들어갈 수 있는가?
담당자: 수량만 다르면 한 줄로 합친다.
분석가: 상품 옵션이 다르면 어떻게 되는가?
담당자:옵션이 다르면 별도의 주문상품으로 처리한다. 같은 티셔츠라도 빨간색 대형과 파란색 중형은 서로 다른 주문 항목이다.
분석가: 같은 상품과 같은 옵션이라도 판매자가 다르면 어떻게 되는가?
담당자: 오픈마켓이므로 판매자가 다르면 별도의 항목이다.
이제 주문번호와 상품번호만으로는 주문상품을 식별할 수 없다.
상품번호가 같더라도 옵션과 판매자가 다를 수 있기 때문이다.
그러면 다음 조합을 사용할 수 있다.
주문번호 + 상품번호 + 옵션번호 + 판매자번호
업무 규칙상 이 조합이 항상 유일하다면 복합식별자가 될 수 있다.
하지만 식별자가 점점 길어진다.
다른 엔터티가 주문상품을 참조할 때도 이 네 개의 값을 모두 가져가야 할 수 있다.
배송상품, 취소상품, 반품상품, 환불상품이 주문상품을 참조한다면 각각 네 개의 외래키 컬럼이 필요해진다.
이 경우 주문상품일련번호를 별도로 만들 수 있다.
| 주문상품일련번호 | 주문번호 | 상품번호 | 옵션번호 | 판매자번호 |
| 50001 | 1001 | A | RED-L | S01 |
| 50002 | 1001 | A | BLUE-M | S02 |
주문상품일련번호를 주식별자로 사용한다.
그러면서 업무적으로 중복되어서는 안 되는 조합에는 별도의 유일성 제약을 둘 수 있다.
주문번호 + 상품번호 + 옵션번호 + 판매자번호
이 구조에서는 두 가지를 모두 관리한다.
주문상품일련번호는 관계 연결을 단순하게 만든다.
업무 속성 조합의 유일성 제약은 잘못된 중복 주문상품이 생성되는 것을 막는다.
인조식별자를 사용한다고 해서 업무식별자를 버리는 것은 아니다.
이 점이 중요하다.
인조식별자를 만들면 중복 문제가 해결될까
다음 주문상품 데이터를 보자.
| 주문상품일련번호 | 주문번호 | 상품번호 | 옵션번호 |
| 50001 | 1001 | A | RED-L |
| 50002 | 1001 | A | RED-L |
주문상품일련번호는 서로 다르다.
따라서 기본키 중복은 발생하지 않는다.
하지만 업무적으로는 같은 주문 안에 같은 상품과 같은 옵션이 중복 등록되었다.
하나의 주문에서 같은 상품과 옵션을 한 줄로 합쳐야 한다는 업무 규칙이 있다면 이 데이터는 잘못된 데이터다.
인조식별자만 사용하고 업무적 유일성 조건을 관리하지 않으면 이런 중복을 막을 수 없다.
인조식별자는 각 행을 기술적으로 구별한다.
그러나 그 행이 업무적으로 중복인지까지 자동으로 판단하지는 않는다.
따라서 인조식별자를 사용할 때는 반드시 질문해야 한다.
이 엔터티에서 업무적으로 중복되면 안 되는 속성 조합은 무엇인가?
고객일련번호를 사용하더라도 현재 사용 중인 이메일이 중복되면 안 될 수 있다.
상품일련번호를 사용하더라도 상품코드가 중복되면 안 될 수 있다.
주문상품일련번호를 사용하더라도 주문번호, 상품번호, 옵션번호의 조합이 중복되면 안 될 수 있다.
기본키만 만들었다고 식별자 설계가 끝나는 것은 아니다.
업무적 유일성도 함께 설계해야 한다.
'Tech > DB Design' 카테고리의 다른 글
| 식별자 설계 - 4 (0) | 2026.08.02 |
|---|---|
| 식별자 설계 - 3 (0) | 2026.08.02 |
| 정규화-3 (0) | 2026.07.08 |
| 정규화-2 (0) | 2026.07.08 |
| 정규화-1 (0) | 2026.07.04 |
댓글