ERD 중요성
ERD 같은거 메인으로 유지하고 있는게 꼭 필요하겠다.
스키마 변경이나 테이블 추가 같은거 할 때 이 ERD 수정하고 반영할 수 있도록.
이게 없으면 기존 구조를 파악하기가 어렵고, 구조가 한 눈에 안들어오다보니 새로운 컬럼이나 테이블을 추가하면서 역정규화 되거나, 같은 내용의 컬럼이 서로 다른 테이블 2개에 각각 생성되거나 한다.
이렇게 되면 갱신이상 등 데이터 불일치가 발생할 여지가 생긴다.
또한 이런 식으로 테이블 막 추가하다 보면 돌이킬 수 없어짐... 나중에 정규화 하려고 했는데 기존 레코드를 싹 다 복사해서 2개로 나눠주어야만 한다거나...
ER 스키마 >> 릴레이션 사상
간단한 요소에서 복잡한 요소 순으로 사상한다.
단계 1: 정규 엔티티 타입
단계 2: 약한 엔티티 타입
단계 3: 2진 1:1 관계 타입
단계 4: 정규 2진 1:N 관계 타입
단계 5: 2진 M:N 관계 타입
단계 6: 3진 관계 타입
단계 7: 다치 애트리뷰트
정규화 Normalization
정규화란 무엇이고 왜 하나?
- 정규화란, 릴레이션 스키마를 함수적 종속성과 기본키를 기반으로 분리하는 것.
- 데이터 중복과 [수정, 삽입, 삭제] 이상을 최소화 하기 위해 수행함
- 보통 데이터 중복 -> 갱신 이상으로 이어지는 경우가 많음.
- 세 가지 갱신 이상?
- 수정 이상 : 데이터가 중복되어 모든 항목을 일괄 수정하지 않으면 데이터 불일치가 발생
- 삽입 이상 : 불필요한 정보를 함께 저장하지 않고는 어떤 정보를 저장하는 것이 불가능
- 삭제 이상 : 유용한 정보를 함께 삭제하지 않고는 어떤 정보를 삭제하는 것이 불가능
결정자와 함수적 종속성
결정자 (determinant)
- 쉽게 생각해서 A로 검색했을 때 B가 모두 같은 값이 나온다면, A는 B의 결정자다.
- 사원번호 4257로 검색하면 이름 "가나다"만 나온다.
- 사원번호 4257인 사원의 이름이 "가나다"인 동시에 "이말년"일 수는 없음.
- 따라서 사원번호는 이름의 결정자다.
- 즉 A값에 대응되는 B가 꼭 하나여야 한다는 것인데
- 반대로 B값에 대응되는 A는 여러개여도 상관 없다.
- 사원번호 4257 이름 "가나다"
- 사원번호 3215 이름 "가나다"
- 결정자 A는 여러 애트리뷰트로 구성될 수 있음 (복합키 같이)
- 결정자는 추후 분해된 릴레이션의 기본키가 될 수 있다.
함수적 종속성
- A가 B의 결정자이면 B가 A에 함수적으로 종속한다. 라고 말함.
- 완전 함수적 종속성
- 해당 릴레이션의 모든 결정자를 사용해야만 1가지 값으로 결정되는 경우를 완전 함수적 종속성
- 모든 결정자를 써야만 함수적으로 종속하는 경우
- 부분 함수적 종속성
- 해당 릴레이션의 일부 결정자를 사용해도 1가지 값으로 결정할 수 있는 경우 부분 함수적 종속성
- 일부 결정자를 써도 함수적으로 종속하는 경우
- 이행적 함수적 종속성
- A가 B를 결정하고 B가 C를 결정하는 식으로, 한다리 걸쳐서 종속하는 경우
- A가 B,C를 결정하고 B가 C를 결정하는 식으로 직접 종속과 이행적 종속을 동시에 만족할 수도 있음.
정규화 하기
역정규화
- 정규화 수준이 높아질 때 마다 테이블 분리가 일어나므로, DB 설계 자체는 중복과 갱신이상이 적어지게 되지만
- 테이블이 분리되면서 JOIN 필요성이 늘어나니까, 성능 상의 관점에서나 쿼리 가독성의 관점에서는 좋지 않을 수 있음.
- 그래서 요구사항에 따라 적당한 정규화 수준을 선택하는게 중요!
- 경우에 따라서는 역정규화 해서 합쳐버리는 경우도 있다.
참고자료
7장_릴레이션_정규화_1.pdf0.62MB7장_릴레이션_정규화_2.pdf0.49MB
'Data Store' 카테고리의 다른 글
Oracle 오라클 (0) | 2019.05.31 |
---|---|
DB 접근 툴 : Universal Database Tool (0) | 2019.05.27 |
확장성 해싱 VS 선형 해싱 : Shard key (0) | 2019.01.18 |
[DB] ER 스키마 사상 / 정규화 (0) | 2018.04.12 |
[mysql] 일반적인 SQL (0) | 2017.06.11 |
[mysql] 초기 설정 및 계정, DB (0) | 2017.06.11 |