처음 학부생 때 공부를 위해서 혹은 실무에서 관계형 데이터 베이스를 접하고, 직접 설계하는 일은 쉽지 않다.
많은 DB 테이블들이 직관적으로 나타나있고 관계 역시 이해하기는 어렵지 않지만 이를 구성하고자 한다면 성능, 데이터의 정합성, 중복 배제 등 고려해야할 내용은 많다. 물론 그걸 다 잘하기는 매우 힘들며, 비즈니스 특성에 따라 트레이드 오프를 감안하여 작성하게 된다. ^^;;
처음 DB 설계를 해보려는 이들에게 이번 정리 내용의 포스팅은 큰 도움이 될 수 있다.
* RDB 설계 시작하기 5가지 단계
(1) DB의 목적을 명확히 한다. (Define the purpose of the DB)
(2) 수집한 데이터를 적절히 나눌 수 있는 기준이 될 Primary Key 를 구성한다.
(3) 테이블 간의 관계를 구상한다. 가장 쉬운 관계의 형성은 PK를 중심으로 생각하는 것이다.
- One to many : Parent 테이블의 모든 value는 많은 Child table의 Record를 가질 수 있으나 Child table의 모든 Value는 Parent table에서 단 하나의 Record에 대응되어야 한다.
- Many to many : Many to many의 관계는 일반적으로 다수의 one to many 관계들로 이루어질 수 있어야 한다.
- One to one : 주로 동등한 레벨의 정보에 대한 Column 분리 용도로 사용된다.
(4) Refine and Normalize the Design(정규화)
Column의 추가나 Optional data 처리를 위한 table 분리 등.
- 1NF : 기본적으로 필요한 속성들을 하나의 entity로 모아놓고 하나의 속성을 UID로 선정했다면 0NF 상태이고, 여기서 Repeating group을 제거하면 1차 정규화 형식이라 한다.
- 2NF : 속성들이 PK의 일부에 대해서만 종속적이라면 이 Part key dependency를 제거하여 2NF 형식이 된다.
- 3NF : 2NF에서 Key가 아닌 다른 속성에 종속적일 때 Inter-data dependency라 하며 이를 제거하면 3NF 형식이 된다.
- BCNF : Key 내의 속성이 key 내의 다른 속성에 종속적이라면 Inter-key dependency라 하며 제거하면 BCNF 형식이 된다.
(5) Denormalize : 순수히 성능만을 위한 기법이다.
- Comined table : 자주 조인하는 테이블의 경우 조인 성능부하를 없애기 위해 미리 Join된 형태로 table에 합침. 그럴 수 없는 경우 Join overhead는 Index나 SQL Plan을 조정한다.
- Derived data : 계산해서 얻을 수 있는 값을 굳이 칼럼으로 따로 빼준다.
- Artificial key : 적절한 PK가 없거나 인덱싱이 힘든 경우 간단한 AK를 만들어 해결하고 PK column은 일반속성화 한다. (예를들어 굳이 나뉘어져있지 않은 기수 번호를 인공적으로 Key로 만들어주어 부여하고 이를 인덱싱하여 성능을 개선한다.)
- Denormalization 의 예시. 유저 정보 테이블 id, name, address. 유저 성적 테이블 id, score. 두 테이블의 조인이 빈번하다면 두 테이블을 합칠 수 있음. Id, name, address, score.
* 추가적으로 좀 더 자세한 설명이 필요하다면 다음 링크가 정말 잘 정리되어있다. http://www.ntu.edu.sg/home/ehchua/programming/sql/relational_database_design.html
'Database > MySQL' 카테고리의 다른 글
RDB - MySQL 에서의 Primary Key 란? (0) | 2018.08.08 |
---|---|
MySQL 의 데이터 타입 캐스팅 (0) | 2018.08.07 |
RDBMS의 관계 - Identifying & Non-Identifying Relationship 에 대하여 (2) | 2018.08.04 |
실무에서도 유용한 MySQL 기본 쿼리(Query) 정리 (0) | 2018.08.04 |
RDBMS? MySQL 은 어떤 소프트웨어일까 (0) | 2018.08.03 |