CS 공부/데이터베이스

데이터베이스 설계

학습하는 청년 2025. 6. 17. 08:10

최종 수정: 2025.06.17

데이터베이스 설계


■ ER 다이어그램 (ER diagram, 이하 ERD)

엔티티 관계(ER, Entity Relationship)를 표현하는 다이어그램이다.

 

ERD는 데이터베이스에 저장되는 엔티티의 구조를 모델링하는 것을 목적으로 한다. 데이터베이스 설계 초기 단계에서 이러한 시각적 표현인 모델링은 매우 중요한 역할을 한다. 추후에 데이터베이스를 확장하거나 수정할 떄 어떤 부분이 영향을 받는지 쉽게 파악할 수 있어, 유지보수가 용이하고 개발자 간 원활한 소통이 가능하기 때문이다.

 

잘못된 테이블 구조로 개발을 시작하는 거슨 소위 '첫 단추를 잘못 꿰는 것'과 같아서 점점 유지보수가 어려워지고, 언젠가는 많은 시간과 노력을 들여 데이터베이스의 구조를 수정해야 할 수 있다. 나아가 비효율적인 데이터베이스 설계는 데이터의 중복과 불일치가 발생할 가능성을 높여 데이터베이스에 대한 질의의 성능도 저하시킬 수 있다. 따라서 ERD를 활용한 데이터베이스 모델링은 데이터베이스의 효율적인 데이터 관리에 있어 매우 중요한 과정이다.

 

피터 첸 표기법 (Peter Chen diagram)

엔티티를 개념적으로 모델링하는 데는 유용하지만, 엔티티가 많아질 경우 그림이 다소 복잡해지고 RDBMS 상에서 어떻게 테이블의 형태로 표현되는지 한 눈에 파악하기 어려울 수 있다. 그래서 오늘날에는 RDBMS 모델링을 위해 표 형태의 ERD를 사용한다.

 

IE 표기법(Information Engineering notation)

이를 IE 표기법, 새 발 표기법 혹은 까마귀 발 표기법(crow feet notation)이라고 한다.

식별/비식별 관계
ERD에서 엔티티 간의 연결선은 실선과 점선으로 구분하여 표현하기도 한다. 실선은 식별 관계를 의미하고, 점선은 비식별 관계를 의미한다.

식별 관계(indetifying replationship)는 참조되는 엔티티가 존재해야만 참조하는 엔티티가 존재할 수 있는 관계를 말한다. 참조되는 테이블의 기본 키를 참조하는 테이블의 외래 키이자 기본 키로 활용하는 경우, 이는 식별 관계로 볼 수 있다.

반면, 비식별 관계(non-identifying replationship)는 참조되는 엔티티가 존재하지 않아도 참조하는 엔티티가 존재할 수 있는 관계를 말한다. 참조되는 테이블의 기본 키를 참조하는 테이블의 기본 키가 아닌 일반적인 외래 키로 이용할 경우, 이는 비식별 관계이다.

■ 정규화 (Nomal Form)

테이블을 어떤 필드로 구성할지 결정하기 위한 작업을 지칭한다. 정규화된 테이블의 형태를 정규형이라 부르고, NF 라고 한다.

 

정규화란 잠재적인 문제가 발생하지 않도록 테이블의 필드를 구성하고, 필요할 경우 테이블을 나누는 작업을 말한다. 대부분의 경우 제3 정규형, 혹은 보이스/코드 정규형까지만 수행된다. 정규형은 일종의 '규칙'이다. 잠재적인 문제가 발생하지 않도록 잘 조직된 테이블이 되기 위해 지켜야 하는 규칙이라 볼 수 있다.

 

정규화는 각종 기술 면접의 고난도 질문으로 자주 출제되고, 테이블을 엄밀하게 설계해야 하는 실무에서 활용되는 개념이기 때문에 잘 이해해 두는 것이 좋다.

 

제1 정규형

필요충분조건은 모든 속성이 원자 값을 가진다는 것이다.

 

제2 정규형

제1 정규형을 만족함과 동시에, 기본 키가 아닌 모든 필드들이 모든 기본 키에 완전히 종속될 것이라는 필요충분조건을 만족하는 상태를 의미한다. 보통 기본 키가 2개 이상의 필드로 구성될 때 고려된다. 기본 키의 일부에만 종속되는 필드가 있다면, 이를 제거하여 기본 키 전체에 종속되도록 필드를 구성해야 한다는 것이 제2 정규형의 요지이다. 즉, 테이블의 모든 필드가 기본 키에 완전히 종속되어야 하고, 일부 기본 키에만 종속되어서도 안 된다는 조건이 제2 정규형이다.

 

  • 부분 함수 종속성(partial functional dependency): 기본 키가 아닌 필드가 기본 키의 일부에 종속되어 있는 경우
  • 완전 함수 종속성(full functional dependency): 기본 키 전체에 완전하게 종속되어 있는 경우

 

즉, 제2 정규형은 부분 함수 종속성이 없는 상태, 후보 키에 속하지 않은 모든 필드가 기본 키에 완전 함수 종속인 상태라고 할 수 있다.

 

제3 정규형

제2 정규형을 만족하면서, 기본 키가 아닌 모든 필드가 기본 키에 이행적 종속성이 없는 상태를 의미한다.

 

만일 어떤 테이블에 A, B, C라는 필드가 있을 때 A가 B를 결정하고(A -> B), B가 C를 결정한다면(B -> C), A도 C를 결정하게 되어(A -> C) 종속 관계를 형성한다. 이때 필드 A와 C 사이에는 이행적 종속 관계(transitive dependency), 이행 함수 종속성이 있다고 표현한다.

 

보이스/코드 정규형 (Boyce-Codd Normal Form, 이하 BDNF)

제3 정규형을 만족하는 동시에 모든 결정자가 후보 키여야 한다는 조건이다. 결정자란 특정 필드를 식별할 수 있는 필드를 의미한다.


■ 역정규화 (denormalization): 정규화가 무조건적인 미덕일까

정규화가 항상 최선인 것은 아니다. 정규화를 거듭하다 보면 테이블이 쪼개지는 경향이 있다. 이렇게 테이블이 많아지면 자연스럽게 조인 연산이 빈번해지고, 다른 테이블을 참조하기 위한 성능상의 비용이 늘어날 수 있다. 요컨대, 정규화 단계를 거듭할수록 데이터는 깔끔하게 정돈되고, 데이터베이스 작업 시 이상 현상이 줄어드는 것은 맞지만, 그것이 오히려 성능을 저해할 수 있다.

 

그래서 가겁적 하나의 데이블로 데이터를 관리하기도 한다. 이러한 이유에서 NoSQL에서는 기본적으로 정규화를 하지 않는다. 검색의 속도를 높이기 위해 분할되어 있는 테이블을 하나로 합치는 작업을 가리켜 역정규화라고 한다. 때에 따라 정규화를 하지 않거나 정규화된 테이블을 역정규화하기도 한다.


참고 도서

이것이 컴퓨터 과학이다.