일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- 세미조인
- 조인
- Hyperparameters
- 데이터베이스
- 실렉션
- Program Execution
- Database
- 정규화
- SQL
- OS
- backpropagate
- pytorch
- 디비전 연산자
- camerax
- 동기식 입출력
- Arificial Intelligence
- dataloader
- 중첩질의
- kernel
- mode bit
- 운영체제
- Artifical Intelligence
- Operating System
- RuntimeError
- 비지도학습
- TicTacToe
- process
- System Structure
- AI
- 카티션 곱
- Today
- Total
aajin126's devlog
[Database] 릴레이션 정규화 본문
릴레이션 정규화
- 데이터베이스에 어떤 릴레이션들을 생성할 것인가? 각 릴레이션에 어떤 애트리뷰트들을 둘 것인가?
- 정규화(normalization)는 주어진 릴레이션 스키마를 함수적 종속성과 기본키를 기반으로 분석하여, 원래의 릴레이션을 분해함으로써 중복과 세 가지 갱신 이상을 최소화한다.
👉 좋은 관계 데이터베이스 스키마를 설계하는 목적 :
정보의 중복과 갱신 이상, 손실을 막고, 애트리뷰트 간의 관계가 잘 표현되는 것을 보장하며, 무결성 제약조건의 시행을 간단하게 하며, 효율성도 고려하는 것을 목적으로 한다.
갱신 이상(update anomaly)
수정 이상 (modification anomaly)
- 반복된 데이터 중 일부만 수정하면 데이터 간의 불일치가 발생
삽입 이상 (insertion anomaly)
- 불필요한 정보를 함께 저장하지 않고는 어떤 정보를 저장하는 것이 불가능
삭제 이상 (deletion anomaly)
- 유용한 정보를 함께 삭제하지 않고는 어떤 정보를 삭제하는 것이 불가능
- 정보의 중복
- 각 사원이 속한 부서 수만큼 동일한 사원의 투플이 존재 → 부서 제외 나머지 정보 중복
- 수정 이상
- 어떤 부서 이름이 바뀔 때 일부 사원 투플에서만 부서 이름을 변경하면 불일치 상태
- 삽입 이상
- 부서를 신설했는데, 사원이 배정이 안됐다면 부서에 관한 정보를 입력할 수 없음
- 삭제 이상
- 어떤 부서에 사원이 단 한 명 있을 때, 그 사원의 투플을 삭제하면 그 사원이 속한 부서에 관한 정보도 삭제됨.
릴레이션의 분해
- 하나의 릴레이션을 두 개 이상의 릴레이션으로 나누는 것
- 분해된 릴레이션들로부터 원래의 릴레이션을 다시 구할 수 있음을 보장해야함
- 분해는 함수적 종속성을 기반으로 함
- 수정, 삽입, 삭제 이상이 나타나지 않음
정규형의 종류
- 제 1정규형(first normal form)
- 제 2정규형(second normal form)
- 제 3정규형(third normal form)
- BCNF (Boyce-Codd normal form) → 보통 이 단계까지 고려
- 제 4정규형
- 제 5정규형
관계 데이터베이스 설계의 비공식적인 지침
- 이해하기 쉽고 명확한 스키마를 만들어라 (여러 엔티티 타입이나 관계 타입에 속한 애트리뷰트를 하나의 릴레이션에 포함시키지 않는다)
- 널값을 피해라
- 가짜 투플이 생기지 않도록 해라
- 스키마를 정제해라
함수적 종속성
- 정규화 이론의 핵심
- 애트리뷰트들의 의미로부터 결정된다.
- 릴레이션 스키마에 대한 주장이지, 릴레이션의 특정 인스턴스에 대한 주장이 아니다. (릴레이션의 모든 인스턴스가 만족해야 하긴 함)
- 함수적 종속성은 제 2정규형 ~ BCNF 까지 적용된다.
결정자
- 어떤 애트리뷰트 값은 다른 애트리뷰트의 값을 고유하게 결정할 수 있다.
- 결정자는 주어진 릴레이션에서 다른 애트리뷰트를 고유하게 결정하는 하나 이상의 애트리뷰트를 의미한다.
- A → B : A가 B를 결정한다. (A는 B의 결정자이다)
함수적 종속성
- 만일 애트리뷰트 A가 애트리뷰트 B의 결정자이면 B가 A에 함수적으로 종속한다고 말한다.
- A → B이려면, 각 A 값에 대해 반드시 한 개의 B 값이 대응되어야 한다.
- 사원 번호는 (사원 이름, 주소, 전화번호)의 결정자, (사원 이름, 주소, 전화번호)는 사원 번호에 함수적으로 종속된다.
- 직책은 (사원번호, 부서번호)에 함수적으로 종속하지, 사원 번호에만 함수적으로 종속하지는 않는다.
완전 함수적 종속성(FFD : Full Functional Dependency)
B가 A에 함수적으로 종속하면서 A의 어떠한 진부분 집합에도 함수적으로 종속하지 않으면 B가 A에 완전하게 함수적으로 종속한다고 한다.
- A를 (사원번호, 부서번호)라고 할 때, 직책은 A에 완전하게 함수적으로 종속하지만 (사원이름, 주소, 전화번호)는 부분 함수적 종속성을 나타낸다.
이행적 함수적 종속성 (transitive FD)
- 기본키를 제외하고 애트리뷰트가 2개 이상 있어야 함
- 한 릴레이션의 애트리뷰트 A, B, C가 있을 때 C가 이행적으로 A에 종속(A → C)한다는 것의 필요 충분 조건은 : A → B ^ B → C 가 성립하는 것
- A가 기본키이기 때문에 A → B, A → C 가 성립한다.
- 이 때 , B → C가 성립하기 때문에 C는 A에 직접 함수적으로 종속하면서 B를 거쳐서 A에 이행적으로 종속한다.
릴레이션 분해
- 중복이 감소되고 갱신 이상이 줄어드는 장점이 있지만 분해 후 조인을 필요로 하는 질의로 바뀐다든지, 분해된 릴레이션을 사용하여 원래 릴레이션을 재구성 하지 못하는 잠재적 문제를 야기할 수 있다.
무손실 분해(lossless decomposition)
- 분해된 두 릴레이션을 조인하면 원래의 릴레이션에 들어있는 정보를 완전하게 얻을 수 있다.
불필요한 분해
- 분해를 할 필요가 없는데, 분해하여 data가 중복되게 하는 것
나쁜 분해
- 조인했을 때 원래 릴레이션이 나오지 않는 분해
가짜 투플
- 나쁜 분해 후 조인했을 때 원래 릴레이션에는 없던 투플
정규형
제 1정규형
릴레이션 R의 모든 애트리뷰트가 원자값만을 가지는 것이 R이 제 1정규형을 만족하는 필요 충분 조건이다.
- 즉 모든 애트리뷰트에 반복 그룹(repeating group)이 나타나지 않으면 된다.
제 1정규형으로 변환하는 방법
- 반복 그룹 애트리뷰트에 나타나는 집합에 속한 값마다 하나의 투플로 표현
- 반복 그룹 애트리뷰트를 분해하여 원래 릴레이션의 기본키를 가진 새로운 릴레이션에 넣어준다.
제 1정규형에 존재하는 갱신 이상
- 삭제 이상 : 어떤 학과에 소속된 마지막 학생 투플을 삭제하면 이 학생이 소속된 학과에 관한 정보도 삭제될 때
- 수정 이상 : 학과에 소속된 학생 수만큼 그 학과의 전화번호가 중복되어 저장되어 있으므로, 여러 학생이 소속된 학과의 전화번호가 변경되었을 때, 모든 학생 투플의 전화번호를 수정하지 않으면 일관성이 유지되지 않는다.
- 삽입 이상 : 한 명의 학생이라도 어떤 학과에 소속되어 있지 않으면 이 학과에 관한 투플을 삽입할 수 없다.
→ 갱신 이상이 생기는 이유 : 기본 키에 대한 부분 함수적 종속성이 존재하기 때문
제 2정규형
릴레이션 R이 제 1정규형을 만족하면서, 어떤 후보 키에도 속하지 않는 모든 애트리뷰트들이 R의 기본 키에 완전하게 함수적으로 종속하는 것
- 기본 키가 두 개 이상의 애트리뷰트로 구성되었을 때만 제 2정규형을 만족하는가를 고려할 필요가 있다. (기본키가 1개면 무조건 만족한다.)
제 2정규형에 존재하는 갱신 이상
- 수정 이상 : 여러 학생이 소속된 학과의 전화번호가 변경되었을 때, 모든 학생 투플의 전화번호를 수정하지 않으면 일관성이 유지되지 않는다.
- 삽입 이상 : 한 명의 학생이라도 어떤 학과에 소속되어 있지 않으면 이 학과에 관한 투플을 삽입할 수 없다.
- 삭제 이상 : 어떤 학과에 소속된 마지막 학생 투플을 삭제하면 이 학생이 소속된 학과의 전화번호도 함께 삭제됨
→ 갱신 이상이 생기는 이유 : 이행적 종속성이 존재하기 때문
- 학번(기본키) → 학과이름, 학번 → 학과전화번호 일 때 학과이름 → 학과전화번호 이므로 이행적 종속성이 존재한다.
제 3정규형
릴레이션 R이 제 2정규형을 만족하면서, 키가 아닌 모든 애트리뷰트가 R의 기본 키에 이행적으로 종속하지 않는 것 (기본키를 제외하고 애트리뷰트가 2개 이상 있어야 가능.. )
제 3정규형에 존재하는 갱신 이상
각 학생은 여러 과목을 수강할 수 있고, 각 강사는 한 과목만 가르친다. 기본키 (학번, 과목)
키가 아닌 강사 애트리뷰트가 기본키에 완전하게 함수적으로 종속하므로 제 2정규형을 만족하고, 기본 키에 직접 종속하므로 제 3정규형도 만족한다.
- 수정 이상 : 여러 학생이 수강 중인 어떤 과목의 강사가 변경되었을 때 모든 학생 투플에서 강사를 수정하지 않으면 일관성이 유지되지 않는다.
- 삽입 이상 : 신설 과목의 수강 학생이 없으면 어떤 강사가 그 과목을 가르친다는 정보를 입력할 수 없다.
- 삭제 이상 : 어떤 과목의 유일한 학생 투플을 삭제하면 그 과목을 가르치는 강사 정보도 삭제된다.
→ 갱신 이상이 생기는 이유 : 수강 릴레이션이 키가 아닌 애트리뷰트가 다른 애트리뷰트를 결정하기 때문이다. 이 R의 후보 키는 (학번, 과목) or (학번, 강사) → 강사가 과목을 정해버림
BCNF
한 릴레이션 R이 BCNF를 만족할 필요 충분 조건은 릴레이션 R이 제 3정규형을 만족하고, 모든 결정자가 후보키여야 한다.
- 위의 표는 제 3정규형을 만족하지만 강사 애트리뷰트는 후보 키가 아님에도 불구하고 과목 애트리뷰트를 결정하기 때문에 BCNF를 만족하지 않는다.
키가 아니면서 결정자 역할을 하는 애트리뷰트(C)와 그 결정자에 함수적으로 종속하는 애트리뷰트(B)를 하나의 테이블에 넣음. 이 릴레이션에서 결정자(C)는 기본 키가 된다.
역정규화(denormalization)
정규화 단계가 진행될수록 중복이 감소하고 갱신 이상도 감소된다. 하지만 성능상의 관점에서 높은 정규형을 만족하는 릴레이션 스키마가 최적인 것은 아니다. 분해된 릴레이션을 대상으로 질의를 할 때는 같은 정보를 얻기 위해서 보다 많은 릴레이션들을 접근해야 하므로 조인의 필요성이 증가하기 때문이다.
- 데이터베이스 설계자는 요구 사항에 따라 일부를 역정규화하여 데이터 중복 및 갱신 이상을 대가로 치르면서 성능상의 요구를 만족시키기도 한다.
- 많은 데이터베이스에서 검색 질의 >> 갱신 질의 이다. 역정규화는 주어진 응용에서 빈번하게 수행되는 검색 질의들의 수행 속도를 높이기 위해서 이미 분해된 두개 이상의 릴레이션들을 합쳐서 하나의 릴레이션으로 만드는 작업이다.
'Computer Science > Database' 카테고리의 다른 글
[Database] 트랜잭션 (0) | 2023.05.31 |
---|---|
[Database] 데이터베이스 설계와 ER 모델(1) (0) | 2023.04.14 |
[Database] SQL(3) (0) | 2023.04.14 |
[Database]SQL(2) (0) | 2023.04.14 |
[Database] SQL(1) (0) | 2023.04.10 |