Modeling
- 현실세계에 일어나는 일들을 객체화하는 것을 의미한다. = Domain을 정의한다
- 너무 어려운 말이니까 바로 예를 들어볼까?
Ex) Cafe에는 여러 가지 메뉴(객체)가 있고, 다양한 손님(객체)들이 주문(객체)해서 커피(객체)를 얻어낸다!
- 각각의 객체에 대한 정보들을 Table화 하는 것이 DataBase에서 핵심인 내용이고, 설계의 주요 포인트다
- Entity(Table) + Attribute(Column) + Relationship(연관관계)를 효율적으로 정의해야 된다!
* Entitiy 검증하기
1. 유용성을 보장 : 데이터가 의미가 있어야 한다.
2. 식별자(Identifier)가 존재 : 반드시 유일한 식별자(PK)가 있어야 한다!
3. 2개 이상의 속성(Attribute)가 존재 : 속성이 1개인 Entitiy는 다른 Entity에 포함되어야 한다!
4. 다른 Entity와의 Relationship 존재 : Entitiy는 반드시 관계가 있어야 한다!
5. 2개 이상의 Row데이터가 존재 : 단일 Entity는 사실상 무의미하므로, 여러 데이터가 있어야 한다!
- 그럼 이제 제대로 Entity를 만들었으니, 정규화를 알아보자
정규화
- Normalization : 데이터의 중복 저장을 최소화하기 위해 함수적 종속성을 기반으로 해서 일정한 조건을 만족하는 형태로 Entity를 분해해가는 과정
* 함수적 종속성 ?
- 속성 X에 대해서 Y의 값이 오직 하나만 연관될 때, 속성 X는 Y를 결정한다 라고 하고 Y는 X에 함수적으로 종속된다
- 정규화 되지 않은 스키마의 문제점은 무엇일까?
1. 데이터의 중복에 따른 이상현상 : 항상!!! 중복은 프로그래머에게 재앙이다.
2. 특정 데이터의 표현 불가 : (예금 + 대출) Table을 만들면,, 예금만 하고 대출 받지 않는 사람은 어떻게 할 것인가?
3. NULL값 보유 : 저장공간의 낭비, JOIN시 문제 발생, 속성의 의미 상실
4. 데이터의 부정확
1차 정규화
- 1차 정규화는 한 Entity내에 있는 모든 속성값은 단일값(Atomic Value)를 갖게하는 작업이다.
Student | Age | Subject |
Adam | 13 | Math, English |
Ajax | 15 | Programming |
David | 17 | Math |
위와 같은 테이블을
Student | Age | Subject |
Adam | 13 | Math |
Adam | 13 | English |
Ajax | 15 | Programming |
David | 17 | Math |
각각의 고유값을 가지게 변경하는 작업이다!
- But, 뭔가 아직 이상하다! -> Adam에 대한 고유키(PK)값이 중복되어 데이터가 중복저장된다..ㅠㅠ
2차 정규화
- 2차 정규화는 1차 정규화를 만족하는 Entity의 기본 Key에 대해 모든 속성들이 완전 함수적 종속이어야 한다!
- 위의 테이블에서 Age의 경우 Student의 이름을 알면 알게 되는 값이다.
- 따라서, Entity를 함수적 종속에 맞게 분리한다!
[ Student Table ]
Student | Age |
Adam | 13 |
Ajax | 15 |
David | 17 |
[ Subject Table ]
Student | Subject |
Adam | Math |
Adam | English |
Ajax | Programmming |
David | Math |
- But, 이러한 Table의 경우 Attribute값이 적어서 갱신 이상이 발생하지 않는데, 데이터가 많아지면 문제가 발생한다!
3차 정규화
- 3차 정규화는 2차 정규화를 만족하는 Entity에서 PK를 제외한 모든 속성들에 대해 이행적 함수적 종속 관계를 제거한다! ( x -> y -> z 를 만족하는 값 제거 )
[ Student Detail Table ]
Student_ID | Student_Name | Street | City | State | Zip | Subject |
- 위와 같은 테이블이 있다고 가정할 때, 학생이 듣고자 하는 과목을 추가할 때마다 주소값을 계속 추가해야 된다!
- 따라서 Zip코드에 따라서 주소를 결정하게 하는 것이 목표다!
[ Student Detail Table ]
Student_ID | Student_Name | Subject | Zip |
[ Address Table ]
Zip | Street | City | State |
반정규화
- 성능 향상을 위한 Table 구조의 재정의를 반정규화라고 한다!
- 정규화 작업을 모두 실시하고, 시스템의 성능 면에서 문제가 발생하였을 때 선택적으로 실시하는 것이 바람직하다
- 모든 Table을 전면적으로 개편해야 되므로, 노력이 많이 필요하다.
- 가능하면 처음에 설계할 때, 모든 상황을 고려하여 설계하는 것이 바람직하다.
참고
데이터베이스 정규화 및 개념 방법
'Developer > Database' 카테고리의 다른 글
Database - Mysql 기반으로 Index 에 대해 Deep Dive 해보자 (0) | 2022.06.26 |
---|---|
Mysql Query Plan - Intellij 를 활용하여 Plan query 를 해보자 (0) | 2021.10.10 |
MySql - Master Slave Replication 구조 만들어보기 (0) | 2021.07.17 |
DataBase - Table, Object (0) | 2019.04.21 |
DataBase - 개념 + 기본활용 (0) | 2019.04.20 |