
데이터베이스 정규화(Database Normalization)는 데이터베이스를 설계할 때 중복 데이터를 줄이고 데이터의 무결성을 높이는 방법이다. 정규화는 데이터가 저장된 테이블을 여러 단계에 걸쳐 구조적으로 분해하면서 이루어지는데, 이를 통해 데이터를 더 효율적으로 관리하고, 데이터 일관성과 무결성을 유지할 수 있습니다.
정보에 결점이 없도록 유지하는 성질
데이터베이스 내에 저장되는 데이터 값들이 항상 일관성을 갖고 데이터의 유효성, 정확성, 안정성을 유지할 수 있도록 하는 제약조건을 두는 데이터베이스의 특성
데이터베이스에서 데이터를 중복 없이 저장하고 효율적으로 관리하기 위해 정규화가 필요합니다. 중복된 데이터를 허용하면 데이터의 불일치가 발생할 가능성이 커지는데, 예를 들어 한 값이 수정되었을 때 다른 테이블에 중복된 데이터가 변경되지 않는 경우 데이터의 불일치 문제가 발생합니다.
이러한 문제를 줄이고자 정규화를 통해 테이블을 분리하고 중복을 최소화하는 구조로 데이터베이스를 설계합니다.
데이터베이스 정규화는 1NF(제 1 정규형)부터 5NF(제 5 정규형)까지 여러 단계가 있으며, 단계가 높아질수록 데이터 중복이 줄고 데이터의 일관성이 높아집니다. 하지만 일반적으로는 3NF(제 3 정규형) 또는 BCNF(보이스-코드 정규형)까지만 적용해도 대부분의 데이터베이스 설계 요구를 충족합니다.
각 정규형의 개념과 예시를 보면서 이해해봅시다.
1NF는 테이블의 모든 컬럼 값이 원자값이어야 한다는 규칙입니다. 즉, 하나의 컬럼에 여러 값이 들어가지 않도록 단일 값만 저장해야 합니다.

위 테이블에서는 과목 컬럼에 여러 과목이 하나의 셀에 들어가 있어 1NF에 부합하지 않습니다.

2NF는 1NF를 만족하면서 기본 키가 아닌 속성이 기본 키 전체에 종속되도록 합니다. 즉, 부분적으로 종속된 속성을 별도의 테이블로 분리하여 중복을 줄입니다. 2NF는 주로 복합 키를 사용하는 테이블에서 의미가 있습니다.

위테이블은 학생 ID와 과목이 복합 키 역할을 하며, 성적은 이 복합 키에 의존합니다. 하지만 ㅁ나약 학생의 일반 정보를 저장하고 있다면, 학생 정보를 별도 테이블로 분리할 수 있습니다.

3NF는 2NF를 만족하면서 비-기본 키 속성이 다른 비-기본 키 속성에 종속되지 않도록 하는 것입니다.
쉽게 말해, 기본 키 외의 컬럼이 다른 컬럼에 의존하지 않도록 분리합니다.

위 테이블에서 과목 이름은 과목 ID에 종속됩니다. 이를 분리하여 각 정보가 오직 기본 키에만 의존하게 만듭니다.

BCNF는 3NF를 확장한 것으로, 테이블의 모든 결정자가 후보 키가 되도록 하는 규칙입니다. 일반적으로 3NF까지 적용하면 충분하지만, 후보 키에 대한 규칙이 추가된 경우 BCNF가 필요할 수 있습니다.
정규화는 데이터의 중복과 무결성 문제를 해결하지만, 모든 데이터베이스가 높은 단계의 정규화를 필요로 하지는 않습니다. 일반적으로는 3NF 정도로 정규화하는 것이 적절하며, 경우에 따라 성능 향상을 위해 반 정규화(Denormalization)를 통해 일부 데이터를 중복 저장하기도 합니다.
데이터베이스 설계 시 실무에서는 데이터의 성격, 조회 빈도, 성능 등을 고려해 필요에 따라 정규화 단계와 반정규화를 적절히 조합하여 효율적으로 설계하는 것이 중요합니다.