정규화(Normalization)는 데이터베이스 디자인을 간소화(단순화)하는 과정입니다. 정규화는 필요한 테이블의 수, 각 테이블이 나타내는 내용, 각 테이블의 필드 수 및 테이블 간 관계에 대한 핵심 질문에 대한 답변을 제공합니다. 또한 정규화는 데이터베이스 디자인에서 중복 및 이상 현상(redundancy and anomalies)을 방지하는 데 도움을 줍니다.
이상 현상(anomalies)은 데이터베이스 테이블에서 레코드를 삽입(Inserting), 업데이트(Updating) 또는 삭제(Deleting)하는 동안 (만약 데이터베이스가 잘못 설계되었을 경우) 발생할 수 있습니다. 예를 들어, 아래 표에 나와 있는 데이터베이스 테이블이 있다면 고객 주소를 변경하기 위해 레코드를 업데이트할 때 고객 레코드가 있는 모든 행을 업데이트해야 합니다. 만약 일부 행을 빼먹게 된다면 데이터 불일치가 발생합니다. 이를 업데이트 이상(update anomaly)이라고 합니다.
Item_ID | Customer_ID | Customer_name | Customer_address |
1 | 921 | Kim | Seoul 123 |
2 | 921 | Kim | Seoul 123 |
3 | 728 | Son | Busan 234 |
만약 고객 마스터 테이블에 없는 고객을 대상으로 레코드를 삽입하려고 하면, 삽입 이상(Insertion anomaly)이 발생합니다. 위 표에서 Item_ID가 3인 Row를 삭제하면, 그 항목에만 Son이라는 고객의 세부 정보가 연결되어 있으므로 Son 고객의 레코드도 함께 삭제됩니다. 이것은 삭제 이상(delete anomaly)이라고 합니다.
정규화는 이러한 이상 현상들을 극복할 수 있게 하고 일관되고 예측 가능한 데이터베이스 모델링을 돕는 프로세스입니다. 정규화는 최적화된 구조(Optimal Structure)를 설계하는 데 도움이 되는 정규형 개념(Normal Forms)을 사용합니다. 사용 가능한 정규형에는 1NF(제 1 정규형), 2NF(제 2 정규형) 및 3NF(제 3 정규형)이 있습니다.
1) First Normal Form(1NF : 제 1 정규형)
제1 정규형(1NF)은 테이블의 필드가 원자 값(atomic values)을 포함해야 한다는 것을 규정합니다. 즉, 각 필드는 단 하나의 값을 포함해야 합니다. 예를 들어, 아래 표의 데이터에서는 Emp_id 2290에 대해 전화번호 필드가 여러 값을 포함하기 때문에 1NF에 부합하지 않습니다.
Emp_id | Emp_name | Phone_num |
2289 | John | 99889988 |
2290 | Mark | ■ 88998899 ■ 99887766 |
위 표를 1차 정규화하기 위해서는, 아래 표처럼 Emp_id가 2290인 데이터에 대해서 새 레코드를 추가해야합니다.
Emp_id | Emp_name | Phone_num |
2289 | John | 99889988 |
2290 | Mark | 88998899 |
2290 | Mark | 99887766 |
2) Second Normal Form(2NF : 제 2 정규형)
제 2 정규형(2NF)를 따르기 위해서는 1NF(제 1 정규형)를 준수해야하며, 테이블의 키 필드이외의 필드들은 모두 Primary key(기본 키) 필드에 완전히 종속되어야 하며 기본 키 필드의 하위 집합에는 종속되어서는 안됩니다.
예를 들어, 아래 표에서 Employee_ID와 Department_ID가 primary key(기본 키)필드임을 가정해 봅시다. 2NF에 따르면 비 기본 필드인 Employee_name과 Department_name은 완전한 기본 키 필드인 Employee_ID와 Department_ID에만 종속되어야하며 기본 키 필드의 하위 집합에는 종속되어서는 안된다는 것입니다.
Employee_ID | Department_ID | Employee_name | Department_name |
1122 | 01 | John | Sales |
1123 | 02 | Mark | Finance |
위 예를 보면 경우에 맞지 않는 것을 알 수 있습니다. 여기서는 Employee_name 필드가 Employee_ID 필드에 의해 식별될 수 있고, Department_name 필드는 Department_ID 필드에 의해 완전히 식별될 수 있습니다. 따라서이 테이블의 기본 키 필드가 아닌 필드들이 테이블의 기본 키 필드의 일부에만 종속되어 있으므로 2NF에서 허용되지 않습니다.
위 표를 2차 정규화를 하기 위해서, 아래 보이는 두 개의 테이블로 나누는 것이 좋습니다. 이렇게 되면 키필드가 아닌 필드들이 모두 키필드에 종속되는 것을 확인할 수 있습니다.
Employee_ID | Department_ID | Employee_name |
1122 | 01 | John |
1123 | 02 | Mark |
Department_ID | Department_name |
01 | Sales |
02 | Finance |
3) Third Normal Form(3NF : 제 3 정규형)
만약 테이블이 2NF에 부합하며 모든 키필드가 아닌 필드가 상호 독립적이면 해당 테이블은 제3 정규형(3NF)에 부합합니다. 예를 들어, 아래 표는 Total 필드가 키 필드가 아닌 Quantity와 Price의 정보에 의존하기 때문에 3NF에 부합하지 않습니다. 이 테이블을 3NF에 부합하도록 만들기 위해서는 Total 필드를 테이블에서 제거하고 쿼리나 보고서에서 계산을 처리하는 것이 가장 좋습니다. 이렇게 하면 테이블의 하나의 필드를 업데이트하는 경우에도 이상 현상이 발생하지 않도록 보장할 수 있습니다.
Item_id | Quantity | Price | Total |
1 | 10 | 10 | 100 |
2 | 20 | 15 | 300 |
각각의 높은 정규화 형식은 그 이하의 모든 정규화 형식을 포함하는 슈퍼셋입니다. 예를 들어, 3NF에 디자인한다면, 이는 기본적으로 1NF와 2NF에도 따르는 것입니다. 정규화는 최적의 데이터베이스 디자인을 달성하는 데 도움이 됩니다. 좋은 데이터베이스 디자인은 시간, 노력 및 비즈니스 요구 사항에 대한 좋은 이해력이 필요합니다. 좋은 디자인은 응용 프로그램을 효율적으로 만드는 것뿐만 아니라, 나중에 머리 아픈 문제를 예방하는 데도 도움이 됩니다.
'ABAP 프로그래밍 개념 > OPEN SQL' 카테고리의 다른 글
4. Selecting Data from Multiple Tables (0) | 2023.05.04 |
---|---|
3. Selecting Data from Database Tables (0) | 2023.05.04 |
2.4 Relationship (2) | 2023.05.03 |
2.3 Foreign Keys and Domains (0) | 2023.05.03 |
2.2 Tables and Keys (0) | 2023.05.02 |