Rubberduck-Debugging

[5일차] exerd 논리 DB모델링 본문

개발자/20181127 교육과정

[5일차] exerd 논리 DB모델링

P缶 2018. 12. 3. 11:39

# DB 모델링
- 모델링? 생각한 바를 글과 그림으로 표현한 것.
- 렌더링? 명령어를 해석하여 화면에 출력하는 것.
예) HTML 렌더링 => HTML 태그를 해석하여 그에 해당하는 UI를 출력하는 것.

- DB 모델링? 데이터 속성과 관계를 글과 그림으로 표현한 것.
- 목표? 중복 데이터를 제거 ==> 데이터의 안정성, 신뢰성을 높인다. ==> 무결성을 유지한다.

## [논리모델]
- 특정 DBMS를 고려하지 않고 수행하는 개념적인 모델링

### 01. 엔티티 식별 및 속성 식별
엔티티 = 테이블
속성(attribute) = 컬럼(column)

### 02. 주 키 선정(Primary Key; PK)
- 데이터를 구분할 때 사용할 식별자를 지정한다.
- 식별자란(key)?
- 데이터를 구분할 때 사용하는 값.
- 한 개 이상의 컬럼을 지정할 수 있다.

- 후보키(candidate key) 선정
- key 들 중에서 최소키(최소한의 컬럼 값 만으로 식별이 가능한 key)를 선정한다.
- 예)
- 이메일 (이름, 전화, 이메일 값 모두가 필요 없다)
- 이름, 전화 (이름, 전화, 이메일 또는 이름, 전화, 전공 값이 모두 필요하지 않다)

- 주키(primary key; PK) 선정
- 후보키 중에서 데이터 식별자로 사용하기 위해 선정된 키

- 나머지 후보키는 대안키(alternate key) : 비록 PK는 아니지만,
PK와 마찬가지로 데이터 식별자로 대체하여 사용할 수 있기 때문.

- 임의의 주키 만들기(대부분 이 방법 사용!)
- 주키로 사용하기에 컬럼의 개수가 많고 복잡한 경우,
일련번호와 같은 임의의 컬럼을 추가하여 PK로 만들기도 한다.
- 주키로 선정된 컬럼의 값은 변경될 수 없기 때문에,
일련번호와 같은 임의의 컬럼을 pk로 사용한다.
pk가 아닌 컬럼은 언제든 값을 변경할 수 있다.
- 예)
- 게시판 글은 '글올린 사용자 번호' 혹은 '사용자들에게 노출되는 글번호'가 아닌,
내부적으로 증가하는 '게시판 글번호'가 실제 주키로 사용됨.



* EXERD 편집모드



* 논리적 이름은 변경 가능하지만(주키 : 회원번호 -> 외래키 : 수강생번호, 매니저번호, 강사번호),

물리적 이름은 전부 mno로 동일함.

이때 회원 테이블은 나머지 세 테이블을 포함하는 관계라고 할 수 있다.


#### 03. 제1정규화
- 정규화 : 별도의 테이블로 중복된 데이터 분리. 그리고 부모-자식 관계를 맺는다.
- 예) 부모 : 회원 데이터(주 키 : 회원번호) -> 자식 : 수강생 데이터(외래: 수강생번호),
강사 데이터(외래키: 강사번호), 매니저 데이터 분리(외래키: 매니저번호)

#### 외래키(foreign-key)
- 다른 테이블의 PK 값을 저장하는 컬럼.
- (보통 부모-자식 관계를 맺는 테이블이 있을 때, 자식 테이블 쪽에서 부모 테이블의 데이터를 가리키기 위해
외부키 컬럼을 둔다)

제2정규화 제3정규화 모르겠다 

### 04. 제2정규화
- PK가 여러 컬럼으로 이루어진 경우에 수행
- 모든 일반 컬럼은 반드시 PK 컬럼에 종속되어야 한다.
그렇지 않은 일반 컬럼이 있다면 별도의 테이블로 분리하여 부모-자식 관계를 맺는다.

### 05. 제3정규화
- 어떤 컬럼이 PK가 아닌 다른 일반 컬럼에 종속되는 경우가 있다면,
별도 테이블로 분리하여 부모-자식 관계를 맺는다.


### 06. 다 대 다 관계의 해소
- 테이블과 테이블 사이에 다 대 다 관계를 형성한다면,
일 대 다의 관계로 변경해야 한다.
- 왜? DBMS는 물리적으로 다 대 다 관계의 데이터를 저장할 수 없다.
- 해결책?
두 테이블의 관계를 저장할 "관계 테이블"을 만든다.
관계 테이블은 각 테이블과 일 대 다의 관계를 맺는다.

### 07. 포함 관계 및 배타적 관계 추가
- 여러 테이블에 공통으로 포함되는 컬럼이 있는 경우를 별도의 테이블로 정의한다.
다음 중 하나의 관계로 설정한다.
- 기본 데이터를 저장하고 있는 테이블 쪽을 부모 테이블로 한다.
- 포함 관계
- 여러 테이블에서 동시에 포함할 수 있는 관계이다.
- 배타적 관계
- 여러 테이블 중에서 오직 한 개의 테이블만 포함할 수 있는 관계다.

### 08. 관계의 차수 지정
- 데이터 끼리 상호 관계의 개수를 지정한다.
- 예)
1    : *  (0이상) => FK 컬럼이 not null 이다.
1    : 1* (1이상) => FK 컬럼이 not null 이다.
0..1 : *  (0이상) => FK 컬럼이 null 허용이다.
0..1 : 1..* (1이상) => FK 컬럼이 null 허용이다.


### 09. 유니크(Unique) 컬럼 지정
- PK는 아니지만 PK처럼 중복되어서는 안되는 컬럼이다. PK로 선정되지 않은 나머지 키는 유니크 컬럼으로 지정하여
데이터가 중복되지 않도록 한다.

## 식별 관계와 비식별 관계
### 비식별 관계(non-identifying)
- 부모의 pk = 자식의 fk
- 자식 테이블의 외부키가 그 테이블에서 일반 컬럼으로 사용될 때
즉 관계를 표현하는 외부키가 그 테이블에서 식별자로 사용되지 않는 것을 말한다.

(강의실은 1개에 수업이 여러개 있으므로, 1대 다의 비식별관계다. 인터넷강의도 있을 수 있기에 null이 허용되었다)

### 식별 관계(identifying)
- 부모의 pk = 자식의 fk(이자 pk)
- 자식 테이블의 외부키가 그 테이블에서 PK 컬럼으로 사용될 때
- 즉 관계를 표현하는 외부키가 그 테이블에서 식별자로 사용되는 것을 말한다.

(회원 1명당 강사 1명이므로 1대1 식별관계다.

강사 1명당 강사배정받는 수업이 여러개이므로 1대다 식별관계다. 강사배정 못받는 강사도 있을 수 있으므로 null이 허용되었다ㅜ)