2025. 10. 14. 17:42ㆍTIL
1. 정규화(Normalization)
1) 정규화의 정의
데이터 모델링에서 정규화는 데이터에 대한 중복성을 제거해, 데이터 모델의 성능을 향상시키는 것을 의미한다.
조회하고자 하는 데이터를 한 table에 고정하여 조회 과정에서 불필요한 연산을 하지 않게 한다.
그러나 정규화가 항상 데이터 조회 성능을 향상시키는 것은 아니다.
다만 데이터를 입력, 수정, 삭제하는 데이터 관리 측면에서는 중복 요소가 줄어들기 때문에 성능이 향상된다.
2) 정규화 관련 용어
| 정규화(Normalization) | 데이터의 일관성 유지, 중복 방지를 통한 데이터 유연성을 높이기 위해 데이터를 작은 단위로 분해하는 과정 |
| 정규형(NF, Normal Form) | 정규화를 통해 얻어진 결과물 정규화 단계에 따라 1~5까지의 NF가 있다. |
| 함수적 종속성(FD, Functional Dependency) | 특정 속성값을 알면 다른 속성의 속성값을 알 수 있는 경우 (ex. 주식별자와 일반 속성) 함수적 종속성이 있다고 한다. |
3) 정규화의 이점
| 데이터의 유연성 | 데이터의 응집도가 높아지고, 결합도는 낮아진다. 응집도 : 데이터 요소들이 관련되어 있는 정도 결합도 : 데이터 요소들이 상호 의존하는 정도 |
| 데이터의 재활용성 | 정규화를 통해 데이터 개념을 세분화하면 각 개념을 재활용할 수 있는 가능성이 높아진다. |
| 데이터의 중복 최소화 | 정규화를 통해 식별자가 아닌 속성의 중복을 줄일 수 있다. |
4) 정규화의 유형
| 제1정규화(1NF) | 한 속성에 여러 개의 속성값이 포함된 경우, 해당 속성을 분리하는 과정 또한 같은 유형의 속성이 분리되어 있는 경우, 통합하여 행으로 변환하는 과정 |
| 제2정규화(2NF) | 제1정규화를 만족하고, PK가 아닌 모든 칼럼을 PK에 종속시키는 과정 PK에 종속되지 않는 칼럼들은 분리하여 새로운 table로 만든다. |
| 제3정규화(3NF) | 제2정규화를 만족하고, 일반 속성들 사이에 함수적 종속성이 있는 경우 이를 분리하는 과정 |
2. 반정규화
반정규화는 정규화와 반대되는 과정을 의미하며, 목적은 정규화와 동일하게 데이터 모델의 성능 향상이다.
DB는 일반적으로 읽기 연산량이 추가, 수정, 삭제 등 쓰기 연산량보다 압도적으로 많다.
이러한 경우 정규화를 통해 중복을 제거하고 table을 세밀하게 분리한 모델은 읽기 속도가 느려지게 되고, 심할 경우 DB가 다운되는 일도 발생할 수 있다.
그래서 반정규화를 통해 데이터의 중복을 추가하여 조회(읽기) 성능을 향상시킨다.
1) 반정규화 절차
반정규화 대상 조사 ➡️ 다른 방법 유도 검토 ➡️ 반정규화 적용
'다른 방법 유도 검토'라는 항목이 있는 것에서 알 수 있듯이 반정규화는 필수적인 절차는 아니다.
2) 반정규화 방법
I. 테이블 반정규화
테이블 반정규화엔 테이블 병합, 테이블 분할, 테이블 추가 등의 방법이 있다.
II. 칼럼 반정규화
칼럼 반정규화엔 중복 칼럼 추가, 파생 칼럼 추가, 이력 테이블 칼럼 추가, PK에 의한 칼럼 추가, 응용 시스템의 오작동 대비 칼럼 추가 등의 방법이 있다.
III. 관계 반정규화
관계 반정규화에는 중복 관계 추가가 있다. (테이블 조인의 경로가 길 경우 조인 연산을 줄이기 위해 사용)
3. 관계와 조인
1) 관계(Relationship)
관계형 데이터베이스(RDB)에서 관계는 테이블 간의 연결을 의미한다.
두 엔티티 사이의 논리적인 연결, 엔티티가 서로 존재/행위로써 서로에게 영향을 주는 것이다.
주요 관계 유형은 다음과 같다.
| 1:1 (One-to-One) | 한 테이블의 한 데이터가 다른 테이블의 하나의 데이터와만 연결되는 관계 |
| 1:M (One-to-Many) | 한 테이블의 한 데이터가 다른 테이블의 여러 데이터와 연결되는 관계 (가장 흔한 관계 유형) |
| N:M (Many-to-Many) | 한 테이블의 여러 데이터가 다른 테이블의 여러 데이터와 연결되는 관계 |
2) 조인(Join)
두 개 이상의 테이블을 연결하여 데이터를 검색하는 데 사용하는 방법
| 조인의 유형 | |
| 내부 조인(Inner Join) | 두 테이블의 교집합을 반환. 두 테이블 모두에서 일치하는 레코드만 반환. |
| 왼쪽 외부 조인(Left Outer Join) | 왼쪽 테이블의 모든 레코드와 일치하는 오른쪽 테이블의 레코드 반환. 일치하는 레코드가 없는 경우 NULL 반환. |
| 오른쪽 외부 조인(Right Outer Join) | 오른쪽 테이블의 모든 레코드와 일치하는 왼쪽 테이블의 레코드 반환. 일치하는 레코드가 없는 경우 NULL 반환. |
| 전체 외부 조인(Full Outer Join) | 두 테이블의 합집합을 반환. 일치하지 않는 레코드는 NULL 반환. |
4. 트랜잭션(Transaction)
1) 정의
트랜잭션은 데이터베이스의 논리적인 연산 단위로, 데이터베이스는 트랜잭션 단위로 동작한다.
특정 기능에는 매우 많은 단계적인 과정이 포함되는데, 이때 중간에 ERROR가 발생할 경우 table에 저장되었던 모든 과정을 삭제하고 다시 처음으로 돌아가야 한다. (Rollback)
이 과정은 매우 복잡하고 자원의 소모가 크기 때문에, 특정 과정이 완료되기 전까지는 DB에 진행 과정을 저장하지 않고 기다리는 시점의 설정이 필요하다. 이렇게 정의된 하나의 연산 묶음을 트랜잭션이라고 정의한다.
2)트랜잭션의 진행 과정
시작 ➡️ 작업 수행 ➡️ 확인(Commit) ➡️ 끝
↖️롤백(Rollback) ⬅️ 에러 ↙️
트랜잭션의 단계적인 모든 작업이 성공적으로 마무리되면, 확인 과정을 거쳐 최종 결과를 DB에 반영한다.
그러나 작업 수행 과정에서 에러가 발생한 경우, 롤백을 통해 모든 작업을 취소하고 트랜잭션의 시작 단계로 가서 다시 처음부터 작업을 수행한다.
3) 트랜잭션의 특징
| 원자성(Atomicity) | 트랜잭션은 원자 단위의 과정이다. 트랜잭션의 모든 과정이 성공할 경우에만 성공, 하나라도 오류가 발생하면 실패로 간주한다. |
| 일관성(Consistency) | 트랜잭션이 시작하기 전과 후에 데이터베이스의 일관성이 유지되어야 한다. |
| 고립성(Isolation) | 다수의 트랜잭션이 동시에 실행될 때, 각각의 트랜잭션은 서로 영향을 미치면 안 된다. |
| 지속성(Durability) | 트랜잭션이 성공한 경우 해당 결과는 데이터베이스에 영구적으로 반영되어야 한다. |
'TIL' 카테고리의 다른 글
| 251016_SQLD_SQL 기본 문법과 SQL의 활용 (0) | 2025.10.16 |
|---|---|
| 251015_SQLD_관계형 데이터베이스 / SELECT와 함수 (0) | 2025.10.15 |
| 251013_SQLD_데이터 모델링의 요소 (0) | 2025.10.13 |
| 251002_SQLD_데이터 모델링 (0) | 2025.10.02 |
| 251001_Python Quest 해결하기 (0) | 2025.10.01 |