본문 바로가기
개발 공부 일지/CS

[4.2] ERD와 정규화 과정 - [4.3] 트랜잭션과 무결성

by yelimu 2024. 8. 11.

[4.2 ERD와 정규화 과정]

 

데이터 모델링: 정보시스템 구축의 대상이 되는 업무 내용을 분석하여 이해하고 약속된 표기법에 의해 표현하는것

업무파악 → 개념적 데이터 모델링 → 논리적 데이터 모델링 → 물리적 데이터 모델링 → DB 구현

ERD: Entity Relationship Diagram (개체 관계 다이어그램) 

데이터베이스 설계 과정에서 사용되는 모델링 기법 중 하나로,

데이터베이스에 저장될 데이터 엔티티(entity)들과 엔티티 간의 관계(relationship)를 시각적으로 표현합니다.

 

ERD는 데이터베이스 설계의 초기 단계에서 개념적 모델을 만드는 데 사용

→ 데이터를 구축할때 가장 기초적인 뼈대 역할을 하며, 릴레이션 간의 관계를 정의한다.

서비스 구축 시 가장 먼저 고려해야할 부분 

 

ERD 의 기본 요소 : 엔터티, 관계, 속성

 

릴레이션

데이터베이스에서 정보를 구분하여 저장하는 기본 단위를 말한다.

우리가 쉽게 아는 용어로는 테이블이라고도 불리며, 컬렉션이라고도 불린다.

 

ERD는 시스템의 요구사항을 기반으로 작성, 이를 기반으로 데이터베이스를 구축한다.

이후 디버깅 또는 비즈니스 프로세스 재설계가 필요할때 설계도 역할을 한다. 

관계형 구조로 표현될 수 있는 데이터를 구성하는데는 유용하지만 

비정형 데이터를 충분히 표현할 수 없다. 

 

예제. 영업부서의 ERD

요구사항 :

1) 영업사원은 0 ~ n명의 고객을 관리한다. 

2) 고객은 0 ~ n개의 주문을 넣을 수 있다. 

3) 주문에는 1 ~ n개의 상품이 들어간다.

 

정답 : (테이블필드, 타입은 생략)

사원: 고객 = 1: N  (고객 : 사원 = N : 1) 

고객 : 주문 = 1: N (주문 : 고객 = N : 1)

주문 : 상품 = M : N (상품 : 주문 = N : M) → 주문 - 상품 테이블 (조인테이블) 

 

ERD를 작성한 후, 데이터베이스의 구조를 정규화하여 데이터 중복을 줄이고 무결성을 유지

정규화는 ERD에서 정의된 엔터티와 관계를 더 세부적으로 분석하여 각 테이블의 구조를 개선하는 과정

 


정규화 과정

릴레이션 간의 잘못된 종속 관계로 인해 데이터베이스 이상 현상이 일어나서 이를 해결하거나,

저장공간을 효율적으로 사용하기 위해 릴레이션을 여러개로 분리하는 과정 

 

데이터베이스 이상현상

하나의 속성만 가져야하는 엔티티가 여러개의 속성을 갖는다거나

데이터를 삭제할때 필요한 데이터도 같이 삭제되거나

데이터를 삽입해야하는데 하나의 필드값이 null이 되면 안되서 삽입하기 어려운 현상 등

 

정규화 과정은 정규형 원칙을 기반으로 정규형을 만들어가는 과정이며, 정규화된 정도는 정규형 (NF, Normal Form)으로 표현한다. 

- 기본 정규형 : 제1정규형, 제2정규형, 제3정규형, 보이스/코드 정규형

- 고급 정규형 : 제4정규형, 제5정규형

 

정규형 원칙

같은 의미를 표현하는 릴레이션이지만 더 구조적이며, 중복성 감소, 독립 관계는 별개 릴레이션으로 표현해야 한다.

즉, 각 릴레이션은 독립적인 표현이 가능해야 한다.

더보기

 

속성 (Attribute)

  • 속성테이블의 각 열(column)을 의미합니다. 속성은 데이터베이스 테이블의 기본 단위로, 특정 데이터 값을 저장하는 필드를 정의합니다.

후보키 (Candidate Key)

  • 후보키는 테이블에서 각 행을 유일하게 식별할 수 있는 속성 집합입니다. 즉, 후보키의 값을 알면 해당 행을 고유하게 식별할 수 있습니다.
  • 테이블에는 여러 후보키가 있을 수 있으며, 각 후보키는 모든 속성의 값을 유일하게 결정할 수 있어야 합니다.

예를 들어, 유저 번호로 각 유저를 유일하게 식별할수 있다면 유저번호는 후보키가 됩니다.

만약 유저번호와 유저아이디의 조합이 각 학생을 유일하게 식별할 수 있다면, 이 조합도 후보키가 됩니다.

 

기본키 (Primary Key)

  • 기본키는 테이블에서 각 행을 유일하게 식별하기 위해 선택된 하나의 후보키입니다. 기본키는 중복된 값이 없어야 하며 NULL 값도 허용되지 않습니다.

결정자 (Determinant)

  • 결정자다른 속성의 값을 결정하는 속성 또는 속성 집합을 의미합니다. 즉, 결정자가 주어지면 다른 속성 (종속자) 의 값이 고유하게 결정됩니다.
  • 유저 번호(는 유저 아이디를 결정한다. (반대도 마찬가지)
  • 유저번호와, 수강명은 성취도를 결정한다 . 등등  

 


- 제1정규형

릴레이션의 모든 도메인은 더 이상 분해 불가능한 원자값(atomic value)로만 구성되어야 한다.

릴레이션의 속성 값은 한 개의 기본키에 대해 두 개 이상의 값을 가지는 반복 집합이 있으면 안된다.

 

반복 집합이란 하나의 컬럼(열)에 여러 개의 값이 들어가 있는 것을 의미

예시. 유저ID : 홍철 -> 수강명 {c++ 코딩테스트, 프런트 특강} = 반복집합

→ 테이블 분리 

각 칼럼은 원자값으로만 구성

 


-제2정규형

릴레이션이 제1정규형이고 & 부분 함수의 종속성을 제거한 것이다.

 

부분 함수 종속성 제거→ 테이블에서 기본키의 일부만으로 특정 속성(컬럼)의 값을 결정할 수 있을 때 발생하는 종속성

유저번호가 주어지면 유저 ID를 유일하게 결정할 수 있다.  = 부분함수 종속성이 존재한다. 

유저아이디+ 수강명 를 알면 성취도가 결정된다 = 부분함수 종속성이 존재하지 않는다. 

= 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속적인 것

 

완전 함수적 종속: 종속자가 기본키에만 종속되며,

기본키가 여러 속성으로 구성되어 있을경우 기본키를 구성하는 모든 속성이 포함된 기본키의 부분집합에 종속된 경우

각 행을 고유하게 식별하기 위해 복합 기본키가 필요하다. 

예를 들어, 유저번호가 1인 사용자 "홍철"이 "코딩테스트"와 "프런트특강"을 듣고 있기 때문에, 유저번호와 수강명을 결합해야 고유성을 유지할 수 있다. 

 

→ 테이블 분리 

 학생성적 테이블은 복합기본키 {유저ID, 수강명}에 완전히 종속되고

번호-ID테이블은 유저ID에 대해 유저번호가 완전히 종속되어 제2정규형을 만족한다. 


-제3정규형

제 2정규형이고 기본키가 아닌 모든 속성이 이행적 함수 종속(transitive dependency)이 없도록

이행적 함수 종속은 A -> B, B -> C이면 A -> C가 성립한다. 이 경우 C가 A에 이행적으로 함수 종속이 되었다고 한다.

할인율이 등급에 종속되어 있으며, 등급은 유저ID와 관련된 속성

따라서 이행적 종속성(유저ID → 등급 → 할인율)이 발생

 

→ 테이블 분리 

유저 테이블은 기본키(유저ID)에 대해 유저 이름과 등급이 직접적으로 종속

등급 할인율 테이블은 기본키(등급)에 대해 할인율이 직접적으로 종속


-보이스/코드 정규형(BCNF, Boyce-Codd Normal Form )

: 제3정규형(3NF)의 강화된 형태로, 더 엄격한 규칙을 적용

 

보이스/코드 정규형은 제3정규형이고 결정자가 후보키가 아닌 함수 종속 관계를 제거하여 릴레이션의 함수 종속 관계에서 모든 결정자가 후보키인 상태이다. = 각 행을 유일하게 식별 

결정자: X -> Y이면 X는 결정자, Y는 종속자

 

요구사항

- 각 수강명에 대해 한 학생은 오직 한 강사의 강의만 수강한다. 

- 각 강사는 한 수강명만 담당한다.

- 한 수강명은 여러 강사가 담당할 수 있다. 

롤-범석 데이터를 추가하려고 할때 학번 (학생) 이 NULL이 되는 문제가 발생한다.

 

→ 테이블 분리

수강명-강사 테이블에 롤-범석 데이터를 추가할수 있다.

 

정규화를 하는 목적

1) 데이터의 중복을 줄이고,

2) 데이터 무결성을 유지하며

3) 효율적인 데이터 저장

 

  • 제1정규형 (1NF): 테이블의 모든 컬럼이 원자적이어야 하며, 중복된 데이터 그룹이 없어야 합니다.
  • 제2정규형 (2NF): 제1정규형을 만족하며, 모든 비주요 속성이 기본키의 전체에 종속되어야 합니다.
  • 제3정규형 (3NF): 제2정규형을 만족하며, 비주요 속성이 기본키에 종속될 뿐만 아니라, 다른 비주요 속성에 의존하지 않아야 합니다.
  • 보이스코드 정규형 (BCNF): 제3정규형을 만족하며, 모든 결정자가 후보키여야 합니다.

 

 

정규형 과정을 거쳐 테이블을 나눠도 성능이 100% 좋아지진 않는다. 나빠질 수도 있다.

테이블을 나누면 어떠한 쿼리는 조인을 해야해서 오히려 느려질 수도 있어 서비스에 따라 정규화 혹은 비정규화를 해야한다.


[4.3 트랜잭션과 무결성]

트랜잭션 

 

데이터베이스에서 하나의 논리적 기능을 수행하기 위한 작업의 단위 = 여러 개의 쿼리를 하나로 묶는 단위를 말한다.

쿼리 :데이터 베이스에 접근하는 방법


커밋 commit
 : 여러 쿼리가 성공적으로 처리되었다고 확정하는 명령어

 = 하나의 트랜잭션이 성공적으로 수행되었다는 의미 

롤백 : 트랜잭션으로 처리한 하나의 묶음 과정을 다시 이전 상태로 돌아가는 것

 

커밋과 롤백

데이터의 무결성이 보장된다.

데이터 변경 전에 변경사항을 쉽게 확인할 수있다.

해당 작업을 그룹화 할 수 있다. 


영어 transaction은 거래를 뜻한다.

예를 들어 돈을 줬는데 물건을 받지 못한다면, 그 거래는 이루어지지 못하고 원상태로 복구되어야 한다.

쪼갤 수 없는 하나의 처리 행위를 원자적 행위라고 한다.

여기서 쪼갤 수 없다는 말의 의미는 실제로 쪼갤 수 없다기보다는 만일 쪼개질 경우 시스템에 심각한 오류를 초래할 수 있다는 것이다.

 

트랜잭션의 특징 : ACID

1) Atomicity (원자성) 2) Consistency (일관성) 3) Isolation (격리성)4) Durability (지속성)

 

실제로는 성능향상을 위해 이런 특성들이 종종 완화되곤 한다.

 

1. 원자성 

All or nothing 

트랜잭션을 커밋한 이후에 롤백했을때 커밋 이전의 모든 과정=트랜잭션이 수행되지 않았음을 보장 

하나의 트랜잭션을 쪼갤 수 없다는 의미 

 

내가 친구한테 10000원을 보낸다면,

  1.  내 잔액  -10000원
  2.  친구 잔액 +10000원

이 둘줄 하나만 처리된다면 원자성(Atomicity) 위반이다.


 

2. 일관성

기존의 데이터베이스가 Correct State라면 트랜잭션을 수행하고 난 후에도 Correct State여야 한다.

 

Correct State

도메인의 유효범위, 무결성 제약조건 등의 제약조건을 위배하지 않는 정상적인 상태

 

잔액 : 0보다 커야한다.

트랜잭션이 완료된 후에도 잔액은 위 조건을 만족해야 한다. 

따라서 내 잔액이 0일때 다른 사람에게 송금할 수 없다. 

 

(단, 트랜잭션 도중에 위배하더라도 결과가 정상적인 상태면 상관없다.)


 

3. Isolation (격리성, 고립성, 독립성)

 

한 트랜잭션이 실행하는 동안의 중간결과를 다른 트랜잭션이 접근할 수 없다.

 

복수의 병렬 트랜잭션 1, 2, 3, 4는 서로 격리되어 마치 순차적으로 (거의 동시에 수행되더라도) 1 -> 2 -> 3 -> 4 와 같이 실행되는것 처럼 작동되어야 한다.

& 데이터베이스는 여러 사용자가 같은 데이터에 접근할 수 있어야 한다. 

 

두 사용자가 동시에 계좌 이체를 시도해도, 격리성 덕분에 각각의 트랜잭션은 독립적으로 실행되며, 서로의 작업에 영향을 주지 않는다. 

 

여러 개의 격리 수준으로 나눠 격리성을 보장한다. 

 

 

https://velog.io/@guswns3371

격리수준

데이터베이스에서 여러 트랜잭션이 동시에 실행될 때, 각 트랜잭션이 다른 트랜잭션의 중간 상태를 볼 수 있는지 여부를 제어하는 개념

 

SERIALIZABLE (트랜잭션 레벨 3)
 REPEATABLE_READ (레벨 2)
 READ_COMMITED (레벨 1)
 READ_UNCOMMITED (레벨 0)

 

각 격리 수준은 허용되는 트랜잭션 충돌의 유형에 따라 구분

 

트랜잭션 충돌

  1. Dirty Read (더티 리드): 다른 트랜잭션이 아직 커밋하지 않은 데이터를 읽는 것.
  2. Non-repeatable Read (반복가능하지 않은 조회): 동일한 데이터를 한 트랜잭션 내에서 두 번 읽을 때, 그 값이 다른 경우.
  3. Phantom Read (팬텀 리드): 한 트랜잭션 내에서 동일한 쿼리를 두 번 수행할 때, 중간에 다른 트랜잭션이 데이터를 삽입하거나 삭제하여 결과 세트가 달라지는 경우.

4. 지속성

완료(commit) 된 트랜잭션은 데이터베이스에 영구적으로 보존되어야 한다.

 

완료 후에 컴퓨터가 꺼진다면 데이터는 이미 저장되었으므로 보존된다.

완료 전에 컴퓨터가 꺼진다면 데이터는 Atomicity 원칙을 따라, 트랜잭션 수행하기 전으로 돌아간다.

 

사용자가 은행에서 돈을 이체한 후, 트랜잭션이 성공적으로 완료되면, 이체된 금액은 데이터베이스에 영구적으로 기록.

만약 시스템이 갑자기 재부팅되거나 장애가 발생하더라도, 이체된 금액은 데이터베이스에 남아 있다.


무결성

데이터의 정확성, 일관성, 유효성을 유지하는 것을 말한다. 

→ 데이터베이스에 저장된 데이터값과, 그 값에 해당하는 현실세계의 실제 값이 일치하는지에 대한 신뢰가 생긴다.

 

무결성의 종류

 

1. 개체 무결성

기본키로 선택된 필드는 빈 값을 허용하지 않는다.

 

2. 참조 무결성

서로 참조 관계에 있는 두 테이블의 데이터는 항상 일관된 값을 유지해야 한다.

 

3. 고유 무결성

특정 속성에 대해 고유한 값을 가지도록 조건이 주어진 경우 그 속성 값은 모두 고유한 값을 가진다.

 

4. NULL 무결성

특정 속성 값에 NULL이 올 수 없다는 조건이 주어진 경우 그 속성 값은 NULL이 될 수 없다는 제약 조건이다.

 

 

 

 

 

 

 

 

 

https://inpa.tistory.com/entry/DB-%F0%9F%93%9A-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EB%A7%81-1N-%EA%B4%80%EA%B3%84-%F0%9F%93%88-ERD-%EB%8B%A4%EC%9D%B4%EC%96%B4%EA%B7%B8%EB%9E%A8

 

📋 데이터 모델링 개념 & ERD 다이어그램 작성 💯 총정리

데이터 모델링 이란? 데이터 모델링이란 정보시스템 구축의 대상이 되는 업무 내용을 분석하여 이해하고 약속된 표기법에 의해 표현하는걸 의미한다. 그리고 이렇게 분석된 모델을 가지고 실제

inpa.tistory.com