---
title: "Database TIL 02"
date: 2020-12-22
updated: 2020-12-22
category: database
canonical: https://intzzzero.dev/database-til-02/
source: "Between Negative and Positive"
language: ko
---
## 데이터 모델링

서비스 전체 개발 과정에서 데이터베이스 관련 부분만 단계별로 나눈다면 다음과 같다.

- 개념 설계
- 논리 설계
- 물리 설계
- DBMS 구축

## 논리 모델링과 물리 모델링

### 논리 모델링

데이터베이스 종류와 무관하게 업무를 분석하고 그에 대한 데이터 집합과 그 집합 간의 관계를 중점적으로 표현하는 것이 논리 모델링

### 물리 모델링

논리 모델링의 산출물을 시스템으로 어떻게 표현할지를 고려하는 것이 물리 모델링

하지만, 대부분의 데이터 모델링 도구는 논리 모델과 물리 모델을 별개로 관리하지 않는다.

## 트랜잭션(Transaction)

데이터베이스 관리 시스템 또는 유사한 시스템에서 상호작용의 단위이다. 여기서 유사한 시스템이란 트랜잭션이 성공과 실패가 분명하고 상호 독립적이며, 일관되고 믿을 수 있는 시스템을 의미한다.
이론적으로 데이터베이스 시스템은 각각의 트랜잭션에 대해 원자성(Atomicity), 일관성(Consistency), 독립성(Isolation), 영구성(Durability)을 보장한다. 이 성질을 첫글자를 따 [ACID](https://ko.wikipedia.org/wiki/ACID) 라 부른다. 그러나, 실제로는 성능향상을 위해 이런 특성들이 종종 완화되곤 한다.
어떤 시스템에서는 트랜잭션은 논리적 작업 단위(LUW, Logical Units of Work)로 불리기도 한다. - 참고: [데이터베이스 트랜잭션 - 위키백과, 우리 모두의 백과사전](https://ko.wikipedia.org/wiki/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4_%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98)

예를 들어, A의 계좌에서 B의 계좌로 100원을 송금하는 기능을 만든다면,

1. 업데이트: A계좌에서 -100원
2. 업데이트: B계좌에서 +100원
3. A계좌와 B계좌의 거래기록을 별도 테이블에 저장

위와 같은 절차가 필요하며, 이 모든 과정을 통틀어 하나의 트랜잭션으로 본다. 또한, 이 과정에서 만약 A계좌에서 -100원이 된 상태에서 서버가 다운될 경우 DB에는 -100원은 발생했지만 +100원은 어디에도 없는 상황이 된다. 이러한 사태를 방지하기 위해 트랜잭션에는 도중에 중단될 경우 모든 과정을 무효로 처리하는 기능이 필수적이다.
이와 유사한 사례로 하나의 테이블에 대해 두 명의 사용자가 동시에 업데이트를 진행할 경우에도 문제가 생길 수 있기 때문에 **트랜잭션 락\(Transaction Lock\)** 이라는 기능이 사용된다. - 참고: [동시성 제어 기법 — 잠금(Locking) 기법. 동시성 제어 기법으로는 대표적으로 잠금(Locking) 기법이 있다… | by 이예원 | POCS | Medium](https://medium.com/pocs/%EB%8F%99%EC%8B%9C%EC%84%B1-%EC%A0%9C%EC%96%B4-%EA%B8%B0%EB%B2%95-%EC%9E%A0%EA%B8%88-locking-%EA%B8%B0%EB%B2%95-319bd0e6a68a)

## 엔터티(Entity)

물리모델에서는 테이블(Table)이라고 한다. 객체지향언어에서의 Class와 동급의 의미로 받아들여도 좋은데, 이로 말미암아 알 수 있는 것은 여러 구체적인 개념을 담을 수 있는 상위의 추상화 된 개념이 엔터티라는 것이다.
엔터티를 도출할 때 가장 중요한 것은 용어의 정의다. 변수명, 클래스명을 정할 때 보다 시멘틱하게 짓기 위해 고심해야 하는 것과 동일한 맥락이다. 해당 테이블에 포함될 데이터들을 충분히 설명할 수 있도록 포괄적이며 의미 전달이 가능한 이름이어야 한다. - 참고: [꿈꾸는 개발자, DBA 커뮤니티 구루비](http://www.gurubee.net/lecture/4180)

그리고, 엔터티의 성격에 따라 세 종류로 구분된다.

- **키 엔터티:** 관리 대상 데이터 중 가장 최상위에 존재하는 엔터티로써 보통 메인 엔터티와 액션 엔터티를 만들어내는 부모 역할. 상품, 사원, 고객 등 현실에 존재하는 객체를 키 엔터티로 정의하는 경우가 많다.
- **액션 엔터티:** 키 엔터티에서 비롯된 엔터티로써 예를 들어 ‘회원’ 이라는 키 엔터티가 존재하고, 회원의 초대코드를 통해 가입한 ‘친구’ 라는 엔터티가 생겼을 때, ‘친구’는 ‘회원’의 액션을 통해 만들어진 엔터티이므로 액션 엔터티가 된다.
- **메인 엔터티:** 키 엔터티를 통해 발생한 액션 엔터티 중에서 유독 중요한 역할을 하는 액션 엔터티는 메인 엔터티로써 따로 분류하기도 한다.

## 속성(Attribute)

물리모델에서는 칼럼(Column)이라고 한다. **더는 분리될 수 없는 최소의 데이터 보관 단위** 로써 하나의 엔터티는 여러 속성을 지니며, 각 속성은 다른 속성과 확연히 구분되는 독자적인 성질을 지녀야만 한다.
다시 한 번 속성이 지녀야 하는 필수적인 성질에 대해 정리하자면 다음과 같다.

- 하나의 속성은 해당 업무 요건에 맞는 최소 단위의 값 하나만 갖는다.
- 하나의 속성에 복수형으로 값을 저장해서는 안 된다.

## 정규화와 반정규화

중복된 데이터를 최소화하고 일반적으로 납득될 수 있는 모델로 만드는 과정을 **정규화** 라고 한다. 정규화를 하는 목적은 하나의 엔터티에 충분히 관련이 있는 속성들만 담고 이를 통해 데이터 저장 리소스를 최소화 하는 것이다.
반면에 **반정규화** 는 특정 엔터티와 연관성은 다소 떨어질지라도 별도의 엔터티로 두어 JOIN을 하는 것보다 하나의 엔터티의 속성으로 관리하는 편이 데이터를 불러오는 리소스가 적게 들어갈 때 주로 사용한다.
