본문 바로가기

자격증/SQLD

[SQLD][아이리포]09. 정규화 | 본질식별자 | 인조식별자

반응형

 

목차

2. 정규화
2-5. 본질식별자
2-5-1. 본질식별자로 주식별자를 구성하는 경우
2-5-2. 본질식별자의 장점
2-5-3. 본질식별자의 단점
2-6. 인조식별자
2-6-1. 인조식별자를 사용하는 이유
2-6-2. 인조식별자의 장점
2-6-3. 인조식별자의 단점

2. 정규화

본질식별자와 인조식별자는 엔터티의 데이터를 구분하기 위해 사용하는 식별자의 종류이다.

 

쉽게 말하면 데이터를 구분할 때 원래 업무에 존재하는 값을 사용할 것인지, 아니면 새로운 번호를 만들어 사용할 것인지의 차이라고 볼 수 있다.

 

📌 단일행 연산 핵심

본질식별자와 인조식별자는 올해 SQLD 시험 범위에 새로 추가된 내용이다.

2-5. 본질식별자

본질식별자란 업무에 원래 존재하는 식별자를 말한다.

다른 말로 원조식별자라고도 한다.

 

즉, 시스템에서 새로 만든 값이 아니라 실제 업무에서 이미 존재하는 값을 식별자로 사용하는 것이다.

주민등록번호, 사원번호, 상품코드, 계좌번호 등

 

여기서 중요한 것은 본질식별자는 가공되지 않은 실물의 데이터라는 것이다.

1️⃣ 본질식별자로 주식별자를 구성하는 경우

본질식별자를 주식별자로 사용한다는 것은 업무에서 원래 존재하는 값을 기본키로 사용한다는 의미이다.

 

예를 들어 아래 이미지를 보면, 주문목록 테이블의 기본키가 주문번호 + 도서번호로 구성되어 있다.

여기서 주문번호는 어떤 주문인지 구분하는 값이고 도서번호는 어떤 도서인지 구분하는 값이다.

 

즉, 주문목록 데이터는 단순히 주문번호 하나만으로 구분되지 않는다.

 

하나의 주문 안에 여러 도서가 포함될 수 있기 때문에 주문번호와 도서번호를 함께 사용해야 주문목록의 한 행을 정확하게 구분할 수 있다.

 

이처럼 업무에서 원래 존재하는 식별자를 조합하여 주식별자로 사용하는 경우를 본질식별자로 주식별자를 구성하는 경우라고 볼 수 있다.

2️⃣ 본질식별자의 장점

본질식별자를 사용하면 데이터의 중복을 막는 데 도움이 된다.

 

이미 업무적으로 유일한 값을 식별자로 사용하기 때문에 같은 데이터가 중복으로 들어갈 가능성을 줄일 수 있다.

 

예를 들어 주민등록번호를 기본키로 사용한다면 같은 주민등록번호를 가진 회원이 두 번 등록되는 것을 막을 수 있다.

 

📝 요약정리

장점 설명
데이터 중복 방지 원래 유일해야 하는 값을 식별자로 사용하므로 중복을 줄일 수 있다.
데이터 정합성 유지 같은 대상을 중복 등록하거나 잘못 연결하는 문제를 줄일 수 있다.
업무 의미 파악 용이 식별자 자체가 업무적으로 의미 있는 값을 가진다.

3️⃣ 본질식별자의 단점

업무에서 사용하는 원래 식별자가 복잡하거나, 변경될 가능성이 있거나, 보안상 직접 사용하기 어려운 경우에는 본질식별자를 사용하는 것이 단점이 될 수 있다.
기본키가 복잡해지면 다른 테이블에서 해당 데이터를 참조할 때 여러 컬럼을 함께 가져가야 하므로 조인 조건이 길어질 수 있기 때문이다.

 

또한 주민등록번호처럼 개인정보에 해당하는 값은 식별자로 사용할 수는 있지만, 보안 측면에서 직접 사용하는 것이 부담스러울 수 있다.

 

따라서 본질식별자는 데이터 정합성 측면에서는 유리하지만, 식별자가 복잡해지거나 관리가 어려워질 수 있다는 단점이 있다.


📝 요약정리

단점 설명
식별자가 복잡할 수 있음 여러 컬럼을 조합해야 하는 경우 기본키 구조가 복잡해질 수 있다
조인 조건이 길어질 수 있음 복합키를 다른 테이블에서 참조하면 여러 컬럼을 함께 사용해야 한다
변경 시 관리가 어려움 업무 규칙 변경으로 식별자 값이 바뀌면 관련 테이블에 영향을 줄 수 있다
보안상 부담이 있을 수 있음 주민등록번호처럼 민감한 값은 직접 식별자로 사용하기 부담스러울 수 있다

 

2-6. 인조식별자

인조식별자란 업무에 원래 존재하지 않지만, 식별자를 단순하게 만들기 위해 인위적으로 생성한 식별자를 말한다.

다른 말로 대리식별자라고도 한다.

 

예를 들어  다음과 같은 값이 인조식별자에 해당한다.

 

예시 설명
회원ID 시스템에서 회원을 구분하기 위해 생성한 번호
주문번호 주문을 구분하기 위해 생성한 일련번호
게시글번호 게시글을 구분히기 위해 생성한 번호
시퀀스 번호 DB에서 자동 증가 방식으로 생성한 번호

 

1️⃣ 인조식별자를 사용하는 이유

인조식별자는 보통 원래의 식별자가 너무 복잡할 때 사용한다.

 

예를 들어 아래 이미지처럼 인조식별자를 사용했다고 가정해보자.

 

기존에는 주문목록 테이블의 주식별자가 주문번호  + 도서번호로 구분되어 있었다.

하지만 두 개 이상의 컬럼을 기본키로 사용하면 다른 테이블에서 해당 데이터를 참조하거나 조인할 때 조건이 복잡해질 수 있다.

 

그래서 주문목록번호라는 인조식별자를 만들었다.

 

주문목록번호는 업무에 원래 존재하던 값은 아니지만, 주문목록의 각 행을 쉽게 구분하기 위해 인위적으로 만든 식별자이다.

 

이렇게 인조식별자를 사용하면 주문목록 테이블의 기본키는 주문목록번호 하나로 단순해진다.

 

다만, 기존에 주문목록을 구분하던 주문번호 + 도서번호 조합은 여전히 업무적으로 중요한 값이다.

따라서 주문번호 + 도서번호에 대한 인덱스를 별도로 생성해야 할 수 있다.

 

즉, 인조식별자를 사용하면 기본키 구조는 단순해지지만, 업무적으로 자주 검색하거나 중복을 관리해야 하는 컬럼에서는 별도의 인덱스나 제약조건을 설정해야 한다.

 

 

2️⃣ 인조식별자의 장점

인조식별자의 가장 큰 장점은 개발 편의성이다.

 

복잡한 컬럼 조합을 계속 사용하지 않고 하나의 식별자만 사용하면 되기 때문에  SQL 작성과 테이블 간 연결이 쉬워진다.

 

📝 요약정리

장점 설명
개발 편의성 향상 여러 컬럼 대신 하나의 식별자로 데이터를 구분할 수 있다
SQL 작성 단순화 조인 조건이나 조회 조건이 단순해질 수 있다
키 관리 용이 시퀀스나 자동 증가 값을 이용해 쉽게 생성할 수 있다
시간과 비용 절감 개발과 유지보수 과정이 단순해질 수 있다

3️⃣ 인조식별자의 단점

인조식별자는 별도의 관리가 필요하다는 단점이 있다.

 

인조식별자를 기본키로 사용하면 기본키 인덱스는 인조식별자에 생성된다.

 

예를 들어 회원 테이블에서 회원ID를 기본키로 사용하면, 기본키 인덱스는 회원ID에 생성된다.

 

하지만 실제 업무에서는 주민등록번호, 사원번호, 상품코드처럼 원래 식별자 역할을 하던 값으로 검색해야 하는 경우도 있다.

이 때 해당 컬럼에 별도의 제약조건이나 인덱스를 설정하지 않으면 중복 데이터가 발생할 수 있고, 조건 검색 성능도 떨어질 수 있다.

 

따라서 인조식별자를 사용할 때는 업무적으로 유일해야 하는 컬럼에 대해 UNIQUE 제약조건이나 인덱스를 별도로 설정하는 것이 필요하다.

 

📝 요약정리

단점 설명
데이터 중복 가능성 업무적으로 유일해야 하는 값에 별도 제약조건을 걸지 않으면 중복이 발생할 수 있다
데이터 정합성 저하 가능성 같은 대상을 다른 번호로 중복 등록할 수 있다
조건 검색 성능 문제 업무 식별자 컬럼에 인덱스가 없으면 검색 성능이 떨어질 수 있다
추가 제약조건 필요 본질식별자 역할을 하는 컬럼에 UNIQUE 제약조건 등을 별도로 설정해야 한다.

 


🔗 출처

[SQLD 모든 것]

 

 

반응형