모델이란?
- 목적을 가지고 진짜를 모방한 것
- 좋은 모델이란 목적에 부합하는 모방을 의미
데이터 모델링
- 복잡한 현실을 컴퓨터로 처리할 수 있게 만드는 것
- 업무파악 → 개념적 데이터 모델링 → 논리적 데이터 모델링 → 물리적 데이터 모델링
- 복잡한 현실을 고도의 추상화 과정을 통해 컴퓨터가 처리할 수 있는 형태로 옮기는 것
- 구성원들 끼리 UI를 같이 그려보면서 서로의 생각을 일치 시킬 수 있음
개념적 데이터 모델링
- 개념적 모델링을 잘 하면 논리적, 물리적 모델링도 잘 할 수 있음
- 현실로부터 개념을 인식, 업무에서 개념을 뽑아내기
- 현실 세계의 정보를 그룹화 하고 그 그룹들 간의 관계를 그림으로 나타낸 것이 ERD 이다
- RDB는 내포관계를 허용하지 않음
- 거대 단일 테이블로 표현을 하면 중복이 발생 → 정규화를 해야 하는 이유
- 엔터티(Entity)는 쉽게 말해 실체, 객체라고 생각할 수 있다.
- 엔터티는 사람, 장소, 물건, 사건, 개념 등과 같은 명사에 해당된다.
- 엔터티는 업무상 관리가 필요한 것에 해당된다.
- 엔터티는 저장 되기 위한 어떤 것(Thing)에 해당된다.
- 엔터티 → 테이블, 어트리뷰트(속성) → 컬럼, 릴레이션 → PK/FK, 튜플 → Row
- UI와 데이터베이스는 원인과 결과의 관계를 가짐
- 기획서에서 엔터티를 추출
- 모델링이 UI를 검증하거나 UI가 모델링을 검증하는 교차 검증이 가능함
- 따라서 기획 담당과 모델링 담당이 같이 UI를 구성해보는 것이 좋음
- 식별자: 여러개의 속성 중 엔터티를 대표 할 수 있는 속성
- 후보키: 식별자가 될 수 있는 후보들
- 기본키: 후보키 중에서 식별자로 선택한 키
- 대체키: 후보키 중에서 기본키를 제외한 것들
- 중복키: 중복될 수 있는 속성들
- 개념적 모델링 ERD에서 관계는 마름모꼴로 표현
- Cardinality(기수성): 카디널리티는 전체 행에 대한 특정 컬럼의 중복 수치를 나타내는 지표이다.
- 중복도가 ‘낮으면’ 카디널리티가 ‘높다’고 표현한다.
- 중복도가 ‘높으면’ 카디널리티가 ‘낮다’고 표현한다.
- 1대1, 1대다, 다대다 관계
- Optionality(선택성): 사용자는 댓글을 작성하지 않을 수도 있다(optional) 단 각 댓글은 반드시 그 댓글을 쓴 사용자가 있다(mandatory)
논리적 데이터 모델링
- 개념적 모델링을 통해 도출한 결과를 관계형 데이터베이스 시스템이 맞게 정리하는 것
- 개념적 ERD → 매핑 룰 → 논리적 ERD
- 엔터티=테이블, 속성=컬럼, 관계=PK/FK
- ER Master라는 툴이 있음, Eclipse 기반
- 1대1 관계에선 auto increment id가 필요 없을 수 있음
- 다대다 관계를 표현하기 위한 매핑 테이블(연결 테이블)이 필요하다
- 정규화
물리적 데이터 모델링
- find slow query, 쿼리의 병목 지점 찾기
- 성능 개선을 위해 가장 먼저 고려할 것은 인덱스와 캐시
- 비정규화는 여러가지 부작용이 있기 때문에 신중히 결정해야 함
- 정규화는 쓰기의 편리함을 위해 읽기 성능을 희생하는 것
- 정규화를 하고 난 뒤 필요에 의해 비정규화를 하는 것이지, 처음부터 비정규화를 적용하는 것이 아님, 정규화 한다고 무조건 성능이 떨어지게 되는 것도 아님
- 비정규화는 정규형과 같은 명확한 정의가 없고, 필요에 따라 구성하면 됨
- 방법1: JOIN을 줄이기 위해, 정규화한 컬럼을 합치고 중복을 허용
- 방법2: 파생 컬럼을 만들어서 계산작업 줄이기, 예시: 저자 테이블에 글 개수 컬럼 추가
- 방법3: 컬럼을 기준으로 테이블을 분리, 정규화와는 다른 개념, 샤딩이라고 부름
- 방법4: 행을 기준으로 테이블을 분리, row의 개수가 많다면 개수별로 테이블을 나누는 것, 예를 들어 DB에 등록된 사용자가 백만 명이라면, 만 명 단위로 테이블을 나눠서 100개의 테이블로 관리할 수 있음
- 방법5: 관계의 역정규화, JOIN을 줄이기 위해 지름길을 만드는 것