Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Janghojin #15

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
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
171 changes: 171 additions & 0 deletions 장호진/Week4-DataBase.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
## 데이터베이스 설계 및 선택
데이터베이스 설계는 애플리케이션의 성능과 유지 관리에 중요한 영향을 미치는 요소입니다. 데이터베이스 선택은 정규화와 비정규화뿐만 아니라, 관계형 데이터베이스(RDBMS)와 비관계형 데이터베이스(NoSQL)의 선택을 포함하여 여러 측면에서 신중한 고려가 필요합니다.
### 데이터베이스 정규화와 비정규화
#### 정규화
정규화는 데이터 중복을 줄이고 무결성을 향상시키기 위해 데이터를 구조화하는 방법입니다. 이 과정에서 데이터는 더 작은 관련 테이블로 분할되고, 이를 통해 데이터베이스는 효율적이고 유지보수가 용이한 구조를 갖게 됩니다.
**장점**
- 데이터 중복 감소
- 데이터 무결성 유지
- 유지 관리 용이
**단점**
- 성능 저하 가능성
- 설계 복잡성 증가
#### 비정규화
비정규화는 데이터 검색 속도를 높이기 위해 의도적으로 중복을 허용하는 설계 방식입니다. 주로 데이터 읽기가 빈번한 상황에서 사용됩니다.
**장점**
- 쿼리 성능 향상
- 분석 및 리포팅 최적화
**단점**
- 데이터 무결성 감소 가능성
- 업데이트 복잡성 증가
### RDBMS와 NoSQL의 비교
#### RDBMS (관계형 데이터베이스 관리 시스템)
**구조와 스키마**
- 구조화된 데이터 모델과 미리 정의된 스키마 사용
- 복잡한 트랜잭션과 데이터 무결성이 필요한 애플리케이션에 적합
**확장성**
- 주로 수직 확장 (단일 서버의 용량 증가)
**일관성 및 트랜잭션**
- ACID 트랜잭션 지원
**쿼리 언어**
- SQL(구조화된 쿼리 언어)을 사용
**사용 사례**
- ERP 시스템, CRM 애플리케이션, 금융 거래 시스템
#### NoSQL (비관계형 데이터베이스)
**구조와 스키마**
- 유연한 스키마 모델과 다양한 데이터 유형 지원
- 비정형 또는 반정형 데이터를 처리하는 데 적합
**확장성**
- 수평 확장 가능 (여러 서버에 데이터 분산)
**일관성 및 트랜잭션**
- BASE 모델 준수
**쿼리 언어**
- 표준 쿼리 언어 없음
**종류와 예**
- **Document Store:** MongoDB, CouchDB
- **Key-Value Store:** Redis, Amazon DynamoDB
- **Graph Database:** Neo4j, Amazon Neptune
- **Column-Family Store:** Apache Cassandra, HBase
**사용 사례**
- 대량의 비정형 데이터를 처리해야 하는 상황
- 고가용성과 빠른 데이터 검색이 중요한 환경
## 동시성 제어 및 격리 수준
동시성 제어는 여러 트랜잭션이 동시에 실행될 때 데이터베이스의 무결성과 일관성을 유지하기 위한 중요한 메커니즘입니다. 격리 수준은 이러한 트랜잭션이 서로 간섭하지 않도록 보장하는 방법을 정의합니다.
### 동시성 제어
동시성 제어는 트랜잭션 간의 상호 작용을 관리하여 데이터 무결성을 유지하는 데 도움을 줍니다. 주요 동시성 제어 기법은 다음과 같습니다:
**1\. 비관적 동시성 제어 (Pessimistic Concurrency Control)**
- **잠금 사용:** 데이터를 읽거나 수정하기 전에 잠금을 사용하여 다른 트랜잭션이 데이터에 접근하지 못하게 합니다. 이 방식은 충돌을 사전에 방지하지만 리소스가 비효율적으로 사용될 수 있습니다.
- **장점:** 데이터 충돌을 사전에 방지하여 안정적인 데이터 무결성을 유지합니다.
- **단점:** 리소스가 비효율적으로 사용될 수 있으며, 다른 트랜잭션이 대기해야 할 수 있습니다.
**2\. 낙관적 동시성 제어 (Optimistic Concurrency Control)**
- **잠금 없음:** 트랜잭션이 종료될 때까지 잠금을 사용하지 않습니다. 트랜잭션 종료 시 충돌을 검사하고, 충돌이 발견되면 트랜잭션을 재시도하거나 취소합니다
- **장점:** 잠금을 사용하지 않아 더 많은 트랜잭션이 동시에 실행될 수 있습니다.
- **단점:** 충돌이 발생하면 트랜잭션을 재시도해야 하므로 성능이 저하될 수 있습니다.
### 격리 수준
격리 수준은 트랜잭션이 다른 트랜잭션에 영향을 주지 않도록 하는 정도를 정의합니다. 일반적인 격리 수준은 다음과 같습니다:
**1\. Read Uncommitted**
- 트랜잭션은 커밋되지 않은 다른 트랜잭션의 변경 사항을 읽을 수 있습니다. 가장 낮은 수준의 격리이며, 데이터 무결성이 보장되지 않습니다.
**2\. Read Committed**
- 트랜잭션은 커밋된 데이터만 읽을 수 있습니다. 이는 더 높은 데이터 일관성을 제공하지만, 비반복 읽기 문제가 발생할 수 있습니다.
**3\. Repeatable Read**
- 트랜잭션이 시작된 후 데이터는 다른 트랜잭션에 의해 수정되지 않습니다. 비반복 읽기 문제는 해결되지만, 팬텀 읽기 문제가 발생할 수 있습니다.
**4\. Serializable**
- 가장 높은 수준의 격리로, 모든 트랜잭션이 순차적으로 실행되는 것처럼 보입니다. 데이터 일관성이 보장되지만, 동시성은 크게 제한됩니다.
### 사용 사례
- **비관적 동시성 제어**는 금융 거래와 같이 데이터 무결성이 매우 중요한 시스템에 적합합니다.
- **낙관적 동시성 제어**는 충돌 가능성이 낮은 시스템이나 트랜잭션 충돌 시 재시도가 용이한 시스템에 적합합니다.
- **Read Committed**와 **Repeatable Read**는 대부분의 비즈니스 애플리케이션에서 일반적으로 사용되는 수준이며, 성능과 데이터 무결성 간의 균형을 제공합니다.
- **Serializable**은 데이터 일관성이 절대적으로 중요한 경우에 사용됩니다
## 분산 데이터베이스란?
분산 데이터베이스는 데이터가 여러 위치에 물리적으로 분산되어 저장되는 시스템입니다. 이러한 시스템은 여러 데이터베이스 인스턴스 간에 데이터가 복제되거나 분할되어, 사용자에게는 하나의 통합된 데이터베이스로 나타납니다. 분산 데이터베이스는 데이터의 가용성을 높이고 시스템의 확장성을 개선하는 데 중점을 둡니다.
### 분산 데이터베이스의 특징
1. **위치 독립성**: 데이터는 여러 사이트에 걸쳐 물리적으로 저장되며 독립적인 분산 데이터베이스 관리 시스템(DDBMS)에 의해 관리됩니다.
2. **분산 쿼리 처리**: 데이터가 여러 위치에 분산되어 있는 환경에서 고급 쿼리를 처리할 수 있으며, 이는 데이터 관리와 쿼리 실행 계획으로 변환됩니다.
3. **분산 트랜잭션 관리**: 커밋 프로토콜, 분산 동시성 제어 기법, 그리고 오류 발생 시 분산 복구 방법을 통해 일관된 데이터베이스 상태를 유지합니다.
4. **네트워크 연결**: 데이터베이스는 네트워크를 통해 연결되어 서로 통신합니다.
### 분산 데이터베이스의 유형
1. **동질 분산 데이터베이스**: 동일한 운영 체제와 DDBMS를 사용하는 여러 사이트에 동일한 데이터베이스가 저장됩니다. 이는 관리가 용이하며 데이터 액세스가 원활합니다.
2. **이질 분산 데이터베이스**: 서로 다른 스키마, 운영 체제, DDBMS 및 데이터 모델을 사용합니다. 사이트 간 협력이 제한적이며, 번역이 필요할 수 있습니다.
### 데이터 저장 방식
1. **복제(Replication)**: 데이터의 복사본을 여러 사이트에 저장하여 데이터의 가용성을 높이고, 병렬 쿼리 요청을 처리할 수 있게 합니다. 그러나 데이터 동기화가 필요하여 서버 오버헤드가 증가할 수 있습니다.
2. **분할(Fragmentation)**: 데이터를 수평 또는 수직으로 분할하여 각 분할을 필요한 사이트에 저장합니다. 이는 데이터 복사를 방지하고 데이터 불일치 문제를 최소화합니다.
### 장점
- **고가용성**: 데이터가 여러 노드에 복제되어 있어 일부 노드에 장애가 발생해도 시스템이 계속 작동할 수 있습니다.
- **확장성**: 인스턴스를 추가하여 수평 확장이 용이합니다.
- **성능 향상**: 효율적인 데이터 분배로 사용자 요청에 대한 응답 시간이 단축됩니다.
### 단점
- **비용**: 여러 사이트 간의 데이터 일관성을 유지하기 위한 소프트웨어 비용이 높을 수 있습니다.
- **오버헤드**: 복제된 데이터베이스의 경우, 여러 사이트에서 발생하는 동기화와 계산으로 인해 처리 오버헤드가 증가합니다.
- **데이터 무결성**: 여러 사이트에서 데이터를 업데이트할 때 데이터 무결성이 손상될 수 있습니다.