도당탕탕
Effective-SQL Better-Way-2 : 중복으로 저장된 데이터 항목을 제거하자 본문
데이터를 중복으로 저장하면 일관되지 않은 데이터, 비정상적인 삽입, 갱신, 삭제 처리, 디스크 공간 낭비 등 많은 문제를 일으킵니다. 그렇기 때문에 정규화릍 통해 해당 문제점을 해결하려고 합니다.
정규화란?
정규화는 중복 데이터를 저장하면서 일으키는 문제점을 없애려고 정보를 주제별로 분할하는 프로세스를 의미합니다. 여기서 말하는 중복은 한 테이블의 기본키 값을 다른 테이블의 외래키로 중복으로 사용하는 것이 아니라 사용자가 같은 데이터를 한 군데 이상 사용하는 것을 말합니다.
정규화의 목표
정규화의 한 가지 목표는 한 데이터베이스에서 동일한 테이블이든 다른 테이블이든 반복되는 데이터를 최소화하는 것입니다. 다음 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 |
다음 예를 보면 민준의 주소 데이터가(양천구, 용천구) 일관되지 않는 것을 볼 수 있습니다.
이렇게 봤듯이 데이터 불일치는 어느 칼럼에서나 나타날 수 있습니다. 또한 다음과 같이 문제가 발생합니다.
고객 레코드와 함께 판매 정보가 입력되지 않으면 모델이나 판매 사원 등 정보를 입력할 수 없습니다.
비정상적인 데이터 입력이 존재할 수 있습니다.
이런 형태로 설계한다면 고객이 자동차를 추가로 구매할 때 대부분의 데이터가 반복될 수밖에 없습니다.
불필요한 데이터 입력은 디스크 공간, 메모리, 네트워크, 리소스 등 자원 낭비가 심합니다.
마지막으로 입력 오류가 발생해도 모르는 경우가 생깁니다.
또한 판매원의 이름을 바꿀 경우(update) 비정상적으로 데이터를 갱신시킬 수 있습니다. 이것은 많은 사람이 동시에 사용하는 데이터베이스에서 레코드의 개수가 아주 많을 때 큰 문제를 일으킬 수 있습니다. 게다가 이름이 동일한 사람이 없을 때만 갱신을 성공 시킬 수 있습니다.
그리고 로우를 한 개 삭제될 때 데이터베이스에서 제거하려고 하지 않은 데이터를 잃을 수 있기 때문에, 비정상적으로 데이터를 삭제할 수 있습니다.
그래서 다음과 같이 논리적으로 테이블을 네 개로 분할 할 수 있습니다.
- Customer
|customer_id|cust_first_name|cust_last_name|address|city|
---------------------------------------------------------
|1 |서연 |Kim |광진구 |서울 |
|2 |민준 |Lee |양천구 |서울 |
|3 |지우 |Park |관악구 |서울 |
|4 |지후 |Choi |구로구 |서울 |
- Employees
|employee_id|sales_person|
--------------------------
|1 |Brad |
|2 |Kock |
|3 |Smith |
|4 |Chang |
- AutomobileModels
|model_id|model|
----------------
|1 |그랜져 |
|2 |산타페 |
|3 |뉴모닝 |
|4 |소나타 |
- 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 테이블은 각 판매 거래의 내용을 상세하게 저장하려고 외래키를 사용합니다.
이렇게 정규화를 시키면 다음과 같은 장점을 가집니다.
중복 데이터를 제거하면 일관성 없는 데이터 발생을 최소화 할 수 있다.
비정상적인 데이터 삽입, 삭제, 갱신을 방지 할 수 있다.
중복 데이터를 제거해 데이터를 처리할 때 사용되는 자원을 효과적으로 관리 할 수 있다.
제약 조건을 통해 입력 오류를 막을 수 있다.
이로써 정규화는 데이터베이스 모델링에 있어서 꼭 필요한 존재입니다. 물론 관계형 데이터베이스 제품에 따라 테이블 간 관계를 표현하는 방법은 조금씩 다르지만 하나의 공통점으로 정규화를 통해 자원을 효과적으로 관리한다는 것입니다.
다음에는 반복 그룹을 제거 하자에 관해 공부해 보겠습니다.
'Database' 카테고리의 다른 글
Effective-SQL Better-Way-6 : 참조 무결성을 보호하려면 외래키를 정의하자 (0) | 2020.09.04 |
---|---|
Effective-SQL Better-Way-5 : 왜 계산 데이터를 저장하면 좋지 않은지 이해하자 (0) | 2020.09.03 |
Effective-SQL Better-Way-4 : 컬럼당 하나의 특성만 저장하자 (0) | 2020.09.01 |
Effective-SQL Better-Way-3 : 반복 그룹을 제거 하자 (0) | 2020.09.01 |
Effective-SQL Better-Way-1 : 모든 테이블의 기본키가 있는지 확인하자 (0) | 2020.08.31 |