Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
275 changes: 275 additions & 0 deletions keyword/chapter00/keyword.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,275 @@
# 1. PK,FK란?

## PK: Primary Key

기본키는 후보키 중에서 릴레이션의 각 튜플을 대표적으로 식별하기 위해 선택한 키이다.

후보키가 여러 개 존재할 경우, 데이터베이스 설계자는 사용 환경을 고려하여 가장 적절한 후보키를 기본키로 선택한다.

### 기본키 선택 기준

1. NULL 값을 가질 수 있는 속성은 기본키로 부적합하다.

기본키는 각 튜플을 명확하게 식별해야 하므로 NULL 값을 허용할 수 없다.

2. 값이 자주 변경되는 속성은 기본키로 부적합하다.

기본키 값이 자주 바뀌면 참조 관계 유지와 데이터 관리가 복잡해진다.

3. 가능한 한 단순한 후보키를 선택한다.

속성의 개수가 적고, 길이가 짧고, 다루기 쉬운 키가 선호된다.

4. 하나의 릴레이션에는 기본키가 하나만 존재한다.

### 기본키의 특징

- 중복된 값을 가질 수 없다.
- NULL 값을 가질 수 없다.

## FK: Foreign Key

외래키는 한 릴레이션의 속성(또는 속성 집합) 중에서 다른 릴레이션의 기본키를 참조하는 키이다. 이때 외래키가 다른 릴레이션의 대체키를 참조하는 것도 가능하다. 기본키로 선택받지는 못했지만 유일성과 최소성을 만족하는 대체키를 참조하더라도 관련있는 튜플을 구분가능하기 때문이다.!

외래키는 릴레이션 간의 관계를 표현하며, 참조 무결성을 유지하는 데 사용된다. 참조 무결성이란 외래키가 참조하는 값이 반드시 참조 대상 테이블에 존재하도록 보장하는 제약이다.

### 외래키의 특징

- 다른 릴레이션의 기본키를 참조한다.
- 동일한 값이 여러 번 나타날 수 있다.
- 경우에 따라 NULL 값을 가질 수 있다.
- 릴레이션 간 연결 역할을 한다.

기본키는 한 릴레이션 내부에서 튜플을 식별하고, 외래키는 릴레이션과 릴레이션을 연결한다.

# 2. ERD란?

ERD(Entity Relationship Diagram)는 개체와 개체 간의 관계를 그림으로 표현한 다이어그램이다.
데이터베이스를 설계할 때 어떤 개체가 존재하는지, 각 개체가 어떤 속성을 가지는지, 그리고 개체들 사이에 어떤 관계가 있는지를 시각적으로 나타내기 위해 사용한다.

예를 들어 쇼핑몰 데이터베이스를 설계할 때 회원, 상품, 주문과 같은 개체를 정의하고,
회원이 주문을 한다, 주문은 상품을 포함한다와 같은 관계를 ERD로 표현할 수 있다.

## ERD의 구성 요소

1. 개체(Entity): 데이터로 관리할 대상. 예) 회원, 상품, 주문

2. 속성(Attribute): 개체가 가지는 정보. 예) 회원ID, 이름, 가격

3. 관계(Relationship): 개체와 개체 사이의 연관성. 예) 회원은 주문을 한다

## ERD의 역할

데이터베이스 구조를 설계할 때 전체 구조를 한눈에 파악할 수 있다.

테이블 생성 전에 개체와 관계를 미리 정리할 수 있다.

개발자, 기획자, 설계자 사이의 의사소통 도구로 활용된다.

정리하면 ERD는 데이터베이스 설계도라고 볼 수 있다.

# 3. 연관관계란? 그리고 연관관계를 설정하는 방법은?

연관관계는 하나의 개체 또는 릴레이션이 다른 개체 또는 릴레이션과 서로 관련을 맺고 있는 상태를 의미한다.
개체 간의 연결 구조를 파악하고 표현하는 것이 연관관계이다.

## 1. 1:1 관계

하나의 개체가 다른 하나의 개체와만 연결되는 관계이다.

예)

- 한 사람은 하나의 주민등록증을 가진다.
- 하나의 주민등록증은 한 사람에게만 속한다.

## 2. 1:N 관계

하나의 개체가 여러 개의 다른 개체와 연결될 수 있는 관계이다.

예)

- 한 고객은 여러 주문을 할 수 있다.
- 한 학과에는 여러 학생이 속할 수 있다.

## 3. N:M 관계

여러 개체가 서로 여러 개체와 연결될 수 있는 관계이다.

예)

- 한 학생은 여러 과목을 수강할 수 있다.
- 하나의 과목은 여러 학생에게 수강될 수 있다.

---

관계형 데이터베이스에서는 이러한 연관관계를 주로 기본키와 외래키를 이용해 설정한다.

## 1. 1:N 관계 설정

1:N 관계에서는 일반적으로 다수 쪽 릴레이션에 외래키를 둔다.

예를 들어 고객과 주문의 관계에서, 한 고객은 여러 주문을 할 수 있으므로 주문 릴레이션에 고객의 기본키를 외래키로 둔다.

예)

- Customer(id, name)
- Order(id, customer_id, order_date)

여기서 customer_id는 Customer의 기본키를 참조하는 외래키이다.

## 2. 1:1 관계 설정

1:1 관계에서는 한쪽 릴레이션에 외래키를 두고, 그 외래키가 중복되지 않도록 설정하여 관계를 표현할 수 있다.

예)

- Person(id, name)
- Passport(id, person_id)

이 경우 person_id에 UNIQUE 제약을 주면 1:1 관계를 표현할 수 있다.

## 3. N:M 관계 설정

N:M 관계는 관계형 데이터베이스에서 직접 표현하지 않고, 별도의 연결 릴레이션을 만들어 두 개의 1:N 관계로 나누어 표현한다.

예)

- Student(id, name)
- Course(id, title)
- Enrollment(student_id, course_id)

여기서 Enrollment는 학생과 과목을 연결하는 릴레이션이다.

정리하면 연관관계는 개체와 개체 사이의 관련성을 의미하며, 관계형 데이터베이스에서는 주로 기본키와 외래키를 사용하여 이를 표현한다.

특히 N:M 관계는 별도의 연결 릴레이션을 통해 구현도니다.

# 3. 정규화란?

정규화는 데이터의 중복을 줄이고, 이상 현상을 방지하기 위해 데이터를 구조적으로 분해하는 과정이다.

정규화를 하는 이유는 하나의 테이블에 너무 많은 정보를 넣으면 데이터 중복이 발생하고, 삽입, 수정, 삭제 과정에서 여러 문제가 생길 수 있기 때문이다.

## 정규화의 목적

- 데이터 중복 최소화
- 데이터 일관성 유지
- 이상 현상 방지
- 데이터 구조의 안정성 향상

## 이상 현상의 종류

- 삽입 이상: 불필요한 데이터가 없으면 새로운 데이터 삽입이 어려운 현상
- 수정 이상: 중복된 데이터 중 일부만 수정되어 불일치가 발생하는 현상
- 삭제 이상: 하나의 정보를 삭제할 때 원하지 않는 다른 정보까지 함께 삭제되는 현상

정리해보면 정규화는 데이터를 올바르게 나누어 중복과 이상 현상을 줄이는 과정이다.

# 4. 반 정규화란?

반정규화는 정규화된 데이터베이스에서 성능 향상을 위해 일부 중복을 허용하거나 테이블을 다시 합치는 과정이다.

정규화는 데이터 중복을 줄이고 구조를 안정적으로 만들지만, 테이블이 많이 나뉘면 조회 시 JOIN이 많아져 성능이 떨어질 수 있다.

이때 조회 성능을 높이기 위해 의도적으로 중복을 허용하거나 구조를 단순화하는 것이 반정규화이다.

## 반정규화의 목적

- 조회 성능 향상
- JOIN 감소
- 시스템 응답 속도 개선

## 반정규화의 특징

- 데이터 중복이 발생할 수 있다.
- 수정 시 일관성 관리가 더 어려워질 수 있다.
- 읽기 성능은 좋아질 수 있지만 쓰기 작업은 불리할 수 있다.

정리해보면 반정규화는 성능 향상을 위해 정규화된 구조를 일부 완화하는 과정이다.

# 5. DB에서의 상속 관계 표현은 어떻게 하는가?

관계형 데이터베이스에는 객체지향 언어처럼 상속 개념이 직접 존재하지 않기 때문에, 테이블 설계를 통해 상속 관계를 간접적으로 표현한다.

대표적으로는 3가지 방법이 있다.

## 1. 하나의 테이블로 통합하는 방식

부모와 자식의 모든 속성을 하나의 테이블에 저장하는 방식이다.

예를 들어 사람, 학생, 교수가 있을 때 모든 정보를 하나의 Person 테이블에 넣는 방식이다.

장점

- 테이블 수가 적다
- 조회가 단순하다

단점

- 사용하지 않는 컬럼이 많아질 수 있다
- NULL 값이 많이 생길 수 있다

## 2. 부모 테이블과 자식 테이블로 분리하는 방식

공통 속성은 부모 테이블에 저장하고, 자식만의 속성은 별도의 자식 테이블에 저장하는 방식이다.

예)

- Person(id, name)
- Student(id, grade)
- Professor(id, major)

장점

- 정규화된 구조를 유지할 수 있다
- 공통 속성과 개별 속성을 명확히 분리할 수 있다

단점

- 조회할 때 JOIN이 필요하다

## 3. 자식마다 독립 테이블을 만드는 방식

부모의 공통 속성까지 각 자식 테이블에 모두 포함시키는 방식이다.

예)

- Student(id, name, grade)
- Professor(id, name, major)

장점

- 조회가 단순하다
- 테이블별 독립성이 높다

단점

- 공통 속성이 중복된다
- 구조 변경 시 여러 테이블을 함께 수정해야 할 수 있다

DB의 상속 관계는 테이블 설계 방식으로 표현하며, 상황에 따라 통합 / 분리 / 중복 방식 중 하나를 선택한다.

# 6. 인덱스란?

인덱스는 데이터 검색 속도를 높이기 위해 사용하는 데이터 구조이다. 책의 맨 뒤에 있는 색인처럼, 원하는 데이터를 더 빠르게 찾을 수 있도록 도와준다.

예를 들어 테이블에 데이터가 매우 많을 때, 인덱스가 없으면 DBMS는 처음부터 끝까지 데이터를 검사해야 할 수 있다. 하지만 인덱스가 있으면 특정 값을 빠르게 찾을 수 있다.

## 인덱스의 장점

- 검색 속도 향상
- 정렬 및 조건 검색 성능 향상
- JOIN 성능 향상 가능

## 인덱스의 단점

- 인덱스를 저장하기 위한 추가 공간이 필요하다
- INSERT, UPDATE, DELETE 시 인덱스도 함께 관리해야 하므로 성능 저하가 발생할 수 있다

## 인덱스를 사용하는 대표적인 경우

- WHERE 조건에 자주 사용되는 속성
- JOIN에 자주 사용되는 속성
- 정렬(ORDER BY)에 자주 사용되는 속성

정리하면 인덱스는 조회 성능을 높이기 위한 구조이지만, 저장 공간과 갱신 비용이 추가로 든다.
Loading