데이터베이스의 정규화에 대해서

·2022년 7월 3일
4

컴퓨터개론

목록 보기
9/14

열심히 디비 도메인은 짜면서도 정규화에 대해서는 큰 고민을 했던 적이 없는 것 같다.

이렇게 짜면 되는데? 라는 생각으로 이론을 멀리했다고 해야하나...

정규화?

정규화는 쉽게 말해서 데이터베이스의 중복을 없애는 작업을 이야기한다.

여기서 중요한 것은 응 중복 없애면 되는구나 라고 하는 것이 아니라, 왜? 라는 생각을 해야한다고 생각한다.
이러니까 질문이 맨날 어려운걸 받지

관계형DB에는 특징이 존재한다.

중복이 되는 것들을 관계(Relation)라는 것으로 서로 엮여있어서, 특정 데이터의 값이 변할 경우
관련되어있는 모든 데이터가 전부 바뀌게 된다.

즉 중복을 다 날려버릴 필요가 있다는 것이다.
그리고 제일 중요한 것은 DB서버를 빌리는 비용이 엄청 비싸고
데이터가 많이 쌓이면 쌓일수록 속도가 점점 느려지기 때문에 데이터를 최대한 압축해야할 필요가 있다.


정규화는 종류가 엄청 많은데, 일반적으로 실무에서는 1,2,3 정규화까지만 사용한다고 알고 있다. (아니면 부캠 찾아가던가)
그리고 일부로 정규화를 풀어버리는 경우도 존재하는데, 이것은 비정규화라고 부른다.

이것에 대해서는 글을 따로 적어놨으니 아래 링크를 참고하면 된다.
비정규화에 대해서

제1 정규화 (1NF)

1정규화에서는 값이 오직 1개씩만 들어가도록 만들어야한다.

정규화가 진행되기 전 테이블

위의 테이블을 보면 주문상품에 여러개의 물건이 들어가있는 것을 확인할 수 있다.
일단 이것부터 쪼개주는 작업이 필요하다.

위의 사진 두개를 보면, 구매하려고 하는 주문상품의 개수만큼 늘어났고 각각 오직 1개의 값만 들어가있는 것을 확인할 수 있다.

하지만 유심히 보면 중복되는 것이 존재한다.

뭔가 주문번호라는 것을 기준으로 분리를 할 수 있을 것 같고, 상품명이 중복되는게 많으니 이것도 줄여볼 수 있을 것 같다.

제2 정규화 (2NF)

2정규화는 1정규화에서 중복되는 값이 존재한다면, 그것을 분리하여 참조를 하는 것이다. (관계형성)

여기서 PK, FK라는 명칭이 나오는데 아래와 같은 설명을 가지고 있다.

  • 해당 테이블임을 증명하는 고유한 키 PK
  • 해당 테이블의 정보가 담겨있음을 증명할 수 있는 참조 키 FK

그럼 2정규화로 한번 또 뜯어보자

뭔가 좀 깔끔해보이지만, 여기서도 문제를 확인할 수 있다.

보통 이행적 함수 종속성 이라는 말을 사용하는데, A->B B->C A->C 관계가 있는 것을 이야기한다.

여기서는 생성번호 -> 주문번호, 주문번호 -> 상품번호, 생성번호 -> 상품번호의 관계가 만들어져있는데
이것을 완벽하게 분리하지 않을 경우 이상현상이 발생하게 된다.

제3 정규화 (3NF)

3정규화는 2정규화를 진행한 후 이행적 함수 종속성을 제거한 정규형이다.

결국은 모조리 다 분리를 해놓으면 된다.

이것을 기준으로 어떤 흐름으로 진행되는지 확인을 해보자.

  1. 상품은 관리자에 의하여 추가되거나 삭제된다.
  2. 사용자는 회원가입을 해야 구매를 할 수 있다.
  3. 어떤 사용자가 상품을 구매할 경우 이력이 남는다.
  4. 해당 이력에는 어떤 상품을 몇개를 구매를 했는지 확인할 수 있다.

이렇게 될 경우 서로 영향을 받지 않게 된다.

사용자가 없더라도, 상품을 추가할 수 있으며
사용자는 상품이 없더라도 회원가입을 할 수 있다.


머리로는 이해를 하고 있었지만, 이렇게 글을 써보는 것은 또 처음이라서 좀 신기한 느낌도 든다.

결국 DB 테이블을 짤 때 생각하는 것이 겹치는 것이 있다면 모조리 밖으로 다 빼버린다. 였기 때문에;
물론 문제가 발생을 해서 비정규화 작업이 있었던 것도 있었지만 이제는 질문하면 대답할 수 있겠지..^^


아래 ERD는 팀프로젝트에서 내가 짠 DB 도메인이다.

뭐야 안보이잖아요

아래 링크 누르시면 보입니다(...)

https://camo.githubusercontent.com/13ceb995dfd477c6ac808e9c3f1b7fe73ea594c30acf7f3ed3bcfa0d5eb94970/68747470733a2f2f76656c6f672e76656c63646e2e636f6d2f696d616765732f79756b696e61313431382f706f73742f30316232653964322d383862312d346139392d386334372d3232343662376663356131362f696d6167652e706e67

profile
물류 서비스 Backend Software Developer

0개의 댓글