정규화는 테이블 간의 중복된 데이터를 제거
하여 데이터의 무결성을 유지
할 수 있으며 , DB의 저장 용량을 줄일 수 있게 설계하는 것을 말합니다.
테이블을 분해하는 정규화 단계가 있는데, 어떻게 분해하는지에 따라 정규화 단계가 나뉩니다.
제 1 정규화는 테이블 내 속성 값이 원자값 ( Atomic Value , 한 가지의 값 ) 을 갖도록 테이블을 분해하는 것을 말합니다.
위의 테이블처럼 추신수의 취미들 ( 속성 ) 에 여러개의 취미를 가지고 있는데, 해당 테이블은 제 1 정규화를 만족하지 못하고 있습니다. 위의 취미를 각각의 컬럼으로 나눠 분리할 수 있습니다.
제 2 정규화는 릴레이션이 제 1 정규화를 만족하며 기본키가 아닌 속성이 기본키에 완전 함수 종속
을 만족해야 합니다.
완전 함수 종속이란 기본키의 부분집합이 결정자가 되어서는 안되는 것을 의미합니다.
예시로 다음과 같은 테이블이 있다면 ( 기본키는 학생번호 , 강좌이름인 복합키 ) 학생 번호와 강좌 이름을 기본키로 하여 성적을 결정하고 있습니다. ( 학생번호 , 강좌이름 ) -> ( 성적 )
다만 여기서 강의실이라는 컬럼은 기본키의 부분 집합인 강좌이름에 의해 결정될 수 있습니다. ( 강좌이름 ) -> ( 강의실 )
따라서 기본키인 ( 학생 번호 , 강좌 이름 ) 에서 부분키인 강좌 이름이 결정자가 되기 때문에 위의 테이블을 다음과 같이 분해하여 별도의 테이블로 관리할 수 있습니다.
제 3 정규화는 릴레이션이 제 2 정규화를 만족하고 이행적 함수 종속을 제거한 형태를 말합니다.
여기서 이행적 함수 종속은 속성 A->B , B->C 가 성립할 때 A->C가 성립하는 것을 의미합니다.
이행적 함수 종속을 제거해야 하는 이유는 아래의 테이블을 보면 만약 501번의 학생이 수강하는 강좌를 스포츠경영학으로 바꿨다면 수강료를 15000원이 아닌 20000원을 지불해야 합니다. 물론 수강료를 다시 변경할 수 있지만 이러한 번거로움을 해결하기 위해 제 3 정규형이 존재하는 것입니다.
위와 같은 테이블을 보게 되면 학생 번호는 강좌이름을 결정하고, 강좌이름은 수강료를 결정하고 있습니다. 이는 이행적 함수 종속이 발생하고 있어 ( 학생 번호 , 강좌 이름 ) 과 ( 강좌 이름 , 수강료 ) 로 분해하면 해결할 수 있으며 그 결과는 다음과 같습니다.
BCNF 정규화는 제 3 정규화를 만족하며 모든 결정자가 후보키가 되도록 테이블을 분해하는 것을 말합니다.
위의 테이블을 보면 특강수강 테이블을 보면 기본키인 ( 학생번호 , 특강이름 ) 은 교수를 결정하고 있습니다. 또한 여기에서 교수는 특강 이름을 결정하고 있습니다.
문제는 교수는 특강이름을 결정하는 결정자이지만, 후보키가 아니기에 BCNF를 만족하지 않습니다. 따라서 위의 테이블을 분해해야 하는데 ( 학생 번호 , 교수 ) , ( 특강이름 , 교수 ) 로 분해할 수 있습니다.
트랜잭션은 DB의 상태를 변화시키는 논리적인 작업의 단위로, 한 트랜잭션에는 여러가지 작업들이 수행될 수 있습니다. 그러므로 트랜잭션은 전체가 수행되거나 수행되지 않는 All or Nothing 의 특징을 갖고있습니다.
데이터베이스에는 4가지 성질인 ACID 를 가지고 있습니다.
트랜잭션에 포함된 모든 작업들은 수행되거나 수행되지 않아야 합니다.
이는 All or Nothing의 성질로 트랜잭션이 성공적으로 수행되어 데이터베이스에 모두 반영되거나 , 반영되지 않아야 합니다.
트랜잭션이 수행되기 전과 후에 데이터베이스는 항상 일관된 상태를 유지해야 합니다.
테이블의 기본키와 같은 속성이 유지되거나, A에서 B로 이체를 했을 경우에 A와 B의 총합이 맞아야 하는 경우를 말합니다.
수행 중인 트랜잭션에 다른 트랜잭션이 끼어들어 간섭해야 하지 않아야 합니다.
트랜잭션은 상호 간의 존재를 모르고 독립적으로 수행되어야 합니다. 고립성을 격리성이라고도 말하는데 이를 유지하기 위해서 여러 트랜잭션이 접근하는 데이터에 대한 제어를 설정합니다.
성공적으로 수행된 트랜잭션은 변경된 데이터를 영구히 저장되어야 합니다.
트랜잭선이 정상적으로 완료 ( Commit ) 된 경우에는 내용을 DB에 기록해야 하며, 부분 완료 ( Partial Commit ) 된 경우에는 작업을 취소 ( Aborted ) 하여야 합니다.
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