데이터 베이스 ACID
ACID(원자성, 일관성, 고립성, 지속성) 특징은 데이터 베이스 트랜잭션이 안전하게 수행된다는 것을 보장하기 위한 성질을 가리키는 약어이다.
데이터베이스에서 데이터에 대한 하나의 논리적 실행단계를 트랜잭션이라고 한다.
원자성(Atomicity)은 트랜잭션과 관련된 작업들이 부분적으로 실행되다가 중단되지 않는 것을 보장하는 능력이다.
예를 들어, 사용자 A가 B에게 돈을 입금한 경우 B의 계좌에 입금과 A의 출금 실행이 한번에 이루어져야하며 둘 중 하나가 실패한 상태가 존재해서는 안된다.
일관성(Consistency)은 트랜잭션이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지하는 것을 말한다.
독립성(Isolation) 트랜잭션을 수행 시 다른 트랜잭션이 연산 작업이 끼어들지 못하도록 보장하는 것을 의미한다. 이것은 트랜잭션 밖에 있는 어떤 연산도 중간 단계의 데이터를 볼 수 없음을 의미한다. 은행 관리자는 이체 작업을 하는 도주에 쿼리를 실행하더라도 특정 계좌간 이체하느 양쪽을 볼 수 없다. 고립성은 트랜잭션 실행내역은 연속적이어야 함을 의미한다.
지속성(Durability)은 성공적으로 수행된 트랜잭션은 영원히 반영되어야 함을 의미한다. 시스템 문제, DB 일관성 체크 등을 하더라도 유지되어야 함을 의미한다. 모든 트랜잭션은 로그로 남고 시스템 장애 발생 전 상태로 되돌릴 수 있다. 트랜잭션은 로그에 모든 것이 저장된 후에만 commit 상태로 간주될 수 있다.
데이터 베이스 정규화
관계형 데이터베이스 설계에서 중복을 최소화하기 위해 데이터를 구조화하는 프로세스를 정규화라고 한다. 데이터베이스 정규화의 목표는 이상이 있는 관계를 재구성하여 작고 잘 조직된 관계를 생성하는 것에 있다.
일반적으로 정규화란 크고 제대로 조직되지 않은 테이블들과 관계들을 작고 잘 조직된 테이블가 관계들로 나누는 것을 포함한다. 정규화의 목적은 하나의 테이블에서의 데이터 삽입, 삭제, 변경이 정의된 관계들로 인하여 데이터베이스의 나머지 부분들로 전파되게 하는 것이다.
정규화의 목적
데이터베이스 변경시 이상 현상 제거
테이블 수정(갱신, 삽입, 삭제)시 원치 않던 부작용이 발생할 수 있다.
- 같아야하는 정보가 복수 개의 행에서 표현되면 논리적인 모순을 초래할 수 있다.
갱신 이상
- 두 개 이상의 테이블에서 같은 의미를 갖는 컬럼이 존재하는 데 한 쪽 테이블에서만 변경사항을 적용하면 다른 테이블에서는 현재 변경된 상황과 맞지않는 상황이 초래된다.
삽입 이상
교수의 강의 테이블에서 Faculty ID, Faculty Name, Faculty Hire Date, Course Code라는 컬럼이 있다하자. 이 테이블에 새로운 레코드를 추가하기 위해서는 반드시 모든 컬럼을 포함해야하는데 그 중 하나가 Null 값이라면 테이블에 추가할 수 없게 된다.
삭제 이상
동일한 교수 강의 테이블에서 Dr.Giddens 교수가 가르치는 ENG-206가 폐강되어 레코드를 삭제했다고 하자. 교수 강의 테이블 외에 다른 테이블에서 교수 정보에 대한 기록을 가지는 테이블이 없다면 강의 레코드 삭제로 교수가 없는 것처럼 전체 데이터 베이스에서 기록이 없어진다.
데이터베이스 구조 확장시 재 디자인 최소화
정규화된 데이터베이스 구조에서는 새로운 데이터 형의 추가로 인한 확장시 그 구조를 변경하지 않아도 되거나 일부만 변경해도 되는 경우가 있다. 이는 이 데이터베이스와 연동된 응용 프로그램에 최소한의 영향만을 주며 응용 프로그램의 생명을 연장시킨다.
사용자에게 데이터 모델을 더욱 의미있게
정규화된 테이블과 정규화된 테이블들간의 관계들은 현실세계에서의 개념들과 그들간의 관계들을 반영한다. 데이터 모델을 사용자에게 더욱 의미 있게 한다.
다양한 질의 자원
정규화된 테이블은 일반적인 목적의 질의에 적합하다. 이는 테ㅣ블에 대하여 세부사항이 예측되지 않은 잘애의 질의를 포함한 어떠한 질의도 지원한다는 의미이다. 반대로 정규화되지 않은 테이블은 어떤 질의들은 지원하지 않을 수 있다.
제 1정규형 1NF
테이블 정의에 속한 모든 컬럼의 값이 원자값으로만 구성되어 한다.
학번 | 자격증코드 | 취득여부 | 학년 | 가중치 |
20178444 | A001, A003, A008 | Y, N, N | 3 | 20% |
20192511 | A003, A008, A010 | Y, Y, N | 1 | 10% |
20182354 | A001, A004, A007, A009 | Y, Y, N, Y | 2 | 15% |
20172514 | A002 | Y | 1 | 10% |
'자격증' 테이블에 속한 자격증 코드와 취득 여부 컬럼에 대한 값들이 원자값이 아니라 튜플 형태로 가진 것을 알 수 있다. 이는 제 1 정규화를 위배한다고 볼 수 있다.
제 1 정규화를 만족하는 테이블
학번 | 자격증코드 | 취득여부 | 학년 | 가중치 |
20178444 | A001 | Y | 3 | 20% |
20178444 | A003 | N | 3 | 20% |
20178444 | A008 | N | 3 | 20% |
20192511 | A003 | Y | 1 | 10% |
20192511 | A008 | Y | 1 | 10% |
20192511 | A010 | N | 1 | 10% |
20182354 | A001 | Y | 2 | 15% |
20182354 | A004 | Y | 2 | 15% |
20182354 | A007 | N | 2 | 15% |
20182354 |
A009 | Y | 2 | 15% |
20172514 | A002 | Y | 1 | 15% |
위 테이블에서 컬럼들에서 보이는 종속성들은 다음과 같다.
결정자 | 종속자 |
학번 | 학년 |
학번 | 가중치 |
학년 | 가중치 |
{학번, 자격증 코드} | 취득여부 |
테이블의 기본 키인 컬럼 {학번, 자격증코드}에 대하여 학년/가중치 컬럼이 학번 컬럼에 종속적이기 때문에 결국 테이블 키에 완전 종속되지 못하고 부분 종속된다는 것을 알 수 있다.
쉽게 본다면, 학년과 가중치 컬럼 값들이 중복해서 보이는 데 이 값들을 제거해야한다.
제 2 정규형 2NF
테이블이 제 1 정규형에 속하고 기본키가 아닌 모든 컬럼이 기본키에 완전 함수 종속이 되면 제 2정규형에 속한다.
제 2 정규형을 만족하는 다음 두 테이블로 분리하도록 한다.
학번 | 학년 | 가중치 |
20178444 | 3 | 20% |
20192511 | 1 | 10% |
20182354 | 2 | 15% |
20172514 | 1 | 10% |
학생 테이블
학번 | 자격증 코드 | 취득 여부 |
20178444 | A001 | Y |
20178444 | A003 | N |
20178444 | A008 | N |
20192511 | A003 | Y |
20192511 | A008 | Y |
20192511 | A010 | N |
20182354 | A001 | Y |
20182354 | A004 | Y |
20182354 | A007 | N |
20182354 |
A009 | Y |
20172514 | A002 | Y |
자격증 테이블
삽입/삭제/갱신 이상을 어느 정도 제거하였으며 분리된 테이블에서 보이는 컬럼 종속 관계는 다음과 같다.
결정자 | 종속자 |
학년 | 가중치 |
학번 | 학년 |
학번 | 가중치 |
위 테이블 설계에서도 삭제 이상이 일어날 수 있는데, 가중치가 15%인 레코드를 삭제하면 가중치가 15%에 대한 정보가 삭제된다.
제 3 정규형 3NF
테이블이 제 2 정규형에 속하고 기본키가 아닌 모든 컬럼이 기본키에 이행적 함수 종속이 되지 않으면 제 3정규형에 속한다.
이행적 종속이란
X -> Y 그리고 Y ->Z 종속 관계가 있을 때, X -> Z로 이행적 종속관계가 된다.
학번 -> 학년 그리고 학년 -> 가중치를 결정하므로 학번 -> 학년의 이행적 종속관계를 만들어 낸다.
학생 테이블을 제 2 정규형을 만족하도록 분리한다.
학번 | 학년 |
20178444 | 3 |
20192511 | 1 |
20182354 | 2 |
20172514 | 1 |
학년 | 가중치 |
3 | 20% |
2 | 15% |
1 | 10% |
참고 :
'DB > 이론' 카테고리의 다른 글
RDBMS vs NoSQL (0) | 2022.05.02 |
---|---|
무결성 제약 조건 (0) | 2022.05.02 |
트랜잭션 고립 수준에 따른 부정합 문제 (0) | 2022.05.01 |
내부 조인과 외부 조인 (0) | 2022.04.30 |
클러스터형 인덱스 / 보조 인덱스 (0) | 2021.11.29 |