도당탕탕

Effective-SQL Better-Way-2 : 중복으로 저장된 데이터 항목을 제거하자 본문

Database

Effective-SQL Better-Way-2 : 중복으로 저장된 데이터 항목을 제거하자

backlo 2020. 9. 1. 02:39

데이터를 중복으로 저장하면 일관되지 않은 데이터, 비정상적인 삽입, 갱신, 삭제 처리, 디스크 공간 낭비 등 많은 문제를 일으킵니다. 그렇기 때문에 정규화릍 통해 해당 문제점을 해결하려고 합니다.

정규화란?

정규화는 중복 데이터를 저장하면서 일으키는 문제점을 없애려고 정보를 주제별로 분할하는 프로세스를 의미합니다. 여기서 말하는 중복은 한 테이블의 기본키 값을 다른 테이블의 외래키로 중복으로 사용하는 것이 아니라 사용자가 같은 데이터를 한 군데 이상 사용하는 것을 말합니다.

정규화의 목표

정규화의 한 가지 목표는 한 데이터베이스에서 동일한 테이블이든 다른 테이블이든 반복되는 데이터를 최소화하는 것입니다. 다음 CustomerSales 테이블의 예를 들어보죠

|sale_id|cust_first_name|cust_last_name|address|city|model|sales_person|
------------------------------------------------------------------------------
|1      |서연            |Kim           |광진구   |서울 |그랜져 |Brad        |
|2      |민준            |Lee           |양천구   |서울 |산타페 |Kock        |
|3      |지우            |Park          |관악구   |서울 |뉴모닝 |Smith       |
|4      |지후            |Choi          |구로구   |서울 |그랜져 |Smith       |
|5      |민준            |Lee           |용천구   |서울 |소나타 |Chang       |

다음 예를 보면 민준의 주소 데이터가(양천구, 용천구) 일관되지 않는 것을 볼 수 있습니다.

이렇게 봤듯이 데이터 불일치는 어느 칼럼에서나 나타날 수 있습니다. 또한 다음과 같이 문제가 발생합니다.

  1. 고객 레코드와 함께 판매 정보가 입력되지 않으면 모델이나 판매 사원 등 정보를 입력할 수 없습니다.

  2. 비정상적인 데이터 입력이 존재할 수 있습니다.

  3. 이런 형태로 설계한다면 고객이 자동차를 추가로 구매할 때 대부분의 데이터가 반복될 수밖에 없습니다.

  4. 불필요한 데이터 입력은 디스크 공간, 메모리, 네트워크, 리소스 등 자원 낭비가 심합니다.

  5. 마지막으로 입력 오류가 발생해도 모르는 경우가 생깁니다.

또한 판매원의 이름을 바꿀 경우(update) 비정상적으로 데이터를 갱신시킬 수 있습니다. 이것은 많은 사람이 동시에 사용하는 데이터베이스에서 레코드의 개수가 아주 많을 때 큰 문제를 일으킬 수 있습니다. 게다가 이름이 동일한 사람이 없을 때만 갱신을 성공 시킬 수 있습니다.

그리고 로우를 한 개 삭제될 때 데이터베이스에서 제거하려고 하지 않은 데이터를 잃을 수 있기 때문에, 비정상적으로 데이터를 삭제할 수 있습니다.

그래서 다음과 같이 논리적으로 테이블을 네 개로 분할 할 수 있습니다.

  1. Customer
|customer_id|cust_first_name|cust_last_name|address|city|
---------------------------------------------------------
|1          |서연            |Kim           |광진구   |서울 |
|2          |민준            |Lee           |양천구   |서울 |
|3          |지우            |Park          |관악구   |서울 |
|4          |지후            |Choi          |구로구   |서울 |
  1. Employees
|employee_id|sales_person|
--------------------------
|1          |Brad        |
|2          |Kock        |
|3          |Smith       |
|4          |Chang       |
  1. AutomobileModels
|model_id|model|
----------------
|1       |그랜져 |
|2       |산타페 |
|3       |뉴모닝 |
|4       |소나타 |
  1. SalesTransactions
|sales_id|customer_id|model_id|sales_person_id|purchase_date|
-------------------------------------------------------------
|1       |1          |1       |1              |2020-01-01   |
|2       |2          |2       |2              |2020-02-21   |
|3       |3          |3       |3              |2020-03-12   |
|4       |4          |1       |3              |2020-05-19   |
|5       |2          |4       |4              |2020-07-16   |

이렇게 설계하면 고객, 직원, 자동차 모델 정보는 각 테이블에서 한 번만 입력해도 됩니다. 그리고 모든 테이블에는 식별자인 기본키가 포함되어야 합니다. 마지막으로 SalesTransactions 테이블은 각 판매 거래의 내용을 상세하게 저장하려고 외래키를 사용합니다.

이렇게 정규화를 시키면 다음과 같은 장점을 가집니다.

  1. 중복 데이터를 제거하면 일관성 없는 데이터 발생을 최소화 할 수 있다.

  2. 비정상적인 데이터 삽입, 삭제, 갱신을 방지 할 수 있다.

  3. 중복 데이터를 제거해 데이터를 처리할 때 사용되는 자원을 효과적으로 관리 할 수 있다.

  4. 제약 조건을 통해 입력 오류를 막을 수 있다.

    이로써 정규화는 데이터베이스 모델링에 있어서 꼭 필요한 존재입니다. 물론 관계형 데이터베이스 제품에 따라 테이블 간 관계를 표현하는 방법은 조금씩 다르지만 하나의 공통점으로 정규화를 통해 자원을 효과적으로 관리한다는 것입니다.

    다음에는 반복 그룹을 제거 하자에 관해 공부해 보겠습니다.

Comments