-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[우아] Chapter 4. DATABASE 설계 & AWS RDS 설정 (#22)
* Update PULL_REQUEST_TEMPLATE.md * keyword: Chapter 4. workbook keyword 정리 * mission: Chapter 4 미션 수행 * rename: 챕터 번호 수정 * fix: 오타 수정 * rename: CH04Keyword.md to Ch04Keyword.md --------- Co-authored-by: 권채연 <[email protected]>
- Loading branch information
1 parent
21af0ea
commit 7a69c8d
Showing
28 changed files
with
263 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,219 @@ | ||
# Chapter 4. DATABASE 설계 & AWS RDS 설정 | ||
|
||
> UMC 워크북 4주차 키워드에 관한 내용을 정리해보겠습니다 :) | ||
# ✅ 1. 키 | ||
> DB에서의 "키"는 데이터베이스에서 데이터를 식별하고 정렬하는 데 사용되는 중요한 개념이다. | ||
키는 아래와 같이 다양한 종류가 존재한다. | ||
1. 수퍼키 | ||
2. 후보키 | ||
3. 기본키 | ||
4. 대체키 | ||
5. 외래키 | ||
6. 복합키 | ||
|
||
## 키를 설명하기 위한 학생 테이블 예시 | ||
![alt text](image.png) | ||
- 학생마다 고유한 학번을 가지고 있다. | ||
- 학생마다 고유한 주민등록번호를 가지고 있다. | ||
- 학과, 학년, 이름은 중복될 수 있다. | ||
|
||
|
||
## 1) 수퍼키 (Super Key): | ||
- 수퍼키는 **테이블에서 유일성을 보장하는 열 또는 열의 집합**이다. | ||
- 즉, 특정 조건을 충족시키면 레코드를 식별할 수 있는 어떠한 열의 조합도 수퍼키가 될 수 있다. | ||
- 예를 들어, `학생 테이블에`서 `학번`과 `이름`의 조합은 수퍼키가 될 수 있다. | ||
|
||
## 2) 후보키 (Candidate Key): | ||
- 후보키는 **기본 키로 사용될 수 있는 열의 집합**이다. | ||
- 유일성과 최소성(최소성은 다른 후보키의 부분집합이 아닌)을 만족해야 한다. | ||
- 예를 들어, `학생 테이블`에서 `학번`과 `주민등록번호`는 후보키가 될 수 있다. | ||
|
||
## 3) 기본키 (Primary Key): | ||
- 기본키는 테이블에서 **각 레코드를 고유하게 식별**하는 데 사용된다. | ||
- NULL 값이 허용되지 않으며, 중복될 수 없다. | ||
- 예를 들어, `학생 테이블`에서 `학번`이 기본키가 될 수 있다. | ||
|
||
## 4) 대체키 (Alternate Key): | ||
- 대체키는 **후보키 중에서 선택된 기본 키가 아닌 나머지 후보키들**을 의미한다. | ||
- 즉, 기본키가 될 수 있었지만 선택되지 않은 후보키이다. | ||
- 예를 들어, `학생 테이블`에서 `주민등록번호`가 기본키로 선택되었다면, `학번`은 대체키가 될 수 있다. | ||
|
||
## 5) 외래키 (Foreign Key): | ||
- 외래키는 다른 테이블의 기본키를 참조하는 열로, **두 테이블 간의 관계를 정의**하는 데 사용된다. | ||
- 외래키 값은 참조하는 테이블의 기본키 값이어야 한다. | ||
- 예를 들어, `학생 테이블`에서 `학과`를 나타내는 열이 다른 테이블의 학과 테이블의 기본키를 참조하는 경우가 있다. | ||
|
||
## 6) 복합키 (Composite Key): | ||
- 복합키는 **두 개 이상의 열의 조합으로 이루어진 키**다. | ||
- 개별 열의 값만으로는 유일성을 보장하지 못하지만, 열들의 조합으로는 유일성을 보장할 수 있다. | ||
- 예를 들어, `주문 테이블`에서 `주문번호`와 `제품번호`의 조합이 복합키가 될 수 있다. | ||
|
||
# ✅ 2. ER 다이어그램 | ||
> Entity-Relationship(ER) 다이어그램은 데이터 모델링에서 사용되는 그래픽 표현 방법 중 하나이다. 시스템 내의 엔터티(Entity)와 엔터티 간의 관계를 시각적으로 보여주는 데 사용된다. | ||
보통 아래 3가지를 통해 엔터티 간 관계를 나타낸다. | ||
|
||
## 1) 엔터티(Entity): | ||
![alt text](image-1.png) | ||
엔터티는 시스템 내에서 개별적으로 식별할 수 있는 무언가를 나타낸다. 일반적으로는 실제 세계의 사물 또는 개념을 나타낸다. 예를 들어, `학생`, `교수`, `과목`, `강의` 등이 엔터티가 될 수 있다. | ||
|
||
보통 직사각형으로 엔터티 세트를 표현한다. 또한, 밑줄을 통해 기본키를 나타낸다. | ||
|
||
## 2) 속성(Attribute): | ||
엔터티의 특징이나 속성을 나타낸다. 예를 들어, 학생 엔터티의 속성으로는 `학번`, `이름`, `학과` 등이 있을 수 있다. | ||
|
||
## 3) 관계(Relationship): | ||
![alt text](image-2.png) | ||
엔터티 간의 연관성이나 연결을 나타낸다. 관계에는 `일대일`, `일대다`, `다대다` 등의 다양한 형태가 있다. 예를 들어, `학생과` `강의` 간에는 `수강`이라는 관계가 있을 수 있다. | ||
|
||
다이아몬드 도형으로 관계 세트를 나타낸다. | ||
|
||
|
||
# ✅ 3. 연관관계 | ||
> 엔터티 간 연관관계를 나타내는 방법은 다양하다. | ||
> - 일대일: OneToOne | ||
> - 일대다: OneToMany | ||
> - 다대일: ManyToOne | ||
> - 다대다: ManyToMany | ||
## 1) 일대일 (OneToOne): | ||
- 일대일 관계는 한 객체가 다른 객체와 정확히 하나의 관계를 가지는 경우를 나타낸다. | ||
- 예를 들어, 한 명의 사람(Person)이 하나의 운전면허(License)를 가지는 경우가 일대일 관계이다. | ||
- 일대일 관계는 양쪽 방향으로 정의될 수 있으며, 각 객체는 상대 객체에 대한 참조를 가질 수 있다. | ||
|
||
## 2) 일대다 (OneToMany): | ||
- 일대다 관계는 한 객체가 다른 객체들과 여러 개의 관계를 가지는 경우를 나타낸다. | ||
- 예를 들어, 한 회사(Company)가 여러 명의 직원(Employee)을 가지는 경우가 일대다 관계이다. | ||
- 일대다 관계는 한 객체가 다수의 다른 객체들을 참조할 수 있지만, 참조되는 객체는 오직 한 객체만 참조된다. | ||
|
||
## 3) 다대일 (ManyToOne): | ||
- 다대일 관계는 다수의 객체들이 하나의 객체를 참조하는 경우를 나타낸다. | ||
- 예를 들어, 여러 명의 학생(Student)이 하나의 학교(School)에 속하는 경우가 다대일 관계이다. | ||
- 다대일 관계는 여러 객체가 하나의 객체를 참조할 수 있지만, 참조되는 객체는 오직 한 객체만 참조된다. | ||
|
||
## 4) 다대다 (ManyToMany): | ||
- 다대다 관계는 다수의 객체들이 서로 다수의 객체들과 관계를 맺는 경우를 나타낸다. | ||
- 예를 들어, 학생(Student)들이 다수의 강의(Class)를 수강하고, 각 강의에는 다수의 학생이 수강하는 경우가 다대다 관계이다. | ||
- 다대다 관계는 두 객체 간에 서로 많은 관계가 존재하는 경우를 나타내며, 중간 테이블이나 객체를 통해 이를 해결해야 한다. | ||
|
||
|
||
# ✅ 4. 정규화 | ||
> 정규화는 데이터베이스 설계에서 중복을 최소화하고 데이터의 일관성과 무결성을 유지하기 위해 사용된다. 주로 엔터티 간의 중복 데이터를 줄이고, 데이터 이상 현상을 방지하기 위해 적용된다. 관계형 데이터베이스 설계에서는 주로 제 1정규화, 제 2정규화, 제 3정규화, Boyce-Codd 정규화 등이 사용된다. | ||
## 1) 정규형 종류 | ||
![alt text](image-3.png) | ||
|
||
## 2) 정규형 | ||
- 정규화 과정에서 관계가 만족해야 하는 특정한 함수 종속성의 충족 조건 | ||
- 특정 정규형이 요구하는 충족 조건을 관계가 만족하면 해당 수준의 정규형을 충족함을 의미한다. | ||
- 제 3정규형 이상의 정규형을 충족하면 충분한 정규화가 이루어졌다고 본다. | ||
- 보통 제 3정규형 또는 보이스-코드 정규형까지만 정규화를 진행한다. | ||
|
||
## 3) 제 1정규형 (1NF) | ||
### 정의 | ||
관계 R에 속한 모든 속성의 도메인이 원자값을 갖는 경우에, 관계 R은 제 1정규형이라 한다. | ||
|
||
### 비정규 관계를 제 1정규형 관계로 정규화하는 방법 | ||
- n개의 다중값을 갖는 속성을 n개의 속성으로 분리한다. | ||
- 정규화 대상인 관계가 관계형 데이터 모델의 기본 원칙을 따르기만 한다면 제 1정규형에 속한다. | ||
|
||
![alt text](image-4.png) | ||
|
||
### 제 1정규형의 문제점 | ||
![alt text](image-7.png) | ||
|
||
1. 삽입 이상 | ||
- 과목 번호가 `c006`인 과목의 개설학과가 `통계학과`라는 사실만 따로 삽입할 수 없다. | ||
2. 수정 이상 | ||
- 컴퓨터학과의 학과장이 `박유찬`에서 `홍길동`으로 변경될 경우, 과목개설학과가 `컴퓨터`인 모든 튜플을 찾아 학과장 속성 값을 한꺼번에 `홍길동`으로 변경해야 함. | ||
3. 삭제 이상 | ||
- 만약, 학번 `s002` 학생이 과목번호 `c002` 과목 수강을 취소하여 이 튜플을 삭제하면 `c002` 과목의 개설학과가 `경영학과`이고 학과장이 `김철수`라는 정보까지 데이터베이스에서 함께 삭제됨. | ||
|
||
### 제 1정규형의 문제점을 해결하기 위해 정규화 | ||
![alt text](image-8.png) | ||
![alt text](image-9.png) | ||
이로써 부분 함수 종속성이 사라지게 된다. | ||
|
||
## 4) 제 2정규형 (2NF) | ||
### 정의 | ||
관계 R이 제 1정규형이고, 기본 키에 해당하지 않는 모든 속성이 기본키에 완전 종속인 형태일 때, 이 관계 R을 제 2정규형이라 한다. | ||
|
||
### 제 2정규형인지 점검하는 방법 | ||
- 제 2정규형은 제 1정규형을 충족하는 관계의 기본키가 복합 속성(속성이 2개 이상)일 때, 기본키의 일부 속성이 결정자인지(즉, 부분 함수 종속성이 있는지)를 검사한다. | ||
- 만약 기본키가 단일 속성이면, 모든 속성이 완전 함수 종속이므로 검사할 필요가 없이 제 2정규형에 속한다. | ||
|
||
![alt text](image-5.png) | ||
|
||
### 제 2정규형의 문제점 | ||
![alt text](image-10.png) | ||
|
||
1. 삽입 이상 | ||
- 과목 개설 학과인 `통계학과`의 학과장이 `홍장미`라는 사실만 따로 삽입할 수 없다. | ||
2. 수정 이상 | ||
- 컴퓨터학과의 학과장이 `박유찬`에서 `홍길동`으로 변경될 경우, 여전히 과목 개설 학과가 `컴퓨터`인 모든 튜플을 찾아 `학과장` 속성 값을 한꺼번에 `홍길동`으로 변경해야 한다. | ||
3. 삭제 이상 | ||
- 과목번호 `c002`의 등록을 취소하여 이 튜플을 삭제하면 `경영학과`의 학과장이 `김철수`라는 원하지 않은 정보까지 함께 삭제된다. | ||
|
||
### 제 2정규형을 충족하는 데도 위와 같은 이상이 발생하는 이유 | ||
> 아직도 둘 이상의 의미적 연관성을 하나의 관계로 함께 표현했기 때문이다. | ||
### 이행적 함수 종속성 | ||
- 기본키에 속하지 않은 일반 속성 값이 기본키에 속하지 않은 또 다른 일반 속성 값을 결정한다. | ||
- 해결방법: 이행적 종속 관계를 끊어 두 종속 관계를 각기 다른 관계에 표현한다. 즉, 2개의 관계로 분해한다. | ||
![alt text](image-11.png) | ||
![alt text](image-12.png) | ||
|
||
## 5) 제 3정규형 (3NF) | ||
### 정의 | ||
어떤 관계 R이 제 2정규형이고, 기본 키에 속하지 않는 모든 속성이 기본키에 대해 이행적 종속이 아니면, 관계 R은 제 3정규형이다. | ||
|
||
### 제 3정규형 점검 방법 | ||
- 제 3정규형은 제 2정규형을 충족하는 관계의 기본키가 아닌 일반 속성이 결정자인지를 검사한다. | ||
- 일반 속성이 기본키 속성이 아닌 일반 속성에 종속적일 때 제 3정규형에 위배된다. | ||
![alt text](image-6.png) | ||
|
||
### 제 3정규형의 문제점 | ||
![alt text](image-13.png) | ||
|
||
1. 삽입 이상 | ||
- 과목번호 `c004`의 강의담당교수가 `p005`라는 사실만 따로 삽입할 수 없다. | ||
2. 수정 이상 | ||
- 강의담당교수 `p001`의 담당 과목번호가 `c005`로 변경될 경우, `p001`과 관련된 모든 튜플을 찾아 `과목번호` 속성 값을 한꺼번에 `c005`로 변경해야 한다. | ||
3. 삭제 이상 | ||
- 학번 `s002`인 학생이 교과번호 `c002`의 수강을 취소하여 이 튜플을 삭제하면 `p002` 교수가 `c002` 과목을 강의한다는 정보까지 함께 삭제된다. | ||
|
||
이행 함수 종속성(Transitive Dependency)을 제거하여 모든 열이 기본 키에 이행적으로 종속되지 않아야 한다. | ||
|
||
### 제 3정규형을 충족하는 데도 위와 같은 이상이 발생하는 이유 | ||
- 원인: 기본키가 아닌 속성이 기본키 일부 속성의 결정자가 되기 때문이다. | ||
- 관계의 후보 키가 둘 이상이고 기본 키가 둘 이상의 조합일 때 발생한다. | ||
|
||
### 제 3정규형의 문제점 해결 | ||
이러한 문제를 해결하려면 기본키가 아닌 결정자를 분리하여 2개의 관계로 분해해야 한다. | ||
![alt text](image-14.png) | ||
|
||
## 6) 보이스코드 정규형 (BCNF) | ||
### 정의 | ||
- 복잡한 식별자 관계에 의한 문제를 해결하기 위해 제 3정규형을 보완한다. | ||
- "강한 제 3정규형"이라고도 한다. | ||
- 제 3정규형이더라도 기본키 속성이 기본키 속성이 아닌 일반 속성에 종속적일 때 보이스코드 정규형에 위배된다. | ||
|
||
### 보이스코드 정규형으로 변환 | ||
- 모든 결정자를 후보키로 만든다. 즉, 기본키가 아니면서 결정자 역할을 하는 속성과 그 결정자에 함수 종속이 되는 속성을 하나의 관계로 분리한다. | ||
- 이때, 결정자는 원 관계에도 남겨서 외래키 역할을 하도록 한다. | ||
|
||
![alt text](image-15.png) | ||
|
||
# ✅ 5. 반 정규화 | ||
> 반정규화는 성능 향상을 위해 데이터베이스의 정규화된 구조를 조정하여 중복을 증가시키는 과정이다. 주로 읽기 작업이 많고, 복잡한 조인 연산이 많은 경우에 사용된다. 반정규화를 통해 데이터의 읽기 속도를 높일 수 있지만, 쓰기 연산이 많은 환경에서는 주의해야 한다. | ||
- 테이블 병합(Table Consolidation): | ||
정규화된 테이블을 하나로 병합하여 조회 작업을 단순화하는 과정이다. | ||
- 중복 추가(Adding Redundancy): | ||
중복된 정보를 테이블에 추가하여 읽기 속도를 높이는 과정이다. | ||
- 부분 집합 추가(Adding Subset): | ||
여러 테이블에서 일부 열을 중복하여 추가하여 조회 작업을 간소화하는 과정이다. | ||
|
||
|
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
# 미션 | ||
|
||
|
||
![IA](for_UMC.png) | ||
|
||
1. 주어진 IA(기획 플로우)와 와이어 프레임(디자인 프로토타입)을 보고 직접 데이터베이스를 설계해오기, 위에서 언급한 경우를 다 적용해서 할 것 | ||
2. 이름 글자 수 등 세부적인 부분은 원하는 대로 해도 됨! | ||
3. 각 지역 별로 가게들이 있으며 가게를 방문하는 미션을 해결하며 포인트를 모으는 서비스 | ||
1. 모든 지역마다 10개의 미션 클리어시 1000 point 부여로 고정 | ||
|
||
|
||
# 미션 인증 | ||
|
||
1. Users | ||
![alt text](image-1.png) | ||
|
||
2. Missions | ||
![alt text](image-2.png) | ||
|
||
3. User_Missions | ||
![alt text](image-3.png) | ||
|
||
4. Regions | ||
![alt text](image-4.png) | ||
|
||
5. Mission_Regions | ||
![alt text](image-5.png) | ||
|
||
6. Stores | ||
![alt text](image-6.png) | ||
|
||
|
||
![alt text](image-7.png) | ||
![alt text](image.png) | ||
- Users-Missions(N:M) | ||
- 하나의 유저는 여러 미션을 수행할 수 있다. | ||
- 하나의 미션은 여러 유저가 수행할 수 있다. | ||
|
||
- Stores-Regions(N:1) | ||
- 하나의 지역에 여러 가게가 포함될 수 있다. | ||
|
||
- Regions-Missions(N:M) | ||
- 하나의 지역에 여러 미션이 포함될 수 있다. | ||
- 하나의 미션은 여러 지역에 포함될 수 있다. |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.