-
[DB]데이터베이스 정규화(1NF, 2NF, 3NF)데이터베이스 2022. 7. 2. 15:30
정규화란?
정규화란 데이터의 중복을 제거하고 테이블의 안정성을 높이는 과정입니다.
테이블의 안정성을 높인다는 말의 의미는 테이블에 레코드를 insert할 때 null 값이 입력되거나,
삭제 시 연쇄삭제 현상이 발생하거나, 수정 시 데이터의 일관성이 훼손되는 현상을 제거한다는 의미입니다.
정규화된 테이블의 장점
1. 정규 테이블은 중복 데이터가 없어서 데이터베이스의 크기를 줄여줍니다.
2. 찾아야 할 데이터가 적어 쿼리가 더 빨라집니다.
3. 중복을 배제하여 삽입, 삭제, 갱신 이상의 발생을 방지제 1정규형(1NF)
1NF를 만족하는 규칙
제 1정규형, 1NF
규칙1. 각 행의 데이터들은 원자적 값을 가져야 한다.
규칙2. 같은 데이터가 여러 열에 반복되지 말아야 한다.
규칙3. 각 행은 유일무이한 식별자인 기본키를 가지고 있어야 한다.관계형 데이터베이스에서 테이블의 값은 반드시 원자값이어야 합니다. 아래의 고객취미 테이블을 보면,
추신수 선수의 취미가 (영화, 음악)으로 원자값이 아닙니다. 데이터가 원자값이 아니면 원자값을 갖도록 변환해 주어야 합니다.
또한 아래 테이블처럼 같은 데이터가 여러 열에 반복되지 말아야합니다.
제 2정규형(2NF)
2NF를 만족하는 규칙
제 2정규형, 2NF
규칙1. 1NF여야 합니다.
규칙2. 부분적 함수 종속이 없다.부분 함수 종속(불완전 함수 종속)에 대한 설명은 아래 포스트에서 확인할 수 있습니다.
https://hump-mountain.tistory.com/10
[DB] 함수 종속성(functional dependency)이란?
함수 종속성(functional dependency) 정의 함수 종속성은 특정 속성(컬럼) A의 값이 바뀌면 다른 속성(컬럼) B의 값도 바뀌거나 특정 속성(컬럼) A의 값을 알면 다른 속성(컬럼) B의 값도 유일하게 정해지
hump-mountain.tistory.com
수강강좌 테이블의 기본키는 (학생번호, 강좌이름)이며, 기본키의 일부인 강좌이름 속성이
강의실을 결정하는 '강죄이름 -> 강의실' 종속관계를 가지고 있습니다.
문제 발생
삭제 시 : 402번 학생이 수강을 취소하면 스포츠경영학 과목의 강의실에 대한 정보가 사라집니다
삽입 시 : 컴퓨터입문 과목이 개설되어 공학관 112호를 사용하게 되었는데 아직 신청한 학생이 없습니다.
이 경우 수강강좌 테이블에 학생번호와 성적을 NULL 값으로 삽입해야 하는 문제가 발생합니다.
수정 시 : 데이터베이스 강의실을 공학관 113호로 변경할 경우 데이터 불일치가 발생할 가능성이 있습니다.성적과 강의실은 모두 기본키에 함수적으로 종속되어 있지만, 강의실은 기본키의 일부인
강좌이름에 한 번 더 종속되어 있습니다. 즉, 기본키(학생번호, 강좌이름)의 부분집한인 강죄이름에 종속됩니다.
자신의 테이블이 1NF이고 기본키 열이 하나라면 그 테이블은 이미 2NF입니다.
제 3정규형(3NF)
3NF를 만족하는 규칙
제 3정규형, 3NF
규칙1. 2NF여야 합니다.
규칙2. 이행적 종속이 없습니다.이행적 종속 종속에 대한 설명은 아래 포스트에서 확인할 수 있습니다.
https://hump-mountain.tistory.com/10
[DB] 함수 종속성(functional dependency)이란?
함수 종속성(functional dependency) 정의 함수 종속성은 특정 속성(컬럼) A의 값이 바뀌면 다른 속성(컬럼) B의 값도 바뀌거나 특정 속성(컬럼) A의 값을 알면 다른 속성(컬럼) B의 값도 유일하게 정해지
hump-mountain.tistory.com
위 courses 테이블이 있고 다음 세 열 course_name, instructor, instructor_phone의 값을 변경하면 어떻게 될까요
course_name : course_name을 변경하더라도, instructor이나 instructor_phone변경되지 않습니다.
instructor_phone : instructor_phone을 변경하더라도, instructor이나 course_name은 변경되지 않습니다.
instructor : instructor을 변경하면 instructor_phone이 변경됩니다. 이행적 종속 관계입니다.instructor 컬럼을 변경하면 instructor_phone 컬럼도 변경되야만 합니다. 두 컬럼은 종속관계이기 때문입니다.
해당 과목에 강사가 바뀌었는데 강사 전화번호만 그대로이면 문제가 발생하겠죠
따라서 이 테이블이 3NF가 되려면 instructor_phone을 이 테이블에서 분리해야합니다.
데이터베이스 테이블 정규형에는 BCNF(Boyce and Codd Normal Form)도 존재합니다.
제 3정규형을 더 강화한 버전이라고합니다. 해당 포스트에서는 이 정규형을 다루지 않으니 궁금하신 분들은
검색해보시길 바랍니다!
참고
HEAD FIRST SQL:효율적인 DB관리를 위한 SQL 학습법
(린 베일리(저),한빛미디어박종걸,(역)한빛미디어)
데이터베이스 개론(http://www.yes24.com/Product/Goods/67882661)
(김연희(저), 한빛아카데미)
'데이터베이스' 카테고리의 다른 글
[redis] Redis 서버 Master/Slave 설정하기 (windows10) (0) 2022.08.04 [redis] RDB 저장 실패시에도 write 명령 허용하기 (0) 2022.08.03 [JPA] JPA의 변경감지에 대해서 (0) 2022.07.11 [DB] 함수 종속성(functional dependency)이란? (0) 2022.05.11 [Querydsl] BooleanExpression을 사용한 동적쿼리 작성 (0) 2022.04.15