Developing Myself Everyday
article thumbnail

< 이 블로그의 내용은 생활코딩의 DATABASE 강의를 바탕으로 합니다 >

 

생활코딩

hello world 생활코딩의 세계에 오신 것을 환영합니다. 생활코딩은 일반인들에게 프로그래밍을 알려주는 무료 온라인, 오프라인 수업입니다.  어떻게 공부할 것인가를 생각해보기 전에 왜 프로그

opentutorials.org

 

 

관계형 데이터베이스의 필요


테이블에서 데이터들이 셀 수 없을만큼 늘어나고 용량이 늘어난다면 데이터들은 중복될 수 밖에 없다.

데이터가 많아지면 데이터들에 대한 수정이 어려워진다. 관계가 있으면 유지보수가 상당히 용이해진다.

그리고 좋은 관계형 데이터베이스를 만들려면 정보의 이상 현상(Anomaly)가 생기지 않도록 해야한다.

 

    이상 현상(Anomaly)

  • 갱신 이상(Modification Anomaly): 반복된 데이터 중에 일부를 갱신 할 시 데이터의 불일치가 발생한다.
  • 삽입 이상(Insertion Anomaly): 불필요한 정보를 함께 저장하지 않고서는 어떤 정보를 저장하는 것이 불가능하다.
  • 삭제 이상(Deletion Anomaly): 필요한 정보를 함께 삭제하지 않고서는 어떤 정보를 삭제하는 것이 불가능하다.

 

이런 이상 현상은 정규화를 통해 방지할 수 있다.

 

 

 

정규화(Normalization)


정규화의 기본 목표는 테이블 간에 중복된 데이터를 허용하지 않는다는 것이다. 중복된 데이터를 허용하지 않음으로 무결성(Integrity)를 유지할 수 있으며, DB의 저장 용량역시 줄일 수 있다. 이러한 정규화에는 단계가 있다.

 

< 제 1 정규화, 1NF -  모든 도메인이 원자값이여야 한다. >

 

왼쪽의 표를 보면 2번째 행의 Telephone Number의 원자값이 2개인것을 알 수 있다. 이는 1NF를 위반하게 된다.

오른쪽의 표는 왼쪽의 표를 1NF를 충족하는 표로 바꾼 디자인이다. 이 디자인은 고객 명 테이블과 고객 전화번호 테이블 2개를 이용해서 전화번호들의 중복을 제거했다.

 

 

< 제 2 정규화, 2NF -  완전 함수 종속이 되도록 해야 한다. >

아래의 표를 보면 {종업원} 이나 {기술}은 둘다 이 테이블의 후보키는 아니다. {종업원}은 다수의 기술을 가지고 있으면 테이블에 한 차례 이상 나타나기 때문이고, {기술} 또한 다수의 종업원이 같은 기술을 보유하고 있을 때 테이블에 한 차례 이상 나타나기 때문이다. 오직 복합 키 {종업원, 기술} 이 이 테이블의 후보 키이다.

그런데 남은 속성인 {근무지}는 후보 키의 일부분인 {종업원}에만 영향을 받는다. 그래서 이 테이블은 2NF가 아니다.

이 디자인을 2NF로 표현하는 방법은 같은 데이터를 2개의 테이블로 표현하는 것이다: {종업원} 후보 키를 갖는 "종업원" 테이블과 {종업원,기술} 후보 키를 갖는 "종업원의 기술" 테이블이다.

 

 

< 제 3 정규화, 3NF -  이행적 함수 종속을 제거해야 한다. >

왼쪽의 테이블은 2NF이지만 3NF는 아니다. 그건 왼쪽의 테이블은 이행적 함수종속이 이뤄지고 있기 때문이다.

이행적 함수종속은 기능적 종속으로 X -> Y 이고 Y -> Z 에 의해서 X -> Z (X가 Z를 결정한다) 가 되는 것이다.

 

< 제 4 정규화, BCNF -  결정자이면서 후보키가 아닌 것을 제거해야 한다. >

 

 

Reference

 

데이터베이스 이상 현상(Anomaly) 개념과 예시

이상 현상(Anomaly)

wkdtjsgur100.github.io

 

 

데이터베이스 정규화 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 관계형 데이터베이스의 설계에서 중복을 최소화하게 데이터를 구조화하는 프로세스를 정규화(Normalization)라고 한다. 데이터베이스 정규화의 목표는 이상이 있

ko.wikipedia.org

 

IT위키

IT에 관한 모든 지식. 함께 만들어가는 깨끗한 위키

itwiki.kr

 

'개발자의 기본 소양 > DATABASE' 카테고리의 다른 글

DATABASE(6) - Database Server, Database Client  (0) 2022.12.03
DATABASE(5) - 관계형 DB의 핵심 기능 JOIN  (0) 2022.12.03
DATABASE (3) - 테이블과 CRUD  (0) 2022.11.26
DATABASE (2) - MySQL  (0) 2022.11.26
DATABASE (1)  (0) 2022.11.19
profile

Developing Myself Everyday

@배준형

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!