티스토리 뷰
반응형
데이터베이스 설계의 기초이자 데이터 무결성을 유지하기 위한 핵심 단계인 제1정규화(First Normal Form, 1NF)에 대해 상세히 정리해 드립니다. 이 내용은 관계형 데이터베이스의 창시자인 E.F. Codd의 이론과 SQL 표준 가이드를 기반으로 분석되었습니다.
1. 제1정규화(1NF)의 정의와 목적
정의
제1정규화란 "릴레이션(Table)의 모든 도메인이 원자값(Atomic Value)으로만 구성되어야 한다"는 규칙입니다. 즉, 테이블의 속성 하나가 여러 개의 값을 가지거나(다중값), 비슷한 속성이 반복되는 그룹을 가져서는 안 된다는 뜻입니다.
- E.F. Codd의 정의 (1970): "A relation is in first normal form if and only if the domain of each attribute contains only atomic values." (각 속성의 도메인이 원자값만을 포함할 때 릴레이션은 제1정규형이다.)
- ISO/IEC SQL 표준: SQL 테이블의 컬럼은 정의된 데이터 타입에 맞는 단일 값만을 저장해야 하며, 리스트나 배열 형태를 컬럼 내에 직접 저장하는 것은 관계형 모델의 원칙에 위배됩니다.
목적
- 데이터 중복 제거: 동일한 의미를 가진 속성이 여러 컬럼에 나열되는 것을 방지합니다.
- 데이터 무결성 유지: 삽입, 삭제, 수정 시 발생할 수 있는 이상 현상(Anomaly)을 최소화합니다.
- 쿼리 효율성: 원자값이 아닐 경우 WHERE 절에서 데이터를 검색하거나 JOIN을 수행할 때 성능이 급격히 저하됩니다.
2. 제1정규화 위반의 주요 사례
① 다중값 속성 (Multi-valued Attributes)
하나의 컬럼에 쉼표(,) 등으로 구분하여 여러 데이터를 넣는 경우입니다.
- 예시: 취미 컬럼에 "축구, 독서, 영화"를 한꺼번에 저장.
② 반복 그룹 (Repeating Groups)
비슷한 속성을 관리하기 위해 컬럼을 숫자로 늘리는 경우입니다.
- 예시: 취미1, 취미2, 취미3 컬럼을 별도로 생성.
3. 제1정규화 적용 프로세스 (Before & After)
[Scenario] 학생들의 수강 과목 관리 테이블
정규화 이전 (비정규화 상태)
아래 테이블은 한 학생이 여러 과목을 들을 때 과목명을 쉼표로 구분하여 '원자성'을 위반하고 있습니다.
| 학생번호 (PK) | 이름 | 수강과목 |
| 101 | 김철수 | 데이터베이스, 알고리즘 |
| 102 | 이영희 | 운영체제 |
제1정규화 적용 후
모든 속성이 단일 값을 갖도록 행(Row)을 분리합니다. 이때 기본키(PK)는 기존 학생번호만으로는 부족하므로 (학생번호, 수강과목)의 복합키가 됩니다.
| 학생번호 (PK) | 이름 | 수강과목 (PK) |
| 101 | 김철수 | 데이터베이스 |
| 101 | 김철수 | 알고리즘 |
| 102 | 이영희 | 운영체제 |
반응형
4. 상세 분석 및 성능 영향도
왜 '원자값'이어야 하는가? (Deep Dive)
- 검색의 한계:
- 만약 수강과목에 "데이터베이스, 알고리즘"이 들어있다면, "알고리즘" 수업을 듣는 학생을 찾기 위해 LIKE '%알고리즘%' 쿼리를 써야 합니다. 이는 인덱스를 타지 못해 전체 테이블 스캔(Full Table Scan)을 유발합니다.
- 수정의 어려움:
- "알고리즘"을 "고급 알고리즘"으로 변경하려면 문자열 파싱이 필요하며, 이 과정에서 데이터 유실 위험이 큽니다.
- 집계 함수 사용 불가:
- COUNT(), SUM() 등의 그룹 함수를 특정 과목 단위로 적용하기가 불가능해집니다.
5. 관련 예제 코드 (SQL)
제1정규화를 위반한 테이블을 정상적인 형태로 변환하는 SQL 예시입니다.
잘못된 설계 (반복 그룹 사용)
SQL
-- 취미를 컬럼 3개로 고정한 경우 (취미가 4개인 사람은 저장 불가)
CREATE TABLE Members_Wrong (
MemberID INT PRIMARY KEY,
Name VARCHAR(50),
Hobby1 VARCHAR(50),
Hobby2 VARCHAR(50),
Hobby3 VARCHAR(50)
);
제1정규화 준수 설계
SQL
-- 1. 회원 기본 정보 테이블
CREATE TABLE Members (
MemberID INT PRIMARY KEY,
Name VARCHAR(50)
);
-- 2. 회원별 취미 테이블 (1:N 관계 분리)
-- 각 행은 하나의 원자값(HobbyName)만 가짐
CREATE TABLE MemberHobbies (
MemberID INT,
HobbyName VARCHAR(50),
PRIMARY KEY (MemberID, HobbyName),
FOREIGN KEY (MemberID) REFERENCES Members(MemberID)
);
-- 데이터 삽입 예시
INSERT INTO Members VALUES (1, '김철수');
INSERT INTO MemberHobbies VALUES (1, '축구');
INSERT INTO MemberHobbies VALUES (1, '독서'); -- 원자값으로 분리되어 저장됨
6. 요약 및 핵심 체크리스트
| 구분 | 내용 |
| 핵심 규칙 | 모든 속성은 반드시 **원자값(Atomic Value)**이어야 함 |
| 제거 대상 | 다중값 속성, 반복 그룹(Attribute01, Attribute02...) |
| 해결 방법 | 새로운 행으로 분리하거나 별도의 테이블로 관계를 정의 |
| 기대 효과 | 인덱스 활용 가능, 데이터 무결성 확보, 쿼리 단순화 |
| 주의 사항 | 행이 늘어나면서 중복 데이터(이름 등)가 발생하므로 제2정규화가 수반되어야 함 |
#데이터베이스 #DB설계 #제1정규화 #1NF #정규화 #Normalization #SQL공부 #데이터모델링 #백엔드개발 #DB최적화 #관계형데이터베이스 #RDBMS #데이터무결성 #개발자지식 #기술면접대비 #정보처리기사 #DB기초 #CleanData
'데이터베이스' 카테고리의 다른 글
| SQL JOIN 종류 및 예제 (0) | 2026.05.24 |
|---|---|
| 데이터베이스 정규화 BCNF (0) | 2026.05.17 |
| 데이터베이스 제3정규화 (0) | 2026.05.17 |
| 데이터베이스 제2정규화 (0) | 2026.05.17 |
| 가장 많이 사용된 데이터베이스(DBMS) TOP10 - 2026 최신버전 (0) | 2026.05.07 |
| 오라클 SPLIT 구분자로 자르기 함수 구현 (1) | 2020.05.13 |
| SELECT, ORDER BY 사용법 (3) | 2018.09.28 |
| 데이터베이스 책 추천 (0) | 2018.08.30 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 정보처리기사
- C
- 블루투스
- 아두이노
- 문제풀이
- DB연동
- 안드로이드
- 자바
- String
- 클래스
- 알고리즘
- 배열
- 문자열
- C++ 클래스
- 자료구조
- Class
- Java
- 벡터
- html
- c#
- C++
- 파일처리
- Android
- 데이터베이스
- C언어
- 리스트
- MySQL
- 상속
- OpenCV
- 파이썬
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
글 보관함
반응형