정규화 설명
정규화는 데이터베이스의 데이터를 구성하는 프로세스이다. 이 프로세스에는 중복성 및 일치하지 않는 종속성을 제거하여 데이터베이스의 유연성을 높이는 동시에 데이터를 보호하도록 설계된 규칙에 따라 테이블을 만들고 해당 테이블 간의 관계를 설정하는 작업이 포함됩니다.
데이터가 중복되면 디스크 공간이 낭비되며 유지 관리상의 문제가 발생하게된다. 여러 위치에 있는 데이터를 변경해야 하는 경우에는 모든 위치에서 데이터를 정확히 동일한 방식으로 변경해야 한다.
고객 주소 데이터가 Customers 테이블에만 저장되어 있고 데이터베이스의 다른 위치에는 없다면 고객 주소 변경을 구현하기가 훨씬 쉬워질 것입니다. 그렇다면 "일치하지 않는 종속성"이란 무엇일까? 특정 고객의 주소를 찾으려는 사용자는 자연스럽게 Customers 테이블을 확인하지만 해당 고객에게 전화를 거는 직원의 급여를 이 테이블에서 확인하는 것은 적절하지 않을 수 있다. 직원의 급여는 직원에 관련/종속되므로 Employees 테이블로 이동해야 한다. 일치하지 않는 종속성이 있는 경우 데이터를 찾을 수 있는 경로가 없거나 끊겨 있을 수 있으므로 데이터를 찾기가 어려울 수 있다.
데이터베이스 정규화에는 몇 가지 규칙이 적용됩니다. 각 규칙을 "일반 양식"이라고 한다. 첫 번째 규칙이 관찰되면 데이터베이스는 "첫 번째 정상 형식"이라고 합니다. 처음 세 개의 규칙이 관찰되면 데이터베이스는 "세 번째 일반 형식"으로 간주된다. 다른 수준의 정규화가 가능하지만, 세 번째 정규식은 대부분의 애플리케이션에 필요한 가장 높은 수준으로 간주된다.
대부분의 공식 규칙 및 사양과 마찬가지로 이 형식도 실제 시나리오에서 항상 완벽하게 준수할 수는 없다. 일반적으로는 정규화를 수행하려면 테이블이 추가로 필요한데, 이러한 테이블 추가 작업을 번거로워하는 사람들도 있다. 정규화의 처음 3개 규칙 중 하나를 위반해야 할 때는 중복 데이터, 일치하지 않는 종속성 등 응용 프로그램에서 발생 가능한 문제를 예측해야 한다.
아래 설명에 관련 예제가 포함되어 있다.
첫 번째 정규 형식
- 개별 테이블에서 반복되는 그룹을 제거한다.
- 각 관련 데이터 집합에 대해 별도의 테이블을 만든다.
- 기본 키를 사용하여 각 관련 데이터 집합을 식별한다.
단일 테이블의 여러 필드를 사용하여 유사한 데이터를 저장하지 말자 예를 들어 가능한 두 원본에서 제공되었을 수 있는 인벤토리 항목을 추적하려는 경우 인벤토리 레코드에 공급업체 코드 1 및 공급업체 코드 2 필드를 포함할 수 있다.
이때 세 번째 공급업체를 초과하면 어떻게 될까? 단순히 필드를 추가해서는 안 되며, 프로그램 및 테이블을 수정해야 합니다. 공급업체 수를 동적으로 설정하기는 어렵기 때문이다. 대신 모든 공급업체 정보를 별도의 Vendors 테이블에 저장하고 항목 번호 키를 사용하여 인벤토리를 공급업체에 연결하거나 공급업체 코드 키를 사용하여 공급업체를 인벤토리에 연결한다.
두 번째 정규 형식
- 여러 레코드에 적용되는 값 집합에 대해 별도의 테이블을 만든다.
- 외래 키를 사용하여 이러한 테이블 간의 관계를 설정한다.
레코드는 테이블의 기본 키(필요한 경우 복합 키) 외의 어떤 항목에도 종속되어서는 안된다. 회계 시스템의 고객 주소를 예로 들어 보자 이 주소는 Customers 테이블뿐 아니라 Orders, Shipping, Invoices, Accounts Receivable, Collections 테이블에도 필요하는데 이 경우 고객 주소를 이러한 각 테이블에 별도의 항목으로 저장하는 대신 한 곳(Customers 테이블 또는 별도의 Addresses 테이블)에 저장한다.
세 번째 정규 형식
- 키에 종속되지 않는 필드를 제거한다.
레코드 내에서 해당 레코드 키의 일부분이 아닌 값은 테이블에 속하지 않는다. 일반적으로는 필드 그룹의 내용이 테이블의 단일 레코드에 적용될 수 있는 경우 항상 해당 필드를 별도의 테이블에 배치하는 것이 좋다.
예를 들어 Employee Recruitment 테이블에 입사 지원자의 대학 이름과 주소가 포함되어 있을 수 있다. 하지만 그룹에 메일을 보내려면 전체 대학 목록이 필요하다. 대학 정보가 Candidates 테이블에 저장되어 있는 경우 현재 입사 지원자를 포함하지 않고 대학 목록만 생성할 수 있는 방법은 없다. 이 경우에는 별도의 Universities 테이블을 만든 후 대학 코드 키를 사용하여 Candidates 테이블과 연결한다.
예외: 이론적으로는 세 번째 정규 형식을 따르는 것이 좋지만, 실제로 항상 해당 형식을 따를 수 있는 것은 아니다. 예를 들어 Customers 테이블에서 발생 가능한 모든 필드 간 종속성을 제거하려는 경우에는 도시, 우편 번호, 영업 사원, 고객 등급 및 여러 레코드에서 중복될 수 있는 기타 모든 요소에 대해 별도의 테이블을 만들어야 하지만 이론적으로는 정규화를 수행하는 것이 좋다. 그러나 대부분의 작은 테이블에서는 정규화를 수행하면 성능이 저하되거나 열린 파일 및 메모리 용량이 초과될 수 있다.
자주 변경되는 데이터에만 세 번째 정규 형식을 적용하는 것이 보다 적절할 수 있다. 일부 종속 필드가 남아 있는 경우 변경되는 필드가 있으면 사용자가 모든 관련 필드를 확인해야 하도록 응용 프로그램을 디자인하면 되겠다.
기타 정규화 형식
BCNF(Boyce Codd Normal Form)라고도 하는 네 번째 정규화 형식과 다섯 번째 정규화 형식은 있기는 하지만 실제 디자인에서 고려되는 경우는 거의 없다. 이러한 규칙을 무시하는 경우 데이터베이스 디자인이 완벽하지는 않을 수 있지만 기능적으로는 아무런 영향이 없다.
예제 테이블 정규화
아래 단계에서는 가상의 학생 테이블을 정규화하는 프로세스를 보여 준다.
정규화되지 않은 테이블:
학생 번호 | 학생이름 | 기숙사 방 번호 | 강의1 | 강의2 | 강의3 |
1022 | 민혁 | 412 | 수학 | 국어 | 과학 |
4123 | 민우 | 216 | 수학 | 국어 | 음악 |
1.첫 번째 일반 양식: 반복 그룹 없음
테이블에는 차원이 두 개만 있어야 한다. 한 학생의 강의가 여러 개이므로 이러한 강의를 별도의 테이블에 나열해야 한다.
위 레코드의 강의1, 강의2, 강의3 필드로 인해 디자인상의 문제가 발생하게 된다.
스프레드시트는 세 번째 차원을 사용하는 경우가 많지만 테이블은 세 번째 차원을 사용하면 안된다. 이 문제를 파악하는 또 다른 방법은 일대다 관계를 사용하는 것이다. 이때 "일" 쪽과 "다" 쪽을 같은 테이블에 포함해서는 안된다. 대신 아래에 나와 있는 것처럼 반복 그룹(강의) 을 제거하여 첫 번째 정규 형식으로 다른 테이블을 만든다.
학생 번호 | 학생이름 | 기숙사 방 번호 | 강의 |
1022 | 민혁 | 412 | 수학 |
1022 | 민혁 | 412 | 국어 |
1022 | 민혁 | 412 | 과학 |
4123 | 민우 | 216 | 수학 |
4123 | 민우 | 216 | 국어 |
4123 | 민우 | 216 | 음악 |
2.두 번째 일반 양식: 중복 데이터 제거
위 테이블에는 각 학생 번호 값에 대해 강의 과목 값이 여러 개 포함되어 있다. 강의 과목은 학생 번호(기본 키)에 기능적으로 종속되지 않으므로 이 관계는 두 번째 정규 형식에 포함되지 않다.
다음 테이블은 두 번째 정규 형식을 보여 준다.
Student:
학생 번호 | 학생 이름 | 기숙사 방 번호 |
1022 | 민혁 | 412 |
4123 | 민우 | 216 |
Registration:
학생 번호 | 강의 |
1022 | 수학 |
1022 | 국어 |
1022 | 과학 |
4123 | 수학 |
4123 | 국어 |
4123 | 음악 |
3.세 번째 정규 형식: 키에 의존하지 않는 데이터 제거
마지막 예제에서는 기숙사 방 번호가 학생 이름 특성에 기능적으로 종속된다. 따라서 아래에 나와 있는 것처럼 해당 특성을 Students 테이블에서 Faculty 테이블로 이동해야 한다.
Student:
학생 번호 | 학생 이름 |
1022 | 민혁 |
4123 | 민우 |
Faculty:
학생 이름 | 기숙사 방 번호 |
민혁 | 412 |
민우 | 216 |
기술 출처
데이터베이스 정규화 설명 - Office
데이터베이스를 정규화하는 방법과, 형식을 정규화하는 대신 사용할 수 있는 여러 가지 방법을 설명합니다. 데이터베이스 원칙을 이해하려면 데이터베이스 원칙을 마스터하거나 문서에 나와
learn.microsoft.com
'DevOps > CS' 카테고리의 다른 글
[DevOps] 소켓과 포트의 특징, HTTP버전별 특징 (0) | 2022.12.28 |
---|---|
[DevOps] HTTP가 뭐길래 (0) | 2022.12.07 |
[DevOps] DNS 너 어떻게 작동하는건데!!! (0) | 2022.12.06 |
[DevOps] DevOps가 뭔지알아??? 내가알려줄게 (2) | 2022.11.29 |
[DevOps] SaaS??? 너 누구야!!! (1) | 2022.11.28 |