제1정규형(1NF)이란?
1NF(First Normal Form, 제1정규형)는 DBMS에서 비정규화된(unnormalized) 테이블을 정규화하기 위해 적용하는 첫 번째 단계입니다. 비정규화된 테이블은 완벽한 데이터베이스 설계를 위해 반드시 해결해야 할 여러 가지 문제를 안고 있습니다.
정규화되지 않은 테이블의 문제점
1. 데이터 중복(Data Redundancy)
데이터 중복이란 동일한 데이터 항목을 여러 번 저장하는 것을 의미합니다.
다음 예시를 살펴보겠습니다.
직원 정보를 저장하는 <Employee> 테이블에 직원의 현재 주소를 저장하는 필드가 있다고 가정해 보겠습니다. 일부 직원들은 회사에서 숙소를 제공받기 때문에 같은 주소를 사용하며, 그 결과 동일한 주소가 데이터베이스에 반복적으로 저장됩니다.
테이블 1.1
| EmpID | EmpName | EmpAddress |
| 001 | Amit | 11, VA Street, New York |
| 002 | Tom | 11, VA Street, New York |
| 003 | David | 11, VA Street, New York |
| 004 | Steve | 13, HG Block, Philadelphia |
| 005 | Jeff | 13, HG Block, Philadelphia |
이 문제를 해결하려면 직원 주소를 별도의 테이블로 분리하고, <Employee> 테이블에서 해당 테이블을 참조하도록 설계해야 합니다.
2. 갱신 이상(Update Anomaly)
갱신 이상은 테이블의 데이터를 수정할 때 문제가 발생하는 현상을 말합니다.
테이블 1.2
| EmpID | EmpName | EmpAddress | EmpDept |
| 001 | Amit | 11, VA Street, New York | A |
| 002 | Tom | 11, VA Street, New York | B |
| 003 | Tom | 11, VA Street, New York | C |
| 004 | Steve | 13, HG Block, Philadelphia | D |
| 005 | Jeff | 27, ZR Block, Virginia | E |
위 예시에서 두 부서에 소속된 직원 Tom의 주소를 변경해야 한다면, 두 개의 행을 모두 수정해야 합니다. 만약 한 행만 수정한다면 Tom은 서로 다른 두 개의 주소를 갖게 되어 데이터 불일치가 발생합니다.
3. 삭제 이상(Delete Anomaly)
회사가 D 부서를 폐쇄하기로 결정했다고 가정해 봅시다. 이때 D 부서의 행을 삭제하면 해당 행에 함께 저장되어 있던 직원 Steve의 정보까지 사라지게 됩니다.
4. 삽입 이상(Insert Anomaly)
삽입 이상은 아직 존재하지 않는 데이터를 기록에 추가하려고 할 때 발생하는 문제입니다.
정규화를 거치면 위에서 언급한 모든 문제와 이상 현상(anomaly)이 제거되어, 데이터베이스 관리자라면 누구나 만족할 만한 완벽한 데이터베이스 설계를 얻을 수 있습니다.
그렇다면 제1정규형(1NF)을 활용해 데이터를 어떻게 정규화하는지 살펴보겠습니다.
왜 1NF가 필요한가?
제1정규형(1NF)은 앞서 살펴본 것처럼 데이터 중복 문제와 다양한 이상 현상을 제거하는 데 유용합니다. 1NF를 만족하려면 테이블의 모든 속성(attribute)이 원자값(atomic value), 즉 더 이상 분할할 수 없는 단일 값을 가져야 합니다. 값이 원자적이지 않다면 그 데이터베이스는 잘못된 설계라고 볼 수 있습니다. 1NF는 정규화(normalization) 과정의 첫걸음입니다.
따라서 테이블이 정규화된 형태를 갖추기 위한 가장 기본적인 규칙은 오직 원자값만 포함해야 한다는 것입니다.
예시
아래 예시의 테이블에서 DeptRole 컬럼을 제외한 모든 컬럼은 원자값으로 구성되어 있습니다. 즉, DeptRole 컬럼은 A, B, C 부서에 대해 하나의 셀에 여러 값을 담고 있어 원자값 규칙을 위반합니다.
테이블 1.3
| DeptId | DeptName | DeptRole |
| 001 | A | Finance, HR |
| 002 | B | Programming, Networking |
| 003 | C | Management, Marketing |
| 004 | D | Operations |
이제 이 테이블을 수정하여 1NF 형태로 변환해 보겠습니다:
| DeptId | DeptName | DeptRole |
| 001 | A | Finance |
| 001 | A | HR |
| 002 | B | Programming |
| 002 | B | Networking |
| 003 | C | Management |
| 003 | C | Marketing |
| 004 | D | Operations |
이제 위 테이블은 1NF를 만족하며, 모든 컬럼이 아래 이미지에서 요약된 것처럼 원자값으로 구성되어 있습니다.
