Open blcklamb opened 9 months ago
ERD(Entity Relationship Diagram)는 요구 분석 사항에서 얻은 엔티티와 속성들의 관계를 그림으로 나타낸 개체-관계 모델입니다. 엔티티는 정의 가능한 사물 또는 개념을 의미하고 이는 곧 데이터베이스의 테이블이 됩니다. 엔티티 속성은 개체가 가지고 있는 속성을 포함합니다. 이는 곧 테이블의 각 필드가 됩니다.
웹의 성장에 따라 멀티미디어 데이터와 같은 비정형 데이터가 빠른 속도로 대량 생산되고 있습니다. 이런 환경에서 RDB를 적용하면, 데이터의 스키마가 이미 정해져 있어 속성을 자주 추가하고 조정하기에 적합하지 않습니다. 또한 관계를 맺고 있기 때문에 JOIN이 많은 복잡한 쿼리가 만들어질 수 있습니다. 즉 대량의 비정형 데이터의 저장과 유연한 처리를 위해 새로운 대안으로 제시된 것이 NoSQL입니다.
NoSQL 종류에는 대표적으로 MongoDB, Redis 등이 있습니다. MongoDB는 JSON을 통해 데이터에 접근할 수 있고, Document 기반의 DB입니다. 스키마를 정해 놓지 않고 데이터를 삽입할 수 있기 때문에 확장성이 뛰어납니다. Document를 생성할 때마다 고유한 ObjectID가 생성됩니다. Redis는 인메모리 DB이자 key-value 데이터 모델 기반의 DB입니다. 문자열, set, sorted set, hash, list 데이터를 지원하고, 높은 성능을 제공하며 데이터의 영속성을 옵션으로 지원합니다.
일반적인 DB가 하드 디스크나 SSD에 저장하는 것과는 달리 Redis는 RAM에 데이터를 저장합니다. 이는 디스크 스캐닝이 필요없어 매우 빠르다는 장점을 가집니다. 데이터 구조가 간단하고 key-value 저장이 적합한 경우 Redis를 적용하기에 적합하다고 볼 수 있습니다. 복잡한 쿼리나 RDB의 JOIN이 필요 없는 간단한 구조에서 효과적으로 사용됩니다. 이전에 검색하거나 계산한 것을 재사용하는 캐싱에 적용하면 빠르게 액세스할 수 있습니다. 이를 통해 반복적인 요청에 대한 응답 시간을 크게 단축할 수 있습니다. 실시간 데이터 처리가 필요한 경우에도 적합합니다. 온라인 광고 노출, 게임 순위표와 같은 상황에서 Redis는 매우 빠른 응답 시간을 제공하여 실시간으로 데이터를 업데이트하고 조회하는 데에 적합합니다. 인 메모리 데이터베이스란 무엇인가요? - AWS
트랜잭션 연산에는 Commit과 Rollback이 있으며 두 연산에 의해 원자성을 보장받습니다. Commit은 하나의 트랜잭션이 성공적으로 끝나고, DB가 일관성 있는 상태에 있거나 하나의 트랜잭션이 끝났을 때 사용하는 연산입니다. Rollback은 하나의 트랜잭션이 비정상적으로 종료되어 트랜잭션 원자성이 깨질 경우 처음부터 다시 시작하거나 부분적으로 연산을 취소하는 연산입니다.
트랜잭션의 ACID 에 대해 설명해주세요
다음의 쿼리가 실행되는 순서에 대해 설명해주세요.
SELECT DISTINCT e.name FROM employees e JOIN departments d ON e.department_id = d.id WHERE d.name = 'Engineering' ORDER BY e.salary DESC LIMIT 10;
FROM 절로 테이블을 선택한다. → ON 조건 확인 → JOIN 실행하여 데이터가 집합으로 모아진다 → WHERE 절 실행하여 조건이 개별 행에 실행된다. → DISTINCT로 중복된 행을 결과에서 삭제한다. 주어진 데이터를 ORDER BY 로 내림차순으로 정렬한다. → LIMIT 에 벗어나는 행들은 제외되어 출력한다.
정규화 과정은 데이터베이스에서 데이터 중복을 최소화하고, 데이터 무결성을 유지하기 위해 수행됩니다. 그러나 정규화가 충분히 이루어지지 않았을 때, 데이터베이스는 여러 가지 '이상 현상(Anomalies)'을 경험할 수 있습니다. 이러한 이상 현상은 주로 데이터 중복으로 인해 발생하며, 데이터의 추가(Insertion), 삭제(Deletion), 갱신(Update) 과정에서 문제를 일으킬 수 있습니다. 주요 이상 현상에는 다음과 같은 것들이 있습니다:
정의: 원하지 않는 데이터를 삽입해야만 새로운 데이터를 추가할 수 있는 상황을 말합니다.
예시: 학생 정보를 저장하는 테이블에서, 학생이 등록한 과목 정보도 함께 저장해야 한다면, 과목을 등록하지 않은 새 학생의 정보를 추가하기 어려워질 수 있습니다.
정의: 한 데이터를 삭제할 때, 의도하지 않게 다른 중요한 정보까지 함께 삭제되는 상황입니다.
예시: 학생과 과목 정보를 함께 저장하는 테이블에서, 특정 과목에 등록된 마지막 학생 정보를 삭제하면, 그 과목에 대한 정보도 함께 사라지게 됩니다.
3. 갱신 이상 (Update Anomalies)
정의: 중복된 데이터 중 일부만 갱신되어 데이터 간의 불일치가 발생하는 상황입니다.
예시: 여러 행에 걸쳐 저장된 동일한 직원의 주소 정보를 갱신할 때, 일부 행만 갱신되어 직원의 주소 정보가 서로 다르게 되는 문제가 발생할 수 있습니다.
트랜잭션의 격리 수준(Isolation Level)은 다수의 트랜잭션이 동시에 데이터베이스에 접근할 때 발생할 수 있는 여러 문제(예: 더티 리드, 비반복 가능 읽기, 팬텀 리드)를 제어하는 데 사용됩니다. 격리 수준을 조정함으로써, 트랜잭션 간의 동시성과 데이터 일관성 사이의 균형을 맞출 수 있습니다. SQL 표준에서는 네 가지 격리 수준을 정의하고 있으며, 각각의 수준은 다른 수준의 동시성과 데이터 정확성을 제공합니다.
1. READ UNCOMMITTED (읽기 미확정)
2. READ COMMITTED (읽기 확정)
3. REPEATABLE READ (반복 가능 읽기)
4. SERIALIZABLE (직렬화 가능)
해결 방안
이러한 문제점들을 해결하기 위해 데이터베이스 시스템들은 다양한 동시성 제어 기술을 사용합니다. 예를 들어,