본문 바로가기
네이버클라우드/JAVA 웹 프로그래밍

JAVA 57일차 (2023-08-10) 자바 프로그래밍_DB모델링 연습_논리모델_개인프로젝트 - 마트 관리 시스템

by prometedor 2023. 8. 10.
- DB 모델링
  - exerd.com의 ER-Diagram 도구 설치
  - 제1정규화, 제2정규화, 제3정규화 방법
  - ER-Diagram 작성법
  - 논리모델링 실습
- 개인 프로젝트
  - DB 모델링 수행

 

exerd.com 의 ER-Diagram 도구 설치

https://exerd.com/index.do

 

eXERD

사용자 권한관리 업무에 따른 모델 접근 권한 관리(생성, 수정, 삭제)가 가능하며, 사용자별 권한 부여를 통해 데이터 모델의 보안성을 강화 시킵니다.

exerd.com

 

ㄴ [다운로드] 선택

=>

ㄴ eXERD 3.X -> [다운로드] 선택

=>

ㄴ eXERD 3.x Update Site URL 의 링크 선택

=>

ㄴ 해당 url 복사하기

=>

ㄴ Install New Software... 선택

=>

ㄴ [Add...] 버튼 선택

ㄴ Name 을 exerd 로 변경하고 Location 에 복사한 url 붙여넣은 후 [Add] 선택

=>

ㄴ eXERD 체크박스 체크한 후 [Next >] 선택

=>

ㄴ [Next >] 선택

=>

ㄴ I accept the terms of the license agreements 선택 후 [Finish] 선택하기

=>

ㄴ 설치 후 Eclipse 재시작

 

 

ㄴ report-server 프로젝트의 doc 폴더에 model 폴더 생성

=>

ㄴ 생성한 model 폴더에 eXERD File 선택 후 [Next >] 선택

=>

 

## [논리모델]

- 특정 DBMS를 고려하지 않고 수행하는 개념적인 모델링
- 표기법: IE(Information Engineering), Barker

### 01. 엔티티 식별 및 속성 식별

- 특정 값들의 집합? 시스템에서 다루는 데이터를 식별한다.
- 다른 말로 "테이블"이라고 한다.
- 테이블을 구성하는 값 => 속성(attribute) = 컬럼(column)
- 예:
  - 고객(이름,전화,이메일,주소,...)
  - 제품(제품명,제품가격,재고수량,...)
  
### 02. 주 키 선정(Primary Key; PK)

- 데이터를 구분할 때 사용할 식별자를 지정한다.
- 만약 PK로 지정할 적절한 컬럼이 없거나, 있더라도 여러 개의 컬럼을 묶어서 사용해야 하는 경우
  surrogate key(대리 키=인공 키) 사용을 고려하라!

### 03. 테이블 간의 관계 식별

1. 포함 관계 및 배타적 관계 식별

- 여러 테이블에 공통으로 포함되는 컬럼이 있는 경우, 별도의 테이블로 분리한다.
- 공통 데이터를 저장하고 있는 테이블 쪽(수퍼 타입 테이블)을 부모 테이블로 하고
  부모 테이블을 참조하는 테이블(서브 타입 테이블)을 자식 테이블로 하여 테이블 간에 관계를 맺는다.
  - 자식 테이블 쪽에 FK가 추가된다.
- 관계 유형
  - 포함 관계
    - 여러 테이블에서 동시에 포함할 수 있는 관계이다.
  - 배타적 관계
    - 여러 테이블 중에서 오직 한 개의 테이블만 포함할 수 있는 관계다.
  - 참고:
    - 포함관계와 배타적관계를 제어할 수 있는 SQL 문법은 없다.
    - 프로그래밍으로 제어해야 한다.

2. 일반 관계

- 두 테이블 사이의 관계 식별하여 연결한다.
- 부모-자식 관계로 정의한다.
  - 데이터를 참조하는 쪽이 자식 테이블이다.
  - 데이터를 참조 당하는 쪽이 부모 테이블이다.

 

ㄴ 테이블 추가

 

ㄴ 컬럼 추가 (단축키 : Command + Enter 키)

 

dbmodeling-01.exerd

ㄴ 프라이머리 키 컬럼 설정 (단축키 : Command + Shift + Enter 키)

=>

dbmodeling-01.exerd

ㄴ 일반 컬럼값과 프라이머리 키 컬럼 설정

 

#### 04. 제1정규화

- 정규화? 데이터 중복을 찾아내어 별도의 테이블로 데이터를 분리시키는 것.
- 중복 데이터 또는 중복 컬럼을 별도의 테이블로 분리하여 부모-자식 관계를 맺는다.
- 데이터를 참조 하는 테이블이 자식테이블이고, 데이터를 갖고 있는 테이블이 부모 테이블이다.
- 자식 테이블에서는 부모 테이블의 데이터를 가리키기 위해 그 데이터의 pk값을 보관해야 한다.
  - 부모-자식 테이블을 식별하기 애매할 때 1 : 다 관계에서 1 쪽이 부모 테이블이다.
- 이렇게 부모 테이블의 데이터에 대해 PK값을 저장하는 컬럼을 외부키(FK)라 부른다.
- 중복 컬럼? 사진1, 사진2, 사진3
- 중복 데이터? 지점명, ...

### 05. 제2정규화

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

 

dbmodeling-04.exerd

ㄴ 제품번호라는 이름의 프라이머리 키 컬럼을 추가

=>

dbmodeling-04.exerd

ㄴ 제품 테이블과 제품구매 테이블을 1 : 다 비식별관계로 연결

=>

dbmodeling-04.exerd

ㄴ 고객 테이블에 "고객번호" 라는 이름의 프라이머리 키 컬럼을 추가

=>

dbmodeling-04.exerd

ㄴ 고객 테이블과 제품구매 테이블을 1 : 다 비식별관계로 연결

=>

dbmodeling-04.exerd

=>

dbmodeling-04.exerd

ㄴ 테이블 테마 지정해보기

=>

dbmodeling-04.exerd

ㄴ 제품구매 테이블에 필요한 컬럼 추가

=>

dbmodeling-04.exerd

ㄴ "지점번호" 라는 이름의 프라이머리 키 컬럼 추가

=>

dbmodeling-04.exerd

ㄴ 제품사진 테이블을 분리하여 "제품사진번호" 라는 이름의 프라이머리 키 컬럼을 추가

ㄴ 제품 테이블과 제품사진 테이블을 1 : 다 비식별 관계로 연결

=>

dbmodeling-04.exerd

ㄴ 직원 테이블에 "직원번호" 라는 이름의 프라이머리 키 컬럼을 추가

ㄴ 지점 테이블과 직원 테이블을 1 : 다 비식별 관계로 연결

=>

dbmodeling-04.exerd

=>

dbmodeling-04.exerd

ㄴ 관리자 테이블을 분리하여 "관리자번호" 라는 이름의 프라이머리 키 컬럼 추가

ㄴ 지점 테이블과 관리자 테이블을 1 : 다 비식별 관계로 연결

=>

dbmodeling-04.exerd

 

 

### 06. 제3정규화

- 어떤 컬럼이 PK가 아닌 다른 일반 컬럼에 종속되는 경우가 있다면,
  별도 테이블로 분리하여 부모-자식 관계를 맺는다.
  - 예) 우편번호와 기본 주소

 

dbmodeling-06.exerd

=>

dbmodeling-06.exerd

ㄴ 자동배치 실행

=>

dbmodeling-06.exerd

ㄴ 직원 우편번호, 기본주소는 제거

=>

dbmodeling-06.exerd

 

### 07. 다 대 다 관계의 해소

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

dbmodeling-07.exerd

ㄴ 현재 해소할 다대다 관계는 없음

 

** 다대다 관계 해소 예시

ㄴ 다대다 관계를 해소하기 위해 강의배정이라는 테이블을 추가하여 강의번호와 강사번호를 함께 엮어 PK 컬럼으로 지정해줌

 

 

### 08. 관계의 차수 지정

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

dbmodeling-08.exerd

ㄴ 관계 차수도 변경 내용 없음

 

 

### 09. 유니크(Unique) 컬럼 지정

- PK는 아니지만 PK처럼 중복되어서는 안되는 컬럼이다.
- 대체 키(alternate key) 컬럼이 유니크 컬럼이 된다.
- 즉 PK로 선정되지 않은 나머지 후보 키는 유니크 컬럼으로 지정하여 데이터가 중복되지 않도록 한다.

dbmodeling-09.exerd

=>

ㄴ 유니크 키 설정

=>

ㄴ 이메일을 유니크 키로 설정

=>

dbmodeling-09.exerd

=>

ㄴ 유니크 키 설정

=>

ㄴ 이메일을 유니크 키로 설정

=>

dbmodeling-09.exerd

=>

=>

=>

dbmodeling-09.exerd

=>

=>

=>

dbmodeling-09.exerd

 

 

### 10. null 허용 여부 지정

- 필수 입력 컬럼인지 선택 입력 컬럼인지 지정한다.

ㄴ 테이블 헤더 보이기

=>

dbmodeling-10.exerd

ㄴ 널 허용 체크하기

=>

dbmodeling-10.exerd

ㄴ 도메인 체크 해제

=>

dbmodeling-10.exerd

ㄴ 데이터 타입 체크 해제

=>

dbmodeling-10.exerd

ㄴ 직원 테이블 NULL 허용 설정

=>

dbmodeling-10.exerd

ㄴ 고객 테이블 NULL 허용 설정

=>

dbmodeling-10.exerd

ㄴ 제품구매 테이블 NULL 허용 설정

=>

dbmodeling-10.exerd

ㄴ 제품 테이블 NULL 허용 설정

=>

dbmodeling-10.exerd

ㄴ 지점 테이블 NULL 허용 설정

=>

dbmodeling-10.exerd

ㄴ 제품사진 테이블 NULL 허용 설정

=>

dbmodeling-10.exerd

ㄴ 관리자 테이블 NULL 허용 설정

 

 

### 11. 인덱스 컬럼 지정

- 데이터를 찾을 때 검색 조건으로 사용할 컬럼을 지정한다.
- 조회 컬럼으로 지정하면 그 컬럼의 값으로 색인표가 자동으로 생성되어
  데이터를 찾는 속도가 빨라진다.
- 장점: select 속도가 빨라진다.
  단점: insert,update,delete 할 때 마다 색인표를 갱신해야하므로 속도가 느리다.

dbmodeling-11.exerd

=>

=>

=>

dbmodeling-11.exerd

=>

=>

=>

dbmodeling-11.exerd

=>

=>

=>

dbmodeling-11.exerd

 

 

### 12. 포함관계와 배타적 관계 식별

- 테이블의 공통 컬럼을 추출하여 수퍼 타입 테이블을 정의한다.
- 부모(수퍼타입 테이블)-자식(서비타입 테이블) 관계를 맺는다.
- DBMS의 문법으로는 포함 관계와 배타적 관계를 구분할 수 없다
- 프로그래밍으로 처리해야 한다.

dbmodeling-12.exerd

ㄴ 회원 테이블 생성

=>

dbmodeling-12.exerd

=>

=>

 

dbmodeling-12.exerd

ㄴ 해당 컬럼 삭제 후 회원과 관계연결

=>

dbmodeling-12.exerd

=>

=>

dbmodeling-12.exerd

=>

=>

dbmodeling-12.exerd

=>

dbmodeling-12.exerd

=>

dbmodeling-12.exerd

=>

=>

=>

dbmodeling-12.exerd

=>

=>

=>

ㄴ 식별관계 연결 추가

=>

dbmodeling-12.exerd

=>

=>

dbmodeling-12.exerd

=>

=>

dbmodeling-12.exerd

=>

dbmodeling-12.exerd

=>

=>

dbmodeling-12.exerd

=>

dbmodeling-12.exerd

=>

dbmodeling-12.exerd

ㄴ 자동 배치 실행

=>

dbmodeling-12.exerd

 

 

dbmodeling-12.exerd

ㄴ 공지사항, 공지유형 테이블 추가

=>

dbmodeling-12.exerd

ㄴ 장바구니 테이블 추가

=>

dbmodeling-12.exerd

ㄴ 주소는 각각 필요한 곳으로 넣어준 후 주소 테이블은 제거하도록 함

=>

dbmodeling.exerd

ㄴ 최종본