DB 설계할 때 몰라도 되는 개념들
- 기본키, 후보키, 대체키, 슈퍼키
- 개체-관계 모델
- 모델링 과정
- 이상현상(삭제이상, 삽입이상, 수정이상)
- 함수 종속성
- 정규형
과연 현재회사에서는 1도 들어보고 써보지 못했다. 정보처리기사 실기 준비할 때나 들어봤을 뿐.
기억해야 할 핵심 원칙 1가지
중복 없애기
users (사용자) 테이블
id 이름 1 박재성 2 김유찬
posts(게시글) 테이블
id 제목 내용 작성자
1 [속보] 개발자 채용 확대 내용1 박재성
2 취업 꿀팁 공유합니다! 내용2 박재성
… … … …
132 어제 면접 보고 온 썰 내용3 박재성
위의 표와 같이 게시글 데이터가 DB에 많이 쌓여있다고 가정하자. 여기서 박재성이 쓴 게시글이 3개가 있다고 하자. 그러다 어느 날 박재성이라는 사람이 박지성으로 개명을 했다. 그래서 게시글에 작성된 작성자의 이름도 전부 박재성에서 박지성으로 고쳐주어야 한다. 그럼 위 게시글의 모든 데이터를 뒤져서 박재성이라는 이름을 전부 찾아서 박지성으로 고쳐야 한다.
그런데 위 테이블에서 1, 2번 게시글의 작성자 이름만 고치고, 실수로 132번의 게시글을 안 고쳤다. 그러다 6개월 정도가 지난 후 132번 게시글에 신고가 들어왔다. 그런데 데이터베이스에서 작성자 이름인 박재성이라는 사용자를 암만 뒤져도 안 나오는 것이다. 즉, 데이터가 꼬여버린 것이다.
이런 문제가 발생한 가장 근본적인 이유는 데이터 중복 때문이다. 중복되는 데이터가 많으면 많을수록 무언가를 수정할 때 중복되는 모든 데이터를 찾아서 고쳐야 한다. 이때, 실수로 중복된 데이터를 누락해서 수정을 하지 않는 경우가 발생하고, 이렇게 되면 데이터들 사이에 모순이 생겨버린다.
"데이터 중복으로 인해서 발생할 수 있는 문제가 이상현상이고 이상현상을 해결하기 위해 정규화 과정을 거친다"
위 예시에서 데이터 중복을 쉽게 설명하자면,
posts테이블 작성자 컬럼에 '박재성'이라는 원자값을 쓰면 다른 튜플데이터에 계속 중복된다.
따라서 원자값이 아닌, 사용자 테이블에 id값을 쓰자.
정규화(Normalization)란?
데이터들 사이에서 발생한 모순의 근본적인 원인이 데이터 중복이라고 했다. 이런 문제를 해결하려면 데이터 중복을 없애면 된다. DB를 설계하면서 중복을 없애는 과정이 바로정규화(Normalization)다. 제1정규형, 제2정규형, 제3정규형 등 모든 정규형은 중복을 없애게 해주는 방법들이다.
정규형에는 총 6가지 종류의 정규형이 있다. 하지만 실제 현업에서 적용시키는 정규형은 1정규형, 2정규형, 3정규형이다. BCNF, 4정규형, 5정규형을 적용시키면 지나치게 테이블이 분리되어서 관리가 복잡해지기 때문이다.
각 정규형을 보면 너무 어렵게 느껴진다. 위 의미를 이해하는 데까지만 해도 시간이 너무 오래 걸린다. 하지만 실제 현업에서는 위의 정규형을 하나하나씩 떠올리면서 설계하지 않는다. 위의 각 정규형 의미를 모르더라도 DB를 설계하는 방법을 알려줄 예정이다. 내가 알려준 방법대로만 DB 설계를 하고 난 뒤에 결과물을 보면, 1정규형~3정규형을 전부 다 지킨 테이블이 설계가 된다.
요약
데이터의 중복이 생기게끔 테이블을 설계하면 데이터끼리 꼬일 수 있다. 따라서 테이블을 설계할 때 데이터 중복이 발생하지 않게끔 설계해야 한다.
역시 난 필요에 따른 경험을 해야 체득하는 인간인가 보다.
정보처리기사 실기를 준비하면서 정규화 개념에 대해 머릿속에 팍 각인이 되지 않았는데,
이렇게 필요에 따라 배우고 나니 '정규화 = 데이터 중복 없애기'라는 개념이 너무 명확하게 들어온다.
'인프런 - 비전공자도 이해할 수 있는 DB 설계 입문/실전' 강의를 수강하며 내용 정리를 위해 작성한 포스팅입니다.
인용은 JSCODE님 수업자료에서 퍼온 것입니다.