SQL 정규화: 1NF, 2NF, 3NF 및 BCNF
게시 됨: 2021-03-12정규화는 관계형 데이터베이스 모델이 효율적이고 범용 쿼리에 적합하며 삽입, 업데이트 및 삭제 이상과 같은 바람직하지 않은 특성이 없는지 확인하는 체계적인 프로세스로, 이로 인해 데이터 무결성이 손실됩니다. 또한 이 정규화 프로세스는 데이터 중복을 제거하고 삽입, 업데이트 또는 삭제 작업 후 불일치 가능성을 줄이는 데 도움이 됩니다.
더 나은 이해를 위해 다음 스키마를 고려하십시오. 학생 (이름, 주소, 주제, 학년)
이 스키마에는 몇 가지 문제 또는 비효율성이 있습니다.
1) 중복성 : 학생이 등록한 각 과목에 대해 학생의 주소가 반복됩니다.
2) 변칙 업데이트 : 한 튜플(행)의 주소는 업데이트하고 다른 행은 변경되지 않은 상태로 둘 수 있습니다. 따라서 우리는 각 학생에 대해 일관되게 고유한 주소를 갖지 않을 것입니다.
3) 삽입 이상 : 하나 이상의 과목을 등록하지 않으면 학생의 주소를 기록하지 않습니다. 유사하게, 학생이 새로운 과목을 등록하기를 원할 때, 다른 주소가 삽입될 가능성이 있습니다.
4) 삭제 이상 : 학생이 등록된 모든 과목을 중단하기로 결정한 경우 삭제 과정에서 학생의 주소도 함께 손실됩니다.
따라서 사용자 데이터를 튜플 추가, 삭제 또는 업데이트 작업 이후에 이상을 생성하지 않는 관계로 표현하는 것이 중요합니다. 이는 무결성 제약 조건, 특히 데이터베이스의 데이터 종속성을 주의 깊게 분석해야만 달성할 수 있습니다.
관계는 자연스럽게 함께 존재하는 속성만 그룹화되도록 설계되어야 합니다. 이것은 대부분 모든 데이터 속성의 의미에 대한 기본적인 이해를 통해 수행할 수 있습니다. 그러나 설계 목표를 보장하기 위해서는 여전히 공식적인 조치가 필요합니다.
정규화는 그 공식적인 측정입니다. 특정 속성 그룹이 다른 속성 그룹보다 더 나은 이유에 대한 질문에 답합니다.
현재까지 7개의 정규형이 존재합니다.
- 제1정규형(1NF)
- 제2정규형(2NF)
- 제3정규형(3NF)
- Boyce-Codd 정규형(BCNF)
- 제4정규형(4NF)
- 제5정규형(5NF)
- 여섯 번째 또는 도메인 키 정규형(6NF)
읽기: SQL의 보기 유형
목차
제1정규형(1NF 또는 최소형)
- 행에는 위에서 아래로 정렬되고 열에는 왼쪽에서 오른쪽으로 정렬되지 않습니다.
- 중복 행이 없습니다.
- 모든 행과 열 교차에는 해당 도메인 또는 null 값에서 정확히 하나의 값이 포함됩니다. 이 조건은 모든 열 값이 원자성, 스칼라이거나 단일 값만 보유해야 함을 나타냅니다. 여기에서는 여러 열의 정보 또는 값을 반복할 수 없습니다.
- 모든 열은 규칙적입니다(즉, 행에는 행 ID, 개체 ID 또는 숨겨진 타임스탬프와 같은 숨겨진 구성 요소가 없습니다).
정규화되지 않은 스키마의 예를 들어보겠습니다. 디자이너가 고객의 이름과 전화번호를 기록하기를 원한다고 가정합니다. 다음과 같이 고객 테이블을 정의합니다.
고객 ID | 이름 _ | 성 | 전화 번호 |
123 | 비말 | 사하 | 555-861-2025 |
456 | 카필 | 칸나 | 555-403-1659, 555-776-4100 |
789 | 카비타 | 로이 | 555-808-9633 |
여기서는 1NF가 아닙니다. 전화 번호 열은 원자가 아니거나 스칼라 값이 없습니다. 즉, 1NF에서 허용되지 않는 둘 이상의 값이 있습니다.
그것을 1 NF로 만들기 위해
- 먼저 단일 테이블을 두 개로 나눕니다(분해).
- 각 테이블에는 하나의 엔터티에 대한 정보만 있어야 합니다.
고객 ID | 이름 _ | 성 |
123 | 비말 | 사하 |
456 | 카필 | 칸나 |
789 | 카비타 | 로이 |
고객 ID | 전화 번호 |
123 | 555-861-2025 |
456 | 555-403-1659 |
456 | 555-776-4100 |
789 | 555-808-9633 |
이 디자인에서는 반복되는 전화 번호 그룹이 발생하지 않습니다. 대신, 각 Customer-to-Telephone Number 링크가 자체 레코드에 나타납니다.
체크아웃: 가장 일반적인 SQL 인터뷰 질문 및 답변
제2정규형
각 일반 형식에는 이전 형식보다 더 많은 제약 조건이 있습니다. 따라서 두 번째 정규형(2NF) 이상인 테이블은 정의에 따라 1NF에도 포함됩니다. 반면에 1NF에 있는 테이블은 2NF에 있을 수도 있고 아닐 수도 있습니다. 2NF에 있으면 3NF에 있을 수도 있고 아닐 수도 있습니다.
1NF 테이블은 비 프라임 속성이 후보 키의 일부(적절한 하위 집합)에 기능적으로 종속 되지 않는 경우에만 2NF에 있다고 합니다. (비프라임 속성은 어떤 후보 키에도 속하지 않습니다.)
1NF 테이블에 복합 후보 키(둘 이상의 속성으로 구성된 후보 키)가 없는 경우 테이블은 자동으로 2NF에 있습니다.
Relation R(A, B, C, D, E)과 FD가 { BC ? 디, AC ? 비, 비? E }는 2NF에 있습니까?
- 보시다시피 AC의 폐쇄는 멤버십 알고리즘을 적용하여 (AC)+ = {A, C, B, E, D}입니다. 그러나 하위 집합 중 어느 것도 관계의 모든 속성을 스스로 결정할 수 없으므로 AC가 이 관계의 후보 키입니다. 또한 A와 C는 관계의 다른 속성에서 파생될 수 없으므로 {AC}인 1개의 후보 키만 있습니다.
- 여기서 {A, C}는 프라임 속성이고 {B, D, E}는 비 프라임 속성입니다.
- 1NF의 관계형 DBMS는 다중값 또는 복합 속성을 허용하지 않기 때문에 관계 R은 이미 1차 정규식입니다.
BC ? BC는 후보 키 AC의 적절한 부분집합이 아니기 때문에 D는 제2정규형이고,
AC? BE는 AC 자체가 후보 키이므로 제2정규형이며,
ㄴ? E는 제2정규형이고 B는 후보 키 AC의 적절한 부분집합이 아닙니다.
따라서 주어진 관계 R은 2차 정규형입니다.
제3정규형
테이블은 각각의 기능적 종속성에 대한 경우에만 3NF에 있다고 합니다.
X → A , 다음 조건 중 하나 이상이 유지됩니다.
- X가 A를 포함하거나(즉, X → A는 사소한 기능 종속성임), 또는
- X는 슈퍼 키이거나
- A는 주요 속성입니다(즉, A는 후보 키 내에 존재)
3NF의 또 다른 정의는 R의 키가 아닌 모든 속성이 R의 기본 키에 비전이적으로 종속 (즉, 직접 종속)된다는 것입니다. 이는 비 프라임 속성(후보 키의 일부가 아님)이 다른 비 프라임 속성에 기능적으로 종속되지 않음을 의미합니다. A ? B와 BC, 그런 다음 이러한 FD에서 A ? C. 이 종속성 AC는 전이적입니다.
3NF의 예:
주어진 FD 세트와 다음 관계 Order(Order#, Part, Supplier, UnitPrice, QtyOrdered)를 고려하십시오.
주문하다# ? 부품, 공급업체, QtyOrdered 및 공급업체, 부품 ? 단가)
여기서 Order#은 관계의 핵심입니다.
Amstrong의 공리를 사용하여 다음을 얻습니다.
주문하다# ? 부품, 주문? 공급자 및 주문 ? 수량 주문.
주문하다# ? 부품, 공급업체 및 공급업체, 부품 ? 단가, 둘 다 주문 번호를 제공합니까? 단가.
따라서 프라임이 아닌 모든 속성이 키(Order#)에 종속되어 있음을 알 수 있습니다. 그러나 Order#과 UnitPrice 사이에는 전이 종속성이 있습니다. 따라서 이 관계는 3NF에 없습니다. 3NF에서 어떻게 만들까요?
누군가가 해당 부품을 주문하지 않는 한 공급업체가 제공한 부품의 단가를 저장할 수 없습니다. 따라서 다음과 같이 3NF를 따르도록 테이블을 분해해야 합니다.
주문 (주문 번호, 부품, 공급업체, 수량 주문) 및 가격 마스터 (부품, 공급업체, 단가).
이제 전이 종속성이 없습니다. 관계는 3NF에 있습니다.
읽어보기: 데이터 과학용 SQL
세계 최고의 대학에서 온라인으로 소프트웨어 과정을 배우십시오 . 이그 제 큐 티브 PG 프로그램, 고급 인증 프로그램 또는 석사 프로그램을 획득하여 경력을 빠르게 추적하십시오.
결론
BCNF, 4NF, 5NF 및 6NF와 같은 정규화에는 더 많은 것이 있습니다. 요컨대 BCNF는 3NF의 마지막 규칙이 여기에 적용되지 않기 때문에 3NF의 확장일 뿐입니다. 모든 기능적 종속성은 왼쪽에 키 속성이 있어야 하고 오른쪽에는 없어야 합니다. (BCNF는 3.5NF라고도 함). 그러나 4NF 이상의 일반 형식은 정규 실습에서 거의 구현되지 않습니다.
전체 스택 개발에 대해 자세히 알아보려면 upGrad & IIIT-B의 전체 스택 소프트웨어 개발 이그 제 큐 티브 PG 프로그램을 확인하십시오. 이 프로그램은 일하는 전문가를 위해 설계되었으며 500시간 이상의 엄격한 교육, 9개 이상의 프로젝트, 및 과제, IIIT-B 동문 자격, 실질적인 실습 캡스톤 프로젝트 및 최고의 기업과의 취업 지원.
데이터베이스 정규화란 무엇입니까?
다른 유형의 정상 형태는 무엇입니까?
정규형은 관계형 데이터베이스의 아버지인 Edgar F. Codd에 의해 개발되었습니다. 각 정규형은 관계형 모델의 전반적인 논리적 정확성의 수준이며 실제 데이터베이스 설계에 목적을 제공합니다. 첫 번째 정규 형식인 1NF는 테이블 디자인에 관한 것이며 중복을 제거하고 모든 데이터 조각이 테이블에서 한 번만 표시되도록 하는 것을 포함합니다. 두 번째 정규 형식은 복제 가능한 열에 관한 것입니다. 열을 여러 테이블로 나누는 것입니다. 세 번째 정규 형식은 그룹을 반복하는 것입니다. 그룹을 여러 테이블로 나누는 것입니다. 네 번째 정규 형식은 약 1NF, 2NF 및 3NF이며 테이블에 논리적 또는 비정규화가 없는지 확인합니다.
데이터베이스를 정규화하는 방법은 무엇입니까?
데이터베이스 정규화는 데이터베이스를 가장 작은 수의 테이블로 나누는 프로세스입니다. 결국 데이터베이스에는 반복 필드와 부분 정보가 있는 행이 없습니다. 목적은 모든 데이터가 다른 모든 관련 데이터에 연결되도록 하고 한 레코드에서 변경이 발생하면 이와 관련된 다른 모든 레코드도 변경되도록 하는 것입니다.