정규화라는 단어는 정보처리관련 자격증을 준비했거나 DB설계를 한번이라고 해봤다면 들어봤을 법한 이론이다. 간단히 이야기하면 테이블간에 중복을 허용하지 않는다는 의미이다. 그리고 정규화를 통해 데이터의 무결성을 유지하면서 DB용량을 줄일 수 있는 중요한 이론 지식이다. 테이블 정규화는 1~5 정규화까지 있고 반정규화가 존재한다.
보통은 1부터 3정규화 까지만 하는거 같다. 자료조사를 해도 3정규화 까지만 설명하는 게시글이 검색결과 제일 위에 있었다.
정보처리기사 기준으로 정규화를 나타나면 하단의 이미지를 참고바란다.
(https://velog.io/@wisdom-one/정규화Normalization 게시글의 이미지 입니다.)
제 1정규화는 간단히 이야기하면 하나의 컬럼에는 하나의 데이터, 유일한 속성, 유일한 컬럼이름을 가지고 있어야한다, 라는 원칙이다.
예를들어 다음과 같은 테이블이 있다고 가정하자
이렇게하나의 컬럼에 1개 이상의 의미를 담는 데이터를 넣어도 상관은 없지만 나중에 쿼리를 돌릴때 성능저하 문제가 생길 수 있기에 다음과 같이 하나의 컬럼에 하나의 데이터만 넣도록 변경할 수 있다.
이런식으로 하나의 컬럼에 하나의 데이터만 들어가도록 하는 것 이것이 바로 제 1정규화 이다.
제 2정규화는 현재 테이블의 주제와 관련이 없는 컬럼을 다른 테이블로 빼는 작업을 의미한다.
제 2정규화의 조건은 다음과 같다.
마찬가지로 예시를 들자면 주문테이블에 음식가격이 추가되었다.
만약 피자의 가격이 올랐다면 현재는 주문음식에 조건을 달거나등의 방법을 사용하여 가격을 수정하면 되는데 만약 테이블의 길이가 100개 1000개의 경우에는 작업이 오래걸려 비효율적이게 된다.
그래서 위의 테이블 구조처럼 현재 주문테이블과 관련이 없는 가격을 별도의 테이블로 만드는 것을 제 2정규화이다, 이렇게 하면 특정 음식의 가격을 바꾸고 싶으면 주문테이블에서 하나하나 바꾸는 것이 아닌 음식가격테이블에서 하나만 바꾸면 되기 때문에 작업이 많이 간소화되는 장점이 있다.
composite primary key : 일단 primary key는 알고 있겠지만 한 테이블의 row를 구분짓는 key를 이야기하는데 그래서 유일성을 만족해야한다. 하지만 위의 주문테이블 처럼 primary key가 없는 경우에도 primary key와 비슷하게 만들 수 있는데 테이블번호와 주문음식을 합치면 primary key와 같은 역할을 하는데 여기서 테이블번호와 주문음식 컬럼이 composite promary key라고 한다.
제 3정규형은 일반 컬럼에 종속되어있는 컬럼은 다른 테이블로 빼는 것을 의미하는데 기술적으로 이야기한다면 이행적 함수 종속을 제거해야 한다라는 의미이다.
제 3정규화 조건은 다음과 같다.
이행적 함수 종속 : 테이블에서 A->B, B->C 일때 A->C인 경우를 이행적 함수 종속이라고 하는데
위의 테이블구조는 컬럼끼리 종속되어있는 형태이다.
이런형태로 서로 연관되어있는 형태를 이행적 함수 종속이라고 한다.
만약 제 3정규화를 한다면 이렇게 설계할 수 있겠다.
(보통 관계형 데이터베이스에서는 제 3정규화 까지만 작업한다.)
보이스 코드 정규화는 제 3정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해하는 것이다, 쉽게 설명하면 제 3정규형을 좀 더 강화시킨 개념이다.
위의 테이블과 같이 테이블번호 컬럼, 예약이름 컬럼으로 담당웨이터를 알 수 있다, 그리고 담당웨이터를 알면 예약이름을 알 수 있으므로 담당웨이터 -> 예약이름 이 종속적이다. 즉 후보키 집합에 속하지 않은 결정자가 존재하므로 BCNF를 만족하지 않는다.
BCNF를 만족하기 위해서는 이렇게 분리하면 되겠다.
정리하면서 가장 헷갈리는게 3NF와 BCNF이었다. 차이점을 이야기하자면 3NF는 테이블간의 의존성을 제거하지만 거기까지이고 BCNF는 테이블간의 의존성을 제거하는 동시에 후보키를 정해주는 점에서 차이점이 있다고 생각한다. 위에서 설명한대로 3 정규화를 거친 테이블을 보면
주문음식 컬럼이 후보키가 될 수는 없다. 하지만 BCNF를 거친 테이블을 보면
담당웨이터는 후보키의 특징인 유일성이 존재하기 때문에 담당웨이터 컬럼은 후보키가 될 수 있다.
https://www.youtube.com/watch?v=Y1FbowQRcmI
https://mangkyu.tistory.com/110
https://velog.io/@wisdom-one/정규화Normalization
(항상 감사합니다.)