[데이터베이스] ERD와 정규화 / 트랜잭션

mainsain·2024년 2월 16일
0

CS

목록 보기
19/20
post-thumbnail

ERD와 정규화 과정

ERD (Entity Relationship Diagram) : 릴레이션의 관계를 정의한 것으로, DB 구축의 기초적인 뼈대이다.

1️⃣ ERD의 중요성

ERD는 시스템 요구 사항을 기반으로 작성되며, 디버깅과 비지니스 프로세스 재설계가 필요한 경우에 설계도 역할을 담당하기도 한다.

  • 👍🏻 관계형 구조로 표현할 수 있는 데이터를 구성하기에 유용하다.
  • 👎🏻 비정형 데이터를 충분히 표현할 수 없다.

비정형 데이터 : 비구조화 데이터로, 미리 정의된 데이터 모델이나 정의되지 않은 정보들

2️⃣ 예제로 배우는 ERD

3️⃣ 정규화 과정

  • 릴레이션간의 잘못된 종속 관계로 인해 데이터베이스 이상 현상을 해결하거나
  • 저장 공간을 효율적으로 사용하기 위해 릴레이션을 여러 개로 분리하는 과정

데이터베이스 이상 현상 : 테이블을 설계할 때 잘못 설계하여 데이터를 삽입, 삭제, 수정할 때 논리적으로 생기는 오류

정규화 과정 : 정규형 원칙을 기반으로 정규형을 만들어가는 과정
이번 시간에는 기본 정규형인 [1,2,3] 정규형, 보이스 / 코드 정규형을 공부한다.

정규형 원칙

  • 좀 더 좋은 구조로
  • 자료의 중복성은 적게
  • 독립적인 관계는 별개의 릴레이션으로 표현
  • 각 릴레이션은 독립적인 표현이 가능하게 하는 것

그러나 정규형 과정을 거쳐 테이블을 나눈다고 하더라도, 성능이 항상 좋아지는 건 아니다.
테이블을 나누면 특정 쿼리는 Join을 해야하는 경우가 발생해 오히려 느려질 수도 있다.

제1 정규형

모든 도메인이 더 이상 분해될 수 없는 원자 값(atomic value)만으로 구성되어야 한다.
한개의 기본키에 대해 두 개 이상의 값을 가지는 반복집합은 없어야한다.

제2 정규형

릴레이션이 제1 정규형이며, 부분 함수의 종속성을 제거한 형태

부분함수의 종속성 제거 : 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속적인 것

주의할 점

  • 릴레이션을 분해할 때 동등한 릴레이션으로 분리해야한다.
  • 정보 손실이 일어나지 않는 무손실 분해로 분리되어야 한다.

제3 정규형

제2 정규형이며, 기본키가 아닌 모든 속성이 이행적 함수 종속(transivite FD)을 만족하지 않는 상태

이행적 함수 종속 : A → B와 B → C가 존재하면, 논리적으로 A → C가 성립하는데 이때 집합 C가 집합 A에 이행적으로 함수 종속이 되었다고 한다.

보이스 / 코드 정규형 (BCNF)

제3 정규형이며, 함수 종속 관계에서 모든 결정자가 후보키인 상태

  • 결정자는 후보키가 아닌 함수 종속 관계를 제거한다.
  • 결정자 : ‘X’ → ‘Y’일때 X는 결정자, Y는 종속자

예시 요구사항

  • 각 수강명에 대해 한 학생은 오직 한 강사의 강의만 수강한다.
  • 각 강사는 한 수강명만 담당한다.
  • 한 수강명은 여러 강사가 담당할 수 있다.

트랜잭션과 무결성

1️⃣ 트랜잭션

데이터베이스에서 하나의 논리적 기능을 수행하기 위한 작업의 단위이며, 이에 대한 특징으로 원자성 일관성 독립성 지속성이 있고 이를 ACID 특징이라고 한다.

원자성 (atomicity)

“all or nothing”

트랜잭션과 관련된 일이 모두 수행되었거나 되지 않았거나를 보장하는 특징이다.

예를 들어 트랜잭션을 커밋했는데, 문제가 발생하여 롤백하는 경우 그 이후에 모두 수행되지 않음을 보장하는 것

트랜잭션 단위로 여러 로직들을 묶을 때 외부 API를 호출하면 안된다.
만약 존재한다면, 롤백 발생 시 해결방안이 있어여 하며 트랙잭션 전파를 신경써서 관리해야한다.

커밋 (commit)

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

  • 트랜잭션 단위로 수행된다.
  • 변경된 내용이 모두 영구적으로 저장되는 것
  • “커밋이 수행되었다.” == “하나의 트랜잭션이 성공적으로 수행되었다.”

롤백 (rollback)

트랜잭션으로 처리한 하나의 묶음 과정을 일어나기 전으로 돌리는 일(취소)을 말한다.

이러한 커밋과 롤백 덕분에 데이터의 무결성이 보장된다.
또한 데이터 변경 전에 변경 사항을 쉽게 확인할 수 있으며 해당 작업을 그룹화할 수 있다.

트랜잭션 전파

트랜잭션 관련 메서드의 호출을, 하나의 트랜잭션에 묶이도록 하는 것.

@Service
@Transactional(readOnly = true)
public class MemberService{
	private final Member Repository memberRepository;
    
    public MemberService(MemberRepository memberRepository){
    	this.memberRepository = memberRepository;
	}
}

이처럼 Spring에선 Transcational 애너테이션을 통해 여러 쿼리 코드들을 하나의 트랜잭션으로 처리한다.

  • 트랜잭션은 커넥션 단위로 수행하기에 매번 커넥션 객체를 넘겨야한다.
  • 따라서 여러 트랜잭션 관련 메서드를 하나로 묶는 것

일관성 (consistency)

허용된 방식으로만 데이터를 변경해야 하는 것

  • 데이터베이스에 기록된 모든 데이터는 여러가지 조건과 규칙에 따라 유효함을 가져야한다.
  • ex) 잔고 0원으로부터 500만원은 송금 불가능하다.

격리성 (isolation)

트랜잭션 수행 시 서로 끼어들지 못하는 것

  • 복수의 병렬 트랜잭션은 서로 격리되어 순차적으로 실행되는 것처럼 작동되어야 하며
  • 데이터베이스는 여러 사용자가 같은 데이터에 접근할 수 있어야한다.
  • 격리성은 여러개의 격리 수준을 나눠 격리성을 보장한다.

지속성 (durability)

성공적으로 수행된 트랜잭션은 영원히 반영되어야 하는 것

  • 데이터베이스에 시스템 장애가 발생해도 원래 상태로 복구하는 회복 기능이 있어야 한다.
  • DB는 이를 위해 체크섬, 저널링, 롤백 등의 기능을 제공한다.

체크섬 : 중복 검사의 한 형태로, 오류 정정을 통해 무결성을 보호하는 방법
저널링 : 변경 사항을 반영(commit)하기 전에 로깅하는 것, 트랜잭션 등 변경 사항에 대한 로그를 남기는 것

2️⃣ 무결성

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

  • 무결성이 유지되어야 DB에 저장된 데이터 값과 그 값에 해당하는 현실 세계의 실제 값이 일치하는지에 대한 신뢰가 생긴다.
이름설명
개체 무결성기본키로 선택된 필드는 빈 값을 허용하지 않음
참조 무결성서로 참조 관계의 두 테이블의 데이터는 항상 일관된 값 유지
고유 무결성고유한 값을 가지는 조건의 속성의 경우 그 속성 값은 모두 고유한 값을 가짐
NULL 무결성NULL이 올 수 없다는 조건의 속성의 경우 그 속성 값은 모두 NULL이 아님

refer

사진참조

profile
새로운 자극을 주세요.

0개의 댓글