어제, 오늘(7일 8일)은 데이터베이스 구축을 위한 데이터모델링(Data Modeling)과 정규화(Normalization)를 학습하였습니다

Today I Learned
- Data Modeling
- Normalization
Data Modeling
Key의 종류
- 기본키(Primary Key) : 후보키 중에서 특별히 선정된 주키(main key). 중복된 값을 가질 수 없다.
- 후보키 : 테이블의 속성들 중에서 레코드를 유일하게 식별 할 수 있는 속성들의 부분집합. 기본키로 사용할 수 있는 속성들을 의미.
- 대체키 : 후보키가 둘 이상일 때 기본키를 제외한 나머지 후보키
- 슈퍼키 : 레코드를 식별 할 수 있는 두개 이상의 속성의 집합으로 구성된 키
- 외래키 : 다른 테이블(부모)의 기본키를 참조하는 속성
개념적 데이터 모델링(개념설계)
- 엔티티의 사이에서 일어나는 관계(액션)를 개념적으로 도표화 한다.
- 관계 방식으로 1:1, 1:N, N:M 관계가 있다.
- 관계 방식 판단 방법
- 1:1 관계 : 두가지 엔티티가 서로 하나의 레코드끼리 관계를 가지는 경우
ex) 주문 --- 주문서
- 1:N 관계 : 엔티티 A는 엔티티 B의 여러개의 레코드와 대응하고, 엔티티 B는 엔티티 A의 레코드 한 개와 대응하는 관계
ex) 회원 --- QnA(하나의 회원이 여러 개의 QnA를 남길 수 있음, 하나의 QnA는 한명의 회원만이 작성 할 수 있음)
- N:M 관계 : 엔티티 A는 엔티티 B의 여러개의 레코드와 대응하고, 엔티티 B도 엔티티 A의 여러개의 레코드와 대응하는 관계
ex) 회원 --- 숙소(하나의 회원이 여러 숙소에 예약 가능, 하나의 숙소도 여러 회원이 예약 할 수 있음)



논리적 데이터 모델링
- 설계 tip
- N:M 관계인 액션만 테이블을 가질 수 있다.
ex) 회원 --- 예약(액션) --- 관계
- 다대 다의 관계이므로 예약이라는 액션 엔티티는 별도의 테이블로 구성
- 1:N 인 경우, 관계(액션)의 속성은 N쪽 개체의 속성으로 관계와 함께 관계+속성으로 들어간다
ex) 업체 --- 등록(액션) --- 숙소
- 업체와 숙소는 1:N 관계이므로 등록이라는 액션의 속성인 '일자'가 '등록일자'라는 이름으로 숙소의 속성으로 들어간다.
- 1:N의 관계에서 1쪽이 부모이고, N쪽이 자식이 되는데 부모의 키가 자식의 Foreign Key로 들어가야한다.
ex) 업체 --- 등록 --- 숙소
- 업체의 기본키(Primary Key)가 숙소의 외래키로 들어간다.
- N:M의 관계에서는 릴레이션 테이블이 생성 되는데, 이 테이블의 키를 잘 선택해야한다.
- 양쪽 엔티티의 기본키들을 외래키로 받아서 두 개의 복합속성으로 키를 구성(복합키, 슈퍼키) - 식별관계
- 새로운 키를 생성하여 사용 - 비식별관계

Normalization
- 개념적 모델링의 산출물인 E-R 도표를 통해 논리적 테이블을 구성하고, 테이블에서 중복을 제거하여 무결성을 가질 수 있게 만드는 것
- 제1 정규화
- 테이블 하나의 컬럼이 하나의 값만 가질 수 있는 것
- 여러개의 값을 가지는 컬럼은 따로 자식테이블로 생성하여 정규화 진행
- 제2 정규화
- 기본키 그룹에 부분함수 종속인 속성이 존재하면 안됨.
- 기본키 그룹에 부분 함수 종속인 속성이 존재한다면 걔네 부모에게 돌려줘라 이것임.
- 제3 정규화
- 이행적 종속을 제거
- 이행적 종속 : x(기본키) ---> y를 만족하고 y ---> z를 만족하여 x ---> z를 만족하는 관계
- 쉽게 말하면 재사용 되는 데이터가 존재할 때를 말함.
- 속성에 새것이 아닌 재사용되는 올드 버전이 들어와 있는것
- 따로 부모 테이블로 만들고 그 부모테이블의 키를 참조하는 식으로 정규화 진행
- 제4 정규화
- 다대 다 관계에서는 관계를 액션 엔티티로 분류해라!
물리적 데이터모델링
- 논리적 데이터모델링의 산출물을 실제 데이터베이스의 테이블로 작성하는 과정.
- 정리된 테이블들의 컬럼데이터 타입 설정 및 제약조건 등을 설정해줌
- 제약조건 설정
- 도메인 제약조건 : 속성 제약조건(유효값)
- 엔티티 제약조건 : 레코드 제약조건
- 속성이 올바른 값들로 이루어 졌더라도, 키가 중복해서 들어가는 등 레코드 단위로 제약조건을 만족시키지 못했다면 무결성 위배(레코드 식별 불가능)
- primary key, unique
- 릴레이션(관계) 무결성
- 참조 무결성을 위한 제약조건으로서 외래키 제약조건을 걸어둠

어제부터 오늘까지 데이터 모델링과 테이블 생성까지 진행해 보았습니다.
처음으로 실제 데이터 모델링 + 정규화 + 테이블 생성을 해본터라 완벽하진 않았지만 최선을 다해 이해하고 테이블을 구성 해 보았습니다.
완성된 테이블들을 보니 어서 웹에 적용시켜보고싶은 욕심이 생깁니다!