RDBMS의 정규화에 대해 설명해주세요.
정규화(Normalization)는 관계형 데이터베이스(RDBMS)의 설계에서 데이터를 중복 없이 효율적으로 저장하기 위한 과정입니다. 쉽게 말해 하나의 테이블을 두개의 테이블로 분리시켜 나가는것 입니다. 이를 통해 데이터베이스의 구조가 불필요한 중복을 최소화하고 데이터의 일관성과 무결성을 유지할 수 있게 됩니다. 또한 이상현상을 제거하게 됩니다.
반면 정규화는 데이터베이스의 구조를 복잡하게 만들 수 있으므로, 쿼리 성능에 영향을 미칠 수 있습니다. 따라서 성능과 유지보수성을 고려하여 적절한 정규화 수준을 선택하는 것이 중요합니다.
정규화는 보통 1NF(제1정규화), 2NF(제2정규화), 3NF(제3정규화), BCNF(보이스-코드 정규형) 등의 단계로 진행됩니다. 각 단계에서는 특정 종류의 중복을 제거하고 특정 종류의 종속성을 해결합니다.
추가질문
이상현상은 어떤것들이 있을까요?
발생 할 수 있는 이상 현상은 null값이 입력되지 않아 회원을 가입 할 수 없는 상황 같은 삽입 이상, 정보 수정 시 연결된 일부 데이터만 수정되는 갱신 이상, 일부 정보를 삭제 했는데 회원 자체가 삭제되는 삭제 이상 등이 있습니다. 이를 해결하기 위해서는 정규화가 필요하며 일반적으로 1개의 연관관계에는 1개의 종속성만 가지도록 정규화 합니다.
추가질문
종속성은 무엇인가요?
함수적 종속성은 X → Y 로 표현합니다. X는 결정자, Y는 종속자라 하며 X가 Y를 함수적으로 결정하는 것을 말합니다.
부분 함수적 종속성은 속성 집합 Y가 속성 집합 X의 전체가 아닌 일부에도 함수적 종속이 되는 것을 의미합니다. 예시로 이름이 속성집합 Y이고 {학번, 과목명}이 속성집합 X일 때, 이름은 {학번, 과목명} 에 함수적 종속이 되며 부분 집합인 학번에도 종속이 되므로 부분 함수적 종속이라 할 수 있습니다.
완전 함수적 종속성은 속성 집합 Y가 속성 집합 X 전체에 대해서만 함수적 종속이 되는 것을 의미합니다. 예시로 성적이 속성집합 Y이고 {학번, 과목명}이 속성집합 X일 때, 성적은 {학번, 과목명} 전체에는 함수적 종속이지만 부분 집합인 학번이나 과목명에는 함수적 종속이 되지 않으므로 완전 함수적 종속이라 할 수 있습니다.
이행적 종속성은 X → Y, Y → Z 처럼 종속되어 있고, X → Z 는 Y를 거쳐야 하는 연결된 종속성을 말합니다.
추가질문
정규화 단계별 특징을 알려주세요.
각 단계별 목표 및 설명
1.
비정규화 데이터: 다중 값이 배열 형태로 테이블에 들어가 있습니다. 이를 해결하기 위해 제 1정규화를 통해 각 값들을 개별적으로 처리하고, 각 행에는 단일 값을 가지도록 합니다.
2.
제1정규화 (1NF): 테이블의 모든 열에는 원자값만 포함되어야 합니다. 각 회원은 기본키로 식별되고, 강의 테이블에서는 회원번호를 외래키로 사용하여 강의와 연결됩니다.
3.
제2정규화 (2NF): 부분적 종속성을 해결하기 위해 테이블을 분리합니다. 예를 들어, 각 강의의 수강료가 정해져 있다면, 강의 테이블에서 강의id를 기본키로 사용하고, 각 강의id에 종속된 수강료 가격 정보를 별도의 테이블로 만듭니다.
4.
제3정규화 (3NF): 이행적 종속성을 해결하여 중복을 피하고 각 테이블이 독립적으로 유지되도록 합니다. 예를 들어, 강의의 수강료가 정해져 있을 때, 회원번호는 수강 강의를 결정하고, 강의 이름은 수강료를 결정하게 됩니다. 이를 해결하기 위해 수강신청 테이블을 생성하여 각 테이블이 독립적인 정보를 가지도록 합니다.
5.
보이스-코드 정규형 (BCNF): 제3정규화에서 발견되는 일부 문제를 해결하기 위해 테이블을 추가로 분해합니다. 가장 원본 데이터에 근접한 회원 테이블, 강의 테이블, 수강료 테이블은 각각 마스터 테이블로 기능하고, 필요할 경우 회원정보 테이블과 같이 참조를 통해 필요한 정보를 얻을 수 있도록 합니다.
추가질문
정규화 단계별 예시를 알려주세요.
각 단계별 세부 예시 :
우선 기본 데이터베이스가 회원이름과 회원이 수강신청한 강의가 있다고 가정 할 때, 회원은 여러 강의를 신청할 수 있습니다.
1.
비정규화 데이터: 정규화가 진행되지 않은 상태의 비정규화 데이터베이스는 회원이라는 테이블에 1번 홍길동-HTML, JAVA, 2번 김대한-HTML과 같이 수강신청한 강의들이 배열처럼 들어가게 됩니다.
하지만 테이블의 각 셀은 단일 값을 갖는다는 관계형 데이터모델의 원자성 제약을 지켜야 하기 때문에 제 1정규화부터 진행됩니다.
2.
제1정규화 (1NF): 의 주요 목적은 테이블의 모든 열에는 원자값만 포함되어야 하는 점을 해결합니다.
따라서 데이터는 회원 테이블로 1번 홍길동, 2번 김대한 으로 구성되고 앞의 번호가 PK로 지정됩니다.
강의 테이블에는 회원번호를 기본키를 참조하여 1번학생 - HTML, 1번학생 - JAVA, 2번학생 - HTML 처럼 회원과 강의 테이블이 PK-FK로 연결되게 됩니다.
3.
제2정규화 (2NF):은 부분적 종속성을 제거하는데 초점을 맞추어 테이블을 분리합니다. 부분적 종속성이란 기본 키가 아닌 부분집합의 열이 기본 키에 종속되는 경우를 말합니다. 이를 해결하기 위해 테이블을 적절히 분리하여 각 테이블이 한 개의 주제에 집중하도록 합니다.
각 강의들의 수강료가 정해져있다면, 1정규화 상태에서는 과목 테이블에서 각 과목 옆에 직접 수강료가 써있을 것입니다. 제2 정규화를 통해 수강료 테이블을 하나 더 만들고 강의id가 PK→수강료 테이블에서 FK로 각 강의id의 가격을 알 수 있는 테이블을 별도로 생성합니다.
4.
제3정규화 (3NF): 이행적 종속성을 제거하는데 초점을 맞춥니다. 이행적 종속성이란 A를 통해서 B를 알고, B를 통해서만 C를 알 수 있는 관계를 말합니다. 이를 해결하기 위해 중복을 피하고 각 테이블이 독립적으로 유지되도록 합니다.
이제는 각 강의의 수강료가 정해져있을 때, 회원번호는 수강강의을 결정하고있고, 강의이름은 수강료를 결정하게 됩니다. 이렇게 연결된 이행적 종속성은 그럼 회원->강의->수강료 순서대로만 알아야하는것이기 때문에 체인처럼 연결되있는 것을 말하고 이걸 제거하는게 3정규화의 목적입니다. 수강신청 테이블을 생성하고, 회원->수강신청, 강의->수강신청, 수강료->수강신청 테이블처럼 각각 FK를 받아오도록 합니다.
5.
보이스-코드 정규형 (Boyce-Codd BCNF): 제3정규화에서 발견되는 일부 문제를 해결하기 위해 추가적으로 테이블을 분해합니다. 가장 원본 데이터에 근접한 회원번호, 회원이름 인 회원 테이블, 강의과목테이블, 수강료테이블은 마스터 테이블로 기준이 되는 테이블이 되며, 회원정보를 보는 회원정보 테이블은 마스터 테이블의 PK를 FK로 참조만 하여 구성되게 됩니다. 예로 회원 정보 테이블은 회원fk 1, 강의fk 1 처럼 나타납니다.