diff --git "a/\354\236\245\355\230\270\354\247\204/Week4-DataBase.md" "b/\354\236\245\355\230\270\354\247\204/Week4-DataBase.md" new file mode 100644 index 0000000..bd84af9 --- /dev/null +++ "b/\354\236\245\355\230\270\354\247\204/Week4-DataBase.md" @@ -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)**: 데이터를 수평 또는 수직으로 분할하여 각 분할을 필요한 사이트에 저장합니다. 이는 데이터 복사를 방지하고 데이터 불일치 문제를 최소화합니다. +​ +### 장점 +​ +- **고가용성**: 데이터가 여러 노드에 복제되어 있어 일부 노드에 장애가 발생해도 시스템이 계속 작동할 수 있습니다. +- **확장성**: 인스턴스를 추가하여 수평 확장이 용이합니다. +- **성능 향상**: 효율적인 데이터 분배로 사용자 요청에 대한 응답 시간이 단축됩니다. +​ +### 단점 +​ +- **비용**: 여러 사이트 간의 데이터 일관성을 유지하기 위한 소프트웨어 비용이 높을 수 있습니다. +- **오버헤드**: 복제된 데이터베이스의 경우, 여러 사이트에서 발생하는 동기화와 계산으로 인해 처리 오버헤드가 증가합니다. +- **데이터 무결성**: 여러 사이트에서 데이터를 업데이트할 때 데이터 무결성이 손상될 수 있습니다. +