[DB] 데이터베이스 정규화 (제1 정규화~ 제3 정규화 예시)

kai6666·2022년 6월 13일
0

TIL.DB

목록 보기
3/3

💁‍♀️ 데이터베이스 정규화

  • 정규화: 관계형 데이터베이스 설계시 중복을 최소화하여 데이터를 구조화하는 프로세스. 다른 말로 정제되지 않은 데이터(표)를 관계형 데이터베이스에 어울리는 표로 만드는 것이다.

✨ 정규화의 목적

  • 데이터베이스 변경시 이상 현상(anomaly) 제거
    충분히 정규화 되지 않은 테이블의 데이터를 변경할 때, 원치 않은 결과를 맞닥뜨릴 수 있다.
    • 갱신 이상 (update anomaly)
      같아야 하는 정보가 복수 개의 행에 표현될 경우, 데이터를 수정할 때 일부 정보만 갱신되고 일부는 변하지 않아 데이터 오류가 발생할 수 있다.
    • 삽입 이상 (insertion anomaly)
      의도하지 않은 자료까지 추가해야만 테이블에 데이터를 추가할 수 있는 현상이다.
    • 삭제 이상 (deletion anomaly)
      의도하지 않은 자료까지 삭제해야만 지우고자 하는 데이터를 지울 수 있는 현상이다.
  • 데이터베이스 구조 확장시 재 디자인 최소화
    충분히 정규화된 데이터베이스는 새로운 데이터형을 추가하거나 데이터를 일부 수정하고자 할 때, 데이터베이스 자체를 리디자인할 필요없이 조금만 변경할 수 있다. 데이터베이스와 연결된 응용 프로그램에도 최소한의 영향만 끼칠 수 있다.
  • 사용자에게 더 의미 있는 데이터 모델
    충분히 정규화된 데이터베이스는 현실세계의 개념과 관계들을 반영한다. 때문에 사용자에게 더 의미 있는(informative)한 데이터 모델이 되어준다.

👉 제1 정규화

(지금부터 드는 정규화 표의 예시는 생활코딩 영상 강의를 보며 표의 내용만 살짝 변경한 점을 미리 알려둔다.)

제1 정규화란, Atomic columns라는 조건에 만족하게끔 비정규형 테이블을 제1 정규형 테이블로 구조화하는 것을 말한다.

위의 비정규형 테이블을 보면, 태그라는 칼럼에 값이 두 개씩 들어있다는 것을 확인할 수 있다. 필요에 따라 하나의 레코드에 여러 값이 들어 있는 경우가 있을 수는 있다. 그러나 패션, 의류 또는 잡화라는 태그로 데이터를 조회하고자 할 때는 하나의 레코드에 여러 태그가 있기 때문에 원하는 데이터를 찾지 못할 것이다.

때문에 현재 테이블에는 해소되어야 할 문제가 있다. 태그와 상품의 관계를 생각해보면,

  • 하나 상품은 (하나 / 복수 개의) 태그를 가질 수 있다.
  • 하나 태그는 (하나 / 복수 개의) 상품을 가질 수 있다.

라는 문장에서 정답은 모두 복수 개의일 것이다. 따라서 상품과 상품태그는 N:M 즉 다대다의 관계를 가진다. 다대다의 관계를 가지는 칼럼은 이들의 관계를 표현한 새로운 테이블을 통해 연결될 수 있다.

따라서 tag라는 테이블을 만들어 각 태그에 id를 주고, 이것을 fashion_tag_relation이라는 관계 테이블에서 fashion_상품의 값들과 연결시켜줌으로써 표를 정규화할 수 있다.

👉 제2 정규화

제2 정규화란, No partial dependencies라는 조건에 만족하게끔 제1 정규형 테이블을 제2 정규형 테이블로 정규화하는 것을 말한다.

No partial dependencies는 부분 종속성이 없어야 한다는 말이다. 이것은 다시 말해 표에 중복키인 기본키가 없어야 한다는 의미이다.

제1 정규화를 거친 표 중 fashion이라는 테이블을 보면, 붉은 색으로 칠한 부분의 데이터가 겹친다는 것을 알 수 있다. 저 데이터는 상품이라는 칼럼에 따라 결정된다. 그렇다면 fashion이라는 테이블에서 얻을 수 있는 정보는 상품가격제작 방식이 핸드메이드냐, 도매냐에 따라 달라진다는 점을 유추할 수 있다. 따라서 fashion이라는 테이블은상품, 가격, 제작 방식를 위해 존재하는 테이블이다.

그리하여 제2 정규화를 할 때, fashion이라는 테이블은 부분 종속된 데이터만 가져간다. 또한, 제작 방식이라는 칼럼이 없어졌기 때문에 두 원피스의 정보는 완전 일치하여서 중복제거하기 위해 한 행만 남겨둔다.

상품, 제작 방식 그리고 이 두 칼럼에 의존하는 가격를 가져와서 fashion_type라는 테이블을 만들면 제2 정규화를 마친 것이다.

👉 제3 정규화

제2 정규화란, No transitive dependencies라는 조건에 만족하게끔 제2 정규형 테이블을 제3 정규형 테이블로 정규화하는 것을 말한다. No transitive dependencies는 이행적 종속성이 없어야 한다는 말이다.

제2 정규화를 거친 표를 보면, fashion이라는 테이블의 행은 상품이라고 하는 기본키에 종속되어 있다. 그렇다면디자이너_id라고 하는 키는 당연히 상품 키에 종속되어 있다. 그런데 잘 보면, 디자이너라고 하는 키는 디자이너_id키에 종속되어 있다고도 말할 수 있다.

디자이너_id상품에 의존하고, 디자이너디자이너_id에 의존하고 있다. 여기서 디자이너에 대한 상세한 정보가 더 추가되어도 그것은 디자이너_id 키에 의존하게 될 것이다. 이러한 관계를 이행적 종속성이라고 한다. 이행적 종속성은 나타나면 안 좋은 것이다. 그 이유는 붉은 색으로 칠한 부분을 보면 알 수 있다시피 값들이 중복되고 있다는 의미이기 때문이다.

이런 경우 중복을 나타내는 부분을 따로 표로 빼내야 한다. 때문에 제3 정규화를 거친 표를 보면 designer라는 테이블이 추가되었음을 볼 수 있다. 원래는 두 행이 있었지만, 값이 중복되기 때문에 한 행만 남겨두고 지운다.

그리고 값들을 빼낸 fashion 테이블에는 designer 테이블과 이어지게끔 디자이너_id라는 키를 남겨둔다. 이 경우에는 designer 테이블의 기본키를 외래키로 참조하는 것이기 때문에 중복이 허용되어서 지울 필요가 없다.

(id 키가 없다 하더라도, 내부적으로 성격이 비슷한 키들이 있다면 그것을 따로 빼내어 id를 부여해 지금처럼 기본키와 외래키로 연결시키면 된다.)


참고 자료

profile
성장 아카이브

0개의 댓글