정규화는 왜 필요할까? 개인적인 경험으로는 정규화를 어떻게 구성하느냐에 따라서 프로그래밍을 할 때 원하는 데이터를 쉽게 가져오느냐, 혹은 빠르게 가져오느냐, 기능을 실현시키는데 걸림돌이 되느냐 등 코드 작성에 직접적으로 영향을 주기 때문에 개발자라면 충분히 고민할 필요가 있다고 생각한다.
데이터베이스에서 데이터들을 불러올 때면, 사람의 눈에는 연관이 있어 보이는 데이터들이 컴퓨터가 볼 땐 그저 똑같은 데이터 조각이라는 걸 새삼 느끼게 된다. (왜 중복되는 데이터를 제거했는데도 계속 보여주는 거야?)
정규화가 꼭 필요하다는 생각에 빠지기보단, 상황에 맞춰 필요에 의해 사용하는 개념이라고 알면 좋을 것이다.
기본키 : Primary Key, PK, 유일성과 최소성을 만족하는 키 (자연키, 인조키 중에 설정)
외래키 : Foreign Key, FK, 다른 테이블의 기본키를 그대로 참조하는 키
후보키 : Candidate Key, 기본키가 될 수 있는 후보
대체키 : Alternate Key, 후보키들 중에 기본키로 지정되지 않은 후보키
슈퍼키 : Super Key, 유일성을 갖춘 키
엔터티 : entity, 사람, 장소, 물건, 개념 등 여러 속성을 지닌 명사를 의미
릴레이션 : relation, 데이터베이스에서 정보를 구분하여 저장하는 기본 단위 (RDBMS에선 테이블, NoSQL에선 컬렉션)
속성 : attribute, 릴레이션에서 관리하는 구체적이며 고유한 이름을 갖는 정보
도메인 : domain, 릴레이션에 포함된 각각의 속성들이 가질 수 있는 값의 집합
필드 : field, 필드는 특정 속성의 값을 저장하는 공간 (속성이 테이블의 필드에 저장)
레코드 : record, 테이블의 각 속성에 해당하는 값들, 데이터 (해당 속성의 도메인에 부합해야 함)
릴레이션(테이블) 간의 잘못된 종속 관계로 인해 데이터베이스 이상 현상이 일어나서 이를 해결하거나, 저장 공간을 효율적으로 사용하기 위해 릴레이션을 여러 개로 분리하는 과정이다.
- 릴레이션의 모든 도메인이 더 이상 분해될 수 없는 원자 값만으로 구성되어야 한다.
즉, 속성 값 중에 두 개 이상의 값을 가진 것이 없어야 한다.
( 예, {A강의, B강의} 두 강의를 듣는 학생이 있다면 A강의 따로 B강의 따로 구성한다 )
- 제1 정규형이며 부분 함수의 종속성을 제거한 형태이다.
즉, 기본키를 제외한 모든 속성이 기본키에 '완전 함수 종속적'인 것
| 학번 | 수강강의 | 담당강사 | 성적 | ||
| 부분 함수의 종속성 제거! -> | |||||
| 학번 | 수강강의 | 성적 | / 과 / | 수강강의 | 담당강사 |
- 제2 정규형이며 기본키를 제외한 모든 속성이 '이행적 함수 종속'이 아닌 상태이다.
(이행적 함수 종속이란? A->B, B->C 일 때 A->C 성립, 이때 C가 A에 '이행적 함수 종속' 되었다고 함)
- 제3 정규형이고, 결정자가 후보키가 아닌 함수 종속 관계를 제거하여 릴레이션(테이블)의 함수 종속 관계에서 모든 결정자가 후보키인 상태를 말한다. (결정자란? X->Y일 때 X는 결정자, Y는 종속자)
필자는 글을 있는 그대로 익히기엔 무리가 있었다. 이해한 바를 바탕으로 이해하기 쉽게 나만의 방법으로 서술해 보았다
정규화를 하는 이유는 중복되는 데이터를 갱신할 때 일관성을 놓치는 오류, 데이터를 삭제할 때 원치 않는 정보 손실(강의실이 비었다고 데이터를 삭제하면 해당 강의실에 대한 모든 정보는 사라질 것이다), 데이터 중복(담당강사와 성적이 같은 테이블에 존재)으로 인해 새로운 데이터를 삽입할 때 원치 않는 정보를 삽입해야 하는 오류들 때문이다.
오류가 발생되지 않는 데이터들이라면 우리는 무조건 정규화를 할 필요가 없다.
꼭 상황에 맞게 정규화나 비정규화를 진행했으면 좋겠다.
| SQL - SubQuery, Self Join (feat. EXISTS) (1) | 2024.07.17 |
|---|---|
| SQL - TIMESTAMP, EXTRACT, 수학 함수, 문자열 함수 etc (0) | 2024.04.17 |
| SQL - JOINS (+ AS, UNION) (0) | 2024.04.08 |
| SQL - GROUP BY 문 (+ AGG, HAVING) (0) | 2024.04.05 |
| SQL - 구문 기초 (0) | 2024.04.04 |