어떤 속성 A의 값을 알면 다른 속성 B의 값이 유일하게 정해지는 관계를 종속성이라 한다.
“종속성 = 화살표” + “결정자 = 유일키”
A -> B 같이 화살표로 표기하고 A를 B의 결정자라고 한다.

학생과 수강 그리고 성적의 속성에는 의존성이 존재한다고 표현할 수 있다. 의존성은 501이라는 학생 번호를 보면 학생 이름이 박지성으로 정해지는 관계를 의미한다.
속성 A의 값을 알면 다른 속성 B의 값이 유일하게 정해지는 의존관계.
속성 B는 속성 A에 종속한다. OR A는 속성 B를 결정한다.
그 외에도 아래의 그림에는 학과 -> 학과사무실, 강좌이름 -> 강의실과 같은 종속관계가 있다.
단 동명이인이 있는 것처럼 학생의 이름으로 학과를 결정하지 못하면 종속 관계가 아니다.
이상현상은 한 개의 릴레이션에 2개 이상의 속성이 포함되어도 되고 기본키가 아닌 속성이 결정자일 때 발생한다.
이상현상 해결을 위해 “하나의 테이블 내 여러 결정자를 허용할 수 없다.” 는 원칙.
이상현상을 해결하기 위해 우리는 총 4개의 릴레이션으로 학생 수강 성적 릴레이션을 분해.

정규화는 함수 종속성을 이용해서 릴레이션 연관성이 있는 속성들로만 구성되도록 테이블을 분해해서 이상 현상이 발생하지 않도록 하는 것.
정규화의 기본 목표는 테이블 간에 중복된 데이터를 허용하지 않는 것이다. 그럼으로써 무결성을 유지할 수 있으며 DB의 저장 용량도 줄일 수 있다.
하지만 중복을 완전히 없앨 수는 없기에 최소화하는 방식으로 해야 한다.
이상 종류

삽입 이상 - 튜플 삽입 시 특정 속성에 해당하는 값이 없어 NULL을 입력해야 하는 현상
수정 이상 - 튜플 수정 시 중복된 데이터의 일부만 수정되어 일어나는 데이터 불일치 현상

릴레이션의 모든 속성 값이 원자값을 갖는 경우다.

제1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해하는 것이다.
완전 함수 종속이란 기본키의 부분집합이 결정자가 되어선 안 된다는 것을 의미한다.
이게 무슨 뜻이냐면 기본키가 종속자고 이 기본키가 여러 속성으로 구성되어 있을 경우 기본키를 구성하는 모든 속성이 포함된 부분집합 또는 종속자일 경우를 말한다.
그림으로 제2 정규화 완료

같은 값(피결정, 아래 예시에선 수강료)을 바라보는 다수 결정자들 분리 (이행적 종속 분리)
이행적 종속 분리란 A -> B, B -> C가 성립할 때 A -> C가 성립되는 것을 의미.

501번 학생이 수강하는 강좌가 스포츠경영학으로 변경되었다고 하면 501번의 학생은 스포츠경영학이라는 수업을 20000원이라는 수강료로 듣게 된다.
기본 키(primary key)가 아닌 속성(Attribute)들은 기본 키에만 의존해야 한다.
모든 결정자가 후보키가 되도록 테이블을 분해하는 것
릴레이션 R에서 함수 종속성 X->Y가 성립할 때 모든 결정자 X가 후보키인 정규형.

기본키는 (학생번호, 특강이름)이다. 그리고 기본키 (학생번호, 특강이름)는 교수를 결정하고 있다. 또한 여기서 교수는 특강이름을 결정하고 있다.
문제는 교수가 특강이름을 결정하는 결정자이지만, 후보키가 아니라는 점.
그렇기 때문에 BCNF 정규화를 만족시키기 위해서 위의 테이블을 분해해야 한다.

하나 이상의 테이블에 데이터를 중복시키거나 그룹핑함으로써 데이터 베이스의 성능을 향상시키기 위한 기법.
읽는 시간을 최적화하도록 설계된 데이터베이스. 의도적으로 정규화 원칙을 위배하는 행위이다.


- 중복 컬럼 허용 : 매우 빈번하게 조회되는 컬럼이 서로 다른 테이블에 있다면 컬럼을 한 곳에 두어라.
- 유도 컬럼 생성 : SUM 함수처럼 쿼리의 결과가 하나의 열, 하나의 행인 경우 쿼리를 상수열로 사용할 수 있는 것을 의미.
쉽게 말하면 다른 속성으로부터 유도된 속성
ex) "판매 가격"과 "구매 가격"이라는 두 컬럼이 있을 때, 이 둘의 차이를 나타내는 "이익"이라는 유도 컬럼을 만들 수 있다.
유도 컬럼을 사용하면 매번 "이익"을 계산하기 위해 별도의 쿼리를 실행할 필요 없이, 빠르게 정보를 얻을 수 있다.
ex) 한 사람의 속성에 생년월일이 있고, 나이가 있다면, 나이는 생년월일을 통해 계산될 수 있으므로 유도속성이다.
👍 **정말 좋은 링크** : DB 설계를 처음부터 할 일이 생긴다면 한번 쯤 살펴 보자.🔗 https://mangkyu.tistory.com/110
🔗 https://mangkyu.tistory.com/28
🔗 https://ccho.tistory.com/9