database normalization tutorial
이 자습서에서는 SQL 코드 예제를 사용하여 데이터베이스 정규화 및 1NF 2NF 3NF 및 BCNF와 같은 다양한 정규 형식에 대해 설명합니다.
데이터베이스 정규화는 데이터베이스 스키마를 디자인하는 데 사용되는 잘 알려진 기술입니다.
정규화 기술을 적용하는 주된 목적은 데이터의 중복성과 종속성을 줄이는 것입니다. 정규화는 이러한 테이블 간의 논리적 관계를 정의하여 큰 테이블을 여러 개의 작은 테이블로 분할하는 데 도움이됩니다.
학습 내용 :
데이터베이스 정규화 란?
데이터베이스 정규화 또는 SQL 정규화는 관련 데이터를 하나의 단일 테이블로 그룹화하는 데 도움이됩니다. 기여 데이터 또는 간접적으로 관련된 데이터는 다른 테이블에 배치되며 이러한 테이블은 상위 테이블과 하위 테이블 간의 논리적 관계로 연결됩니다.
1970 년 Edgar F. Codd는 정규화의 개념을 생각해 냈습니다. 그는 '대규모 공유 은행을위한 데이터의 관계형 모델'이라는 논문을 공유하고 'First Normal Form (1NF)'을 제안했습니다.
DBMS 정규화의 장점
데이터베이스 정규화는 다음과 같은 기본 이점을 제공합니다.
- 정규화는 데이터를 한 곳에만 저장하여 데이터의 이중성을 방지하므로 데이터 일관성을 높입니다.
- 정규화는 같은 스키마에서 유사하거나 관련된 데이터를 그룹화하는 데 도움이되므로 데이터를 더 잘 그룹화 할 수 있습니다.
- 정규화는 인덱스를 더 빠르게 생성 할 수 있으므로 검색 속도를 향상시킵니다. 따라서 정규화 된 데이터베이스 또는 테이블이 OLTP (Online Transaction Processing)에 사용됩니다.
데이터베이스 정규화의 단점
DBMS 정규화에는 다음과 같은 단점이 있습니다.
- 예를 들어 한 곳에서 제품 또는 직원에 대한 관련 데이터를 찾을 수 없으며 둘 이상의 테이블을 조인해야합니다. 이로 인해 데이터 검색이 지연됩니다.
- 따라서 정규화는 OLAP 트랜잭션 (온라인 분석 처리)에서 좋은 옵션이 아닙니다.
계속 진행하기 전에 다음 용어를 이해하겠습니다.
- 실재: 엔터티는 이러한 개체와 관련된 데이터가 테이블에 저장되는 실제 개체입니다. 이러한 개체의 예로는 직원, 부서, 학생 등이 있습니다.
- 속성 : 속성은 엔티티에 대한 정보를 제공하는 엔티티의 특성입니다. 예를 들어, 테이블이 엔티티 인 경우 열은 해당 속성입니다.
일반 형태의 유형
# 1) 1NF (첫 번째 정규형)
정의에 따라 반복 열이나 데이터 그룹이없는 엔티티를 첫 번째 정규형이라고 할 수 있습니다. First Normal Form에서 모든 열은 고유합니다.
다음은 첫 번째 정규 형식 (1NF) 인 경우 직원 및 부서 테이블의 모습입니다.
empNum | lastName | 이름 | deptName | deptCity | deptCountry |
---|---|---|---|---|---|
1001 | 앤드류스 | 잭 | 계정 | 뉴욕 | 미국 |
1002 | Schwatz | 마이크 | 과학 기술 | 뉴욕 | 미국 |
1009 | 컵 | 괴롭히다 | HR | 베를린 | 독일 |
1007 | Harvey | 파커 | 관리자 | 런던 | 영국 |
1007 | Harvey | 파커 | HR | 런던 | 영국 |
여기에서는 Employees 및 Department 테이블의 모든 열이 하나로 묶여 있으며 모든 데이터를 한곳에서 사용할 수 있으므로 deptNum과 같은 열을 연결할 필요가 없습니다.
그러나 필요한 모든 열이 포함 된 이와 같은 테이블은 관리가 어려울뿐만 아니라 작업을 수행하기도 어렵고 스토리지 관점에서 비효율적입니다.
# 2) 2NF (Second Normal Form)
정의에 따라 1NF이고 해당 속성 중 하나 인 엔티티가 기본 키로 정의되고 나머지 속성은 기본 키에 종속됩니다.
다음은 직원 및 부서 테이블이 어떻게 보이는지에 대한 예입니다.
직원 테이블 :
empNum | lastName | 이름 |
---|---|---|
1001 | 앤드류스 | 잭 |
1002 | Schwatz | 마이크 |
1009 | 컵 | 괴롭히다 |
1007 | Harvey | 파커 |
1007 | Harvey | 파커 |
부서 테이블 :
deptNum | deptName | deptCity | deptCountry |
---|---|---|---|
1 | 계정 | 뉴욕 | 미국 |
두 | 과학 기술 | 뉴욕 | 미국 |
삼 | HR | 베를린 | 독일 |
4 | 관리자 | 런던 | 영국 |
EmpDept 테이블 :
empDeptID | empNum | deptNum |
---|---|---|
1 | 1001 | 1 |
두 | 1002 | 두 |
삼 | 1009 | 삼 |
4 | 1007 | 4 |
5 | 1007 | 삼 |
여기서 우리는 1NF 형식의 테이블을 세 개의 다른 테이블로 분할 한 것을 볼 수 있습니다. Employees 테이블은 회사의 모든 직원에 대한 엔터티이며 해당 속성은 각 직원의 속성을 설명합니다. 이 테이블의 기본 키는 empNum입니다.
마찬가지로 Departments 테이블은 회사의 모든 부서에 대한 엔터티이며 해당 속성은 각 부서의 속성을 설명합니다. 이 테이블의 기본 키는 deptNum입니다.
세 번째 테이블에서는 두 테이블의 기본 키를 결합했습니다. 이 세 번째 테이블에서는 Employees 및 Departments 테이블의 기본 키를 외래 키라고합니다.
사용자가 1NF에있는 것과 유사한 출력을 원하면 사용자는 기본 키를 사용하여 세 테이블을 모두 조인해야합니다.
샘플 쿼리는 다음과 같습니다.
SELECT empNum, lastName, firstName, deptNum, deptName, deptCity, deptCountry FROM Employees A, Departments B, EmpDept C WHERE A.empNum = C.empNum AND B.deptNum = C.deptNum WITH UR;
# 3) 3NF (제 3 정규형)
정의에 따라 테이블 / 엔티티가 이미 두 번째 정규 형식이고 테이블 / 엔티티의 열이 기본 키에 전 이적으로 종속되지 않는 경우 테이블은 세 번째 정규 형식으로 간주됩니다.
다음 예제를 통해 비전 이적 종속성을 이해해 보겠습니다.
Customer라는 테이블에 아래 열이 있습니다.
고객 ID – 고유 한 고객을 식별하는 기본 키
CustomerZIP – 고객이 거주하는 지역의 우편 번호
CustomerCity – 고객이 거주하는 도시
위의 경우 CustomerCity 열은 CustomerZIP 열에 종속되고 CustomerZIP 열은 CustomerID에 종속됩니다.
위의 시나리오를 CustomerID 즉, 기본 키에 대한 CustomerCity 열의 전이 종속성이라고합니다. 전 이적 종속성을 이해했으면 이제이 종속성의 문제를 논의 해 보겠습니다.
CustomerCity를 업데이트하지 않고 CustomerZIP을 다른 도시의 우편 번호로 업데이트하기 위해 테이블에 원치 않는 업데이트가 수행되어 데이터베이스가 일관되지 않은 상태가되는 시나리오가있을 수 있습니다.
이 문제를 해결하려면 두 개의 열, 즉 CustomerZIP (기본 키로) 및 CustomerCity를 보유하는 CustZIP 테이블과 같은 다른 테이블을 생성하여 수행 할 수있는 전이 종속성을 제거해야합니다.
Customer 테이블의 CustomerZIP 열은 CustZIP 테이블의 CustomerZIP에 대한 외래 키입니다. 이 관계는 CustomerCity를 변경하지 않고 CustomerZIP이 업데이트되는 업데이트에 이상이 없음을 보장합니다.
# 4) Boyce-Codd 일반형 (3.5 일반형)
정의에 따라 테이블은 Boyce-Codd Normal Form으로 간주됩니다. 이미 Third Normal Form에 있고 A와 B 사이의 모든 기능적 종속성에 대해 A는 수퍼 키 여야합니다.
이 정의는 약간 복잡하게 들립니다. 더 잘 이해하기 위해 그것을 깨도록 노력합시다.
- 기능적 종속성 : 테이블의 속성 또는 열은 테이블의 속성 또는 열이 동일한 테이블의 다른 속성 또는 열을 고유하게 식별 할 때 기능적으로 종속적이라고합니다.
예를 들어, empNum 또는 Employee Number 열은 Employee 테이블에서 Employee Name, Employee Salary 등과 같은 다른 열을 고유하게 식별합니다. - 슈퍼 키 : 테이블의 단일 행을 고유하게 식별 할 수있는 단일 키 또는 여러 키 그룹을 수퍼 키라고 할 수 있습니다. 일반적으로 복합 키와 같은 키를 알고 있습니다.
Third Normal Form에 문제가있을 때와 Boyce-Codd Normal Form이 어떻게 구출되는지 이해하기 위해 다음 시나리오를 고려해 보겠습니다.
empNum | 이름 | empCity | deptName | deptHead |
---|---|---|---|---|
1001 | 잭 | 뉴욕 | 계정 | 레이몬드 |
1001 | 잭 | 뉴욕 | 과학 기술 | Donald |
1002 | 괴롭히다 | 베를린 | 계정 | 익과 |
1007 | 파커 | 런던 | HR | 엘리자베스 |
1007 | 파커 | 런던 | 하부 구조 | 톰 |
위의 예에서 empNum 1001 및 1007을 가진 직원은 서로 다른 두 부서에서 근무합니다. 각 부서에는 부서장이 있습니다. 각 부서에 여러 부서장이있을 수 있습니다. 회계 부서와 마찬가지로 Raymond와 Samara는 두 부서의 책임자입니다.
이 경우 empNum 및 deptName은 수퍼 키이며 이는 deptName이 프라임 속성임을 의미합니다. 이 두 열을 기반으로 모든 단일 행을 고유하게 식별 할 수 있습니다.
또한 deptName은 deptHead에 종속되며 이는 deptHead가 프라임이 아닌 속성임을 의미합니다. 이 기준은 테이블이 BCNF의 일부가되는 자격을 상실합니다.
이를 해결하기 위해 아래에 언급 된대로 테이블을 세 개의 다른 테이블로 나눌 것입니다.
직원 테이블 :
empNum | 이름 | empCity | deptNum |
---|---|---|---|
1001 | 잭 | 뉴욕 | D1 |
1001 | 잭 | 뉴욕 | D2 |
1002 | 괴롭히다 | 베를린 | D1 |
1007 | 파커 | 런던 | D3 |
1007 | 파커 | 런던 | D4 |
부서 테이블 :
deptNum | deptName | deptHead |
---|---|---|
D1 | 계정 | 레이몬드 |
D2 | 과학 기술 | Donald |
D1 | 계정 | 익과 |
D3 | HR | 엘리자베스 |
D4 | 하부 구조 | 톰 |
# 5) 네 번째 정규형 (4 정규형)
정의에 따라 테이블은 관련 엔터티를 설명하는 두 개 이상의 독립 데이터가없는 경우 네 번째 정규 형식입니다.
# 6) 다섯 번째 정규형 (5 정규형)
테이블은 제 4 정규형의 조건을 만족하는 경우에만 제 5 정규형으로 간주 할 수 있으며 데이터 손실없이 여러 테이블로 나눌 수 있습니다.
자주 묻는 질문과 답변
Q # 1) 데이터베이스의 정규화 란 무엇입니까?
대답: 데이터베이스 정규화는 디자인 기술입니다. 이를 사용하여 데이터를 더 작고 관련성이 높은 테이블로 분할하여 중복 데이터와 데이터 종속성을 줄이기 위해 데이터베이스에서 스키마를 설계하거나 재 설계 할 수 있습니다.
Q # 2) 정규화에는 어떤 유형이 있습니까?
대답: 다음은 데이터베이스 스키마를 디자인하는 데 사용할 수있는 다양한 유형의 정규화 기술입니다.
- 첫 번째 정규형 (1NF)
- 두 번째 정규형 (2NF)
- 세 번째 정규형 (3NF)
- Boyce-Codd 정규형 (3.5NF)
- 네 번째 정규형 (4NF)
- 다섯 번째 정규형 (5NF)
Q # 3) 정규화의 목적은 무엇입니까?
대답: 정규화의 주요 목적은 데이터 중복성을 줄이는 것입니다. 즉, 데이터는 한 번만 저장해야합니다. 이는 동일한 데이터를 두 개의 다른 테이블에 저장하려고하지만 변경 사항이 하나에 만 적용되고 다른 테이블에는 적용되지 않을 때 발생할 수있는 데이터 이상을 방지하기위한 것입니다.
Q # 4) 비정규 화란 무엇입니까?
닷넷 인터뷰 질문과 경험이 풍부한
대답: 비정규 화는 데이터베이스의 성능을 높이는 기술입니다. 이 기술은 데이터의 중복을 제거하는 정규화 된 데이터베이스와 달리 중복 데이터를 데이터베이스에 추가합니다.
이것은 여러 테이블에서 데이터를 가져 오기 위해 JOIN을 실행하는 것이 비용이 많이 드는 거대한 데이터베이스에서 수행됩니다. 따라서 JOIN 작업을 방지하기 위해 중복 데이터가 여러 테이블에 저장됩니다.
결론
지금까지 우리는 모두 세 가지 데이터베이스 정규화 형식을 거쳤습니다.
이론적으로 Boyce-Codd Normal Form, 4NF, 5NF와 같은 더 높은 형태의 데이터베이스 정규화가 있습니다. 그러나 3NF는 프로덕션 데이터베이스에서 널리 사용되는 정규화 형식입니다.
행복한 독서 !!
추천 도서
- JMeter를 사용한 데이터베이스 테스트
- MongoDB 데이터베이스 백업 생성
- MongoDB 데이터베이스 만들기 자습서
- 복잡한 데이터 모델을 구축하기위한 10 가지 데이터베이스 설계 도구
- MongoDB 성능 : 잠금 성능, 페이지 오류 및 데이터베이스 프로파일 링
- Altibase 오픈 소스 관계형 데이터베이스 검토
- 쿼리 및 성능 모니터링을위한 MongoDB 데이터베이스 프로파일 러
- Oracle 데이터베이스를 테스트하는 방법