수강신청과 수강등록을 따로 테이블 구분한 이유는
수강신청테이블은 가장 몰리는 테이블, 특정 기간이 지나면 다 비우기 위해서 쓴다.
복합키를 제대로 써먹을 때는 순서가 중요하다
그 지표는 분포도가 좋아야한다.
학번 학기코드 교과코드
테이블을 쪼갤 수 있는 명분을 찾는다.
: 1972년 E.F CODE 박사에 의해 제안된 이론으로 실세계에서 발생하는 데이터를 수학적인 방법에 의해 구조화시켜 체계적으로 관리할 수 있도록 한 이론
: 엔티티를 구성하는 속성간의 중복을 제거하여 데이터베이스를 최적화
: 속성간의 함수 종속성에 의해 발생하는 이상현상을 제거
2정규화 : 복합키여야 된다.
3정규화 : pk에 종속성이 없는 컬럼을 분리 (실무에서는 3정규화 4정규화 안하고 바로 역정규화)
: 반복되는 속성이나 그룹의 속성을 제거하고, 새로운 엔티티를 추가한 후에 기존의 엔티티와 일대다의 관계를 형성
예) 하나의 제품에 대해 여러개의 주문서가 접수된 내용
팁)엑셀에 샘플데이터를 넣어 보면 잘못된것이 보인다(중복속성이라던가)
복합키, 관련없는 것은 분사시킨다. 위 테이블에서 주문목록2가 제 2정규화 대상이 된다.
주문번호와 제품번호에 의존적인 속성은 주문수량뿐이다.
하나의 제품은 여러번 주문되어지고, 하나의 주문은 여러개의 제품을 가질 수 있다.
주문 테이블을 보면, 주문번호에 의존적이지 않은 속성이 존재한다(고객번호,사업자번호,우선순위 등)
키에 의존될 수 있게 고객번호를 키로 만들고 분리하면 다음과 같이 가능하다.
회원은 여러개의 자격증을 가질수도있고 가지지 않을수도 있다.
하나의 자격증은 여러개의 회원을 가질수도있고 가지지 않을 수도 있다.
책과 저자의 관계는 다대다관계다.
일반적으로 다대다 관계를 해소하기위한 책아이디와 저자아이디의 FK로만 이뤄진 테이블에 컬럼을 두지 않는데,
수정기능이나 삭제등보다 역정규화를 통해서 조회성능을 우선적으로 선택하기위해 다대다관계에서 2정규화에 위배되는 저자이름과 책이름
무결성 깨지는 문제는 트리거,계산된컬럼으로 해결하겠다
라는것도 하나의 방법이다.
성능적인 측면에서 모델링 ....
정규화 (주관심 별로 테이블 나누어서 생성) : 고객, 주문
.>> OOP , AOP >> 주관심, 보조(공통) ...
즉, 관심사 별로 테이블 분리하자.최소한 정규화 대상이 많아지진 않더라~~!!!
두번째는
.>>DB 설계
.>> 트랜잭션(테이블 별로 빈도 파악)
.>> OLTP(실시간 데이터 삽입,수정,삭제)환경 <-> OLAP(특정 주기를 가지고 데이터 조회)
CRUD 매트릭스
.>> 반 정규화 근거 마련 >> 해결점
.>> 테이블, 속성, 관계 나누거나, 변경
.>> 인덱스(PK,FK)
총정리
정규화
1. 데이터 중복 감소 >> 성능
2. 데이터 관심사를 관리(분리) >> 성능(학생,성적)
3. 조인 질의 >> 성능 저하
.>>학생의 학점을 보고 싶어요 ... 과목 ... 학과인지를 주된 조회...(빈번)
.>> 3,4개의 조인(데이터 증가) >> 통합 고민(반정규화)
길동이가 그동안 수강을 많이 했는지 900건이나..
1000만건 -> 200만건