-
[TIL] 풋살 온라인 프로젝트 종료 - 1부 (DB Normalization)TIL-sparta 2024. 6. 7. 22:57
> 이번 풋살 온라인 프로젝트를 진행하면서 어려움을 겪었던 DB 설계에 대한 부분을 보완하기 위해 DB의 정규화(Normalization)에 관한 내용을 공부해보았다.
학습 키워드: Database, normalization, normal form, 1NF, 2NF
Database Normalization (데이터베이스 정규화)
1) What is it?:
RDB (Relational Database)에서 데이터의 중복을 줄이고 무결성을 강화하기 위해 Normal Form으로 정의되는 여러 단계를 거쳐 DB의 column과 table을 세분화하는 작업을 일컫는다.
정규화에 대한 내용을 공부하기에 앞서 이번 풋살 온라인 프로젝트에서 사용한 문제의 ERD에 대한 이야기를 해야겠다. 처음에는 user, inventory, team, player, 그리고 tier 까지 다섯 개의 테이블만 존재했었는데, API를 하나씩 구현하다보니 필요하다고 생각되는 기능들이 있어서 컬럼 및 테이블을 하나씩 추가했었다. 그런데 DB 설계에 정규화(Normalization) 개념을 전혀 고려하지 않아서 데이터의 중복이 많아지고 쿼리가 쓸데없이 많아지는 등 불편한 상황이 많이 생겼다. 그래서 이번 기회에 정규화에 대한 공부를 하면서 이 ER Diagram을 올바른 형태로 수정하는 방법을 배워보고자 한다.
2) 1st Normal Form (1NF):
제 1 정규화는 다음과 같은 항목들로 정의된다.
- 하나의 cell이 한 개 이상의 값을 지니지 않음
- 식별을 위한 Primary Key를 보유
- 중복되는 row나 column이 없음
- 각 열이 각 행에 대해 단 하나의 값을 가지고 있음
1차 정규화의 핵심은 데이터의 atomicity를 유지하는 것이다. Atomicity란, 데이터 하나 하나가 원자의 형태를 띄는 것, 즉 한 컬럼의 값이 여러개 일 때 이를 분리하여 각각이 개별의 row가 되도록 만들어주는 것을 의미한다.
3) 2nd Normal Form (2NF):
제 2 정규화는 다음과 같이 정의된다.
- 이미 1NF가 적용되었음
- 부분적인 의존성(partial dependency)이 없음; 모든 non-key attribute (key가 아닌 값, 예를 들면 user 테이블에서 userId를 제외한 다른 값 들을 가리킴)가 primary key에 완전하게 의존(fully dependent)하는 형태임
앞에서 dependent라는 단어를 사용했는데, 이는 RDB에서 함수적 종속(functional dependency)를 의미한다. Functional dependency란, 주어진 relation R에서 X, Y ⊆ R 일 때, 각각의 X 가 단 하나의 Y 하고만 연관되어 있는 경우 X functionally determine Y (X → Y) 라고 표현하며, X가 Y를 함수적으로 결정하는 결정자(determinant), Y가 X에 함수적으로 종속되는 종속자(dependant)다 라고 표현한다. 쉽게 표현하면 X의 값에 의해 Y의 값이 결정된다고 할 수 있다. 앞선 Figure 3. 의 예시를 보면 PK인 학생_ID가 주어졌을 때 non-key attribute인 학생_이름의 값을 알 수 있는 구조로 되어있다. 따라서 학생_ID는 학생_이름의 결정자이고, 반대로 학생_이름은 학생_ID의 종속자라고 부를 수 있다. 반면에 수강_과목 항목의 경우 PK인 학생_ID를 가지고 도출해낼 수 없으므로, 학생_ID를 기준으로 두 컬럼을 분리하는 것으로 2NF를 진행할 수 있다.
2차 정규화는 1차 정규화가 완료된 데이터에서 중복(redundancy)된 데이터를 분리하는 작업이라고 생각하는 편이 이해하기 쉽다. 한 가지 유의할 점은 SQL의 JOIN이 O(N^2) 의 시간 복잡도를 가지고 있기 때문에 2 정규화로 분리된 테이블의 정보들을 동시에 쿼리해야하는 빈도가 잦다면 오히려 테이블을 1 정규화 상태로 유지하는 것이 좋다고 한다.
> 2부로 이어짐
--
REFERENCES:
https://teamsparta.notion.site/240522-ed84aafb0c6b4699a0bece1b89d97349
> "[240522] 데이터베이스 특강" by 강창민 튜터님, Figure 2, 3, 4
> SpartaCodingClub, "SQLD를 위한 데이터베이스 정규화 이해"
> FreeCodeCamp, "Database Normalization"
> Wikipedia, "Database normalization"
> Wikipedia, "Functional dependency"
> "[DB] 정규화(Normalization)란?" by 연구소장 J
728x90'TIL-sparta' 카테고리의 다른 글
[TIL] OOD (Object-Oriented Design) principles - SOLID (0) 2024.06.09 [TIL] 풋살 온라인 프로젝트 종료 - 2부 (ERD 수정해보기) (0) 2024.06.08 [TIL] 스파르타) 풋살 온라인 팀 프로젝트 진행 (D-1) (2) 2024.06.06 프로그래머스) 무인도 여행 풀이 (Java) (2) 2024.06.06 [TIL] 프로그래머스) 두 큐 합 같게 만들기 풀이 (Java) (2) 2024.06.04