[ Database ] 정규화, 트랜잭션

5tr1ker·2023년 5월 30일
0

Database

목록 보기
3/5
post-thumbnail

정규화 ( Normalization )

정규화는 테이블 간의 중복된 데이터를 제거하여 데이터의 무결성을 유지할 수 있으며 , DB의 저장 용량을 줄일 수 있게 설계하는 것을 말합니다.

테이블을 분해하는 정규화 단계가 있는데, 어떻게 분해하는지에 따라 정규화 단계가 나뉩니다.

제 1 정규화

제 1 정규화는 테이블 내 속성 값이 원자값 ( Atomic Value , 한 가지의 값 ) 을 갖도록 테이블을 분해하는 것을 말합니다.

위의 테이블처럼 추신수의 취미들 ( 속성 ) 에 여러개의 취미를 가지고 있는데, 해당 테이블은 제 1 정규화를 만족하지 못하고 있습니다. 위의 취미를 각각의 컬럼으로 나눠 분리할 수 있습니다.

제 2 정규화

제 2 정규화는 릴레이션이 제 1 정규화를 만족하며 기본키가 아닌 속성이 기본키에 완전 함수 종속을 만족해야 합니다.

완전 함수 종속이란 기본키의 부분집합이 결정자가 되어서는 안되는 것을 의미합니다.

예시로 다음과 같은 테이블이 있다면 ( 기본키는 학생번호 , 강좌이름인 복합키 ) 학생 번호와 강좌 이름을 기본키로 하여 성적을 결정하고 있습니다. ( 학생번호 , 강좌이름 ) -> ( 성적 )
다만 여기서 강의실이라는 컬럼은 기본키의 부분 집합인 강좌이름에 의해 결정될 수 있습니다. ( 강좌이름 ) -> ( 강의실 )

따라서 기본키인 ( 학생 번호 , 강좌 이름 ) 에서 부분키인 강좌 이름이 결정자가 되기 때문에 위의 테이블을 다음과 같이 분해하여 별도의 테이블로 관리할 수 있습니다.

제 3 정규화

제 3 정규화는 릴레이션이 제 2 정규화를 만족하고 이행적 함수 종속을 제거한 형태를 말합니다.

여기서 이행적 함수 종속은 속성 A->B , B->C 가 성립할 때 A->C가 성립하는 것을 의미합니다.
이행적 함수 종속을 제거해야 하는 이유는 아래의 테이블을 보면 만약 501번의 학생이 수강하는 강좌를 스포츠경영학으로 바꿨다면 수강료를 15000원이 아닌 20000원을 지불해야 합니다. 물론 수강료를 다시 변경할 수 있지만 이러한 번거로움을 해결하기 위해 제 3 정규형이 존재하는 것입니다.

위와 같은 테이블을 보게 되면 학생 번호는 강좌이름을 결정하고, 강좌이름은 수강료를 결정하고 있습니다. 이는 이행적 함수 종속이 발생하고 있어 ( 학생 번호 , 강좌 이름 ) 과 ( 강좌 이름 , 수강료 ) 로 분해하면 해결할 수 있으며 그 결과는 다음과 같습니다.

BCNF 정규화

BCNF 정규화는 제 3 정규화를 만족하며 모든 결정자가 후보키가 되도록 테이블을 분해하는 것을 말합니다.

위의 테이블을 보면 특강수강 테이블을 보면 기본키인 ( 학생번호 , 특강이름 ) 은 교수를 결정하고 있습니다. 또한 여기에서 교수는 특강 이름을 결정하고 있습니다.

문제는 교수는 특강이름을 결정하는 결정자이지만, 후보키가 아니기에 BCNF를 만족하지 않습니다. 따라서 위의 테이블을 분해해야 하는데 ( 학생 번호 , 교수 ) , ( 특강이름 , 교수 ) 로 분해할 수 있습니다.

트랜잭션

트랜잭션은 DB의 상태를 변화시키는 논리적인 작업의 단위로, 한 트랜잭션에는 여러가지 작업들이 수행될 수 있습니다. 그러므로 트랜잭션은 전체가 수행되거나 수행되지 않는 All or Nothing 의 특징을 갖고있습니다.

ACID

데이터베이스에는 4가지 성질인 ACID 를 가지고 있습니다.

원자성 ( Atomicity )

트랜잭션에 포함된 모든 작업들은 수행되거나 수행되지 않아야 합니다.

이는 All or Nothing의 성질로 트랜잭션이 성공적으로 수행되어 데이터베이스에 모두 반영되거나 , 반영되지 않아야 합니다.

일관성 ( Consistency )

트랜잭션이 수행되기 전과 후에 데이터베이스는 항상 일관된 상태를 유지해야 합니다.

테이블의 기본키와 같은 속성이 유지되거나, A에서 B로 이체를 했을 경우에 A와 B의 총합이 맞아야 하는 경우를 말합니다.

고립성 ( Isolation )

수행 중인 트랜잭션에 다른 트랜잭션이 끼어들어 간섭해야 하지 않아야 합니다.

트랜잭션은 상호 간의 존재를 모르고 독립적으로 수행되어야 합니다. 고립성을 격리성이라고도 말하는데 이를 유지하기 위해서 여러 트랜잭션이 접근하는 데이터에 대한 제어를 설정합니다.

지속성 ( Durability )

성공적으로 수행된 트랜잭션은 변경된 데이터를 영구히 저장되어야 합니다.

트랜잭선이 정상적으로 완료 ( Commit ) 된 경우에는 내용을 DB에 기록해야 하며, 부분 완료 ( Partial Commit ) 된 경우에는 작업을 취소 ( Aborted ) 하여야 합니다.

트랜잭션의 Commit과 Rollback

Commit은 하나의 트랜잭션이 성공적으로 수행되었다는 것을 알려주기 위한 연산입니다. 이 연산을 수행하면 트랜잭션이 로그에 저장되며, 후에 Rollback 연산을 수행할 때 기준점이 됩니다.

Rollback은 트랜잭션 수행이 실패하거나 비정상적으로 종료되었을 때,

참고

참고 블로그 1 : 링크
참고 블로그 2 : https://mangkyu.tistory.com/28
참고 블로그 3 : https://mangkyu.tistory.com/30
참고 블로그 4 : https://mangkyu.tistory.com/110
참고 블로그 5 : https://mommoo.tistory.com/62

profile
https://github.com/5tr1ker

0개의 댓글