CodeGym /행동 /SQL SELF /첫 번째 정규형(1NF)의 원칙

첫 번째 정규형(1NF)의 원칙

SQL SELF
레벨 25 , 레슨 1
사용 가능

첫 번째 정규형(First Normal Form, 1NF)은 데이터베이스 정규화의 첫 단계로, 테이블 구조에 엄격한 제한을 두는 거야. 테이블이 1NF에 맞으려면 다음 조건을 만족해야 해:

  1. 모든 데이터가 원자적이어야 해. 테이블 셀의 각 값은 더 이상 나눌 수 없어야 해. "한 셀에 리스트"는 이제 안녕! 데이터베이스에서는 그런 거 못 써.
  2. 각 행이 유일해야 해. 즉, 테이블에는 Primary Key(기본 키)나 유일한 식별자가 있어야 해.
  3. 중복되는 데이터 그룹이 없어야 해. 같은 엔티티의 값이 같은 컬럼에 여러 번 들어가면 안 돼.

쉽게 말해서, 데이터베이스 테이블을 네 방이라고 생각해봐. 원자적 값은 각각의 물건(램프, 책상, 책) 같은 거야. 방이 지저분해서(예: 모든 물건이 한데 쌓여 있으면) 램프를 찾거나 예비 책상이 있는지 금방 알 수 없지. 정규화는 "모든 걸 제자리에 정리"하는 거야.

1NF 위반 예시

학생들이 듣는 과목 정보를 저장하는 테이블이 있다고 해보자:

student_id name courses
1 Maria "수학, 물리"
2 Rob "생물학, 화학"

이 구조가 왜 문제일까? courses(컬럼)에 과목들이 쉼표로 구분되어 한 셀에 들어가 있어. 만약 "물리"를 듣는 모든 학생을 찾고 싶으면 쿼리가 악몽이 돼: 복잡한 텍스트 변환을 해야 하거든. 그리고 학생이 물리만 빼고 싶으면 또 다른 문제가 생겨. 이런 데이터는 원자적이지 않아서 1NF의 기본 규칙을 위반하는 거야.

테이블을 1NF로 바꾸려면?

문제를 해결하려면 데이터를 각각의 행으로 나눠서, 테이블의 각 값이 원자적이 되게 만들어야 해:

student_id name course
1 Maria 수학
1 Maria 물리
2 Rob 생물학
2 Rob 화학

이제 괜찮아. 테이블을 바꿔서 각 셀의 값이 더 이상 나눌 수 없게 됐어. 이게 1NF 원칙에 맞는 거야.

1NF 위반과 수정의 자세한 예시

이번엔 온라인 쇼핑몰 주문 테이블이 있다고 해보자:

order_id customer_name items
1001 Otto Lin "노트북, 마우스, 키보드"
1002 Anna Song "스마트폰, 케이스"

여기서도 items에 여러 값이 쉼표로 들어가 있어서 1NF를 위반하고 있어.

1NF로 바꾸려면, 주문의 각 상품마다 한 행씩 저장해야 해:

order_id customer_name item
1001 Otto Lin 노트북
1001 Otto Lin 마우스
1001 Otto Lin 키보드
1002 Anna Song 스마트폰
1002 Anna Song 케이스

이제 테이블 구조가 1NF 원칙에 맞아. 각 주문과 상품이 별도의 행으로 표현되고, 값도 원자적이야.

Primary Key 추가하기

테이블을 변환한 후에는 유일한 식별자(Primary Key)를 각 행에 추가하는 게 중요해. 그래야 행이 유일함을 보장할 수 있거든. 위 예시에서는 order_iditem의 조합을 복합 Primary Key로 쓸 수 있어. 하지만 실제로는 id라는 별도 필드를 만드는 게 더 흔해.

id order_id customer_name item
1 1001 Otto Lin 노트북
2 1001 Otto Lin 마우스
3 1001 Otto Lin 키보드
4 1002 Anna Song 스마트폰
5 1002 Anna Song 케이스

실습 과제

아래처럼 한 셀에 과목이 들어있는 학생 테이블이 있어:

student_id name subjects
1 Polly "수학, 화학"
2 Peter "물리, 정보학"

이 테이블을 1NF에 맞게 바꿔봐.

변환 후 테이블은 이렇게 돼야 해:

student_id name subject
1 Polly 수학
1 Polly 화학
2 Peter 물리
2 Peter 정보학

1NF에서 자주 발생하는 실수

데이터베이스 작업할 때 1NF 위반은 이런 상황에서 자주 나타나:

  • 테이블에 리스트나 배열을 바로 저장하는 것. 이게 제일 흔한 실수야.
  • 행마다 유일한 식별자(Primary Key)가 없는 것. 이러면 중복 데이터가 쉽게 생겨.
  • 같은 정보를 여러 컬럼에 저장하는 것. 예를 들어 "course_1", "course_2", "course_3"처럼 쓰는 대신, 제대로 구조화해야 해.

이런 점만 기억하면, 네 데이터베이스는 1NF를 잘 지킬 수 있어.

1NF의 실전 활용

실제 프로젝트에서 1NF는 정말 중요해. 예를 들어:

  • 고객 관리 앱(CRM)에서는 고객 정보와 활동이 원자적으로 저장돼야 해. 그래야 분석이나 검색이 쉬워.
  • 온라인 쇼핑몰에서는 1NF로 주문, 상품, 구매자 정보를 효율적으로 저장할 수 있어.
  • 은행 시스템에서는 고객, 계좌, 거래 데이터가 원자적으로 저장돼야 서로 다른 작업이 헷갈리지 않아.

1NF 원칙을 지키면, 데이터베이스가 고부하에도 잘 버티고 쓰기도 편해져. 다만, 데이터 중복이 생길 수 있어. 그래서 두 번째 정규형(2NF)으로 넘어가서, 테이블의 부분 종속성을 해결하는 방법을 배우게 돼.

왜 1NF를 꼭 지켜야 할까? 예를 들어, 한 셀에 여러 값(예: 구매자가 주문한 상품 리스트)이 들어가 있으면, 데이터를 다루기 힘들어져. "키보드"를 주문한 사람을 찾으려면 고생이야. 일부 정보만 바꾸거나 지울 때도 실수하기 쉽지. 데이터가 원자적으로 저장되면(각 필드에 값이 하나만 있으면) 훨씬 신뢰성 있고 이해하기 쉬워. 그리고 이런 테이블은 확장, 업데이트, 구조 변경도 훨씬 쉬워.

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION