일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 구글
- JavaScript
- MSSQL
- unity
- mariadb
- Windows
- s3
- Es
- build
- Kibana
- JS
- 유니티
- docker
- error
- sample
- Python
- elasticsearch
- logstash
- 영어
- 엘라스틱서치
- API
- ssh
- MySQL
- ChatGPT
- 설정
- Ai
- Linux
- nodejs
- AWS
- Today
- Total
가끔 보자, 하늘.
DATABASE 1~3정규화를 가장 쉽게 이해하기 본문
인터넷이나 책에 DB 정규화를 찾아보면 이런 식으로 정리된 내용을 볼 수 있습니다. 그나마 좀 쉽게 정리된 내용을 찾은 건데 익숙하지가 않네요. 한국어인데 뭔지 이해가 잘 안되는 단어들이 여럿 있습니다.(저.. 저만 그런가요 -0-?)
제 1 정규화 : 모든 속성이 원자값을 가져야 합니다. 즉, 각 속성은 더 이상 분해할 수 없는 값을 가져야 합니다.
제 2 정규화 : 기본키의 일부가 아닌 속성은 기본키 전체에 종속적이어야 합니다. 부분적 종속성을 제거합니다.
제 3 정규화 : 기본키에 종속되지 않은 속성들 간의 이행적 종속성을 제거합니다. 즉, 기본키가 아닌 속성이 다른 기본키가 아닌 속성에 종속되지 않아야 합니다.
BCNF : 3NF를 강화한 형태로, 대부분의 실용적인 데이터베이스 설계에서 중요한 정규형입니다. BCNF는 모든 결정자(determinant)가 후보키가 되도록 요구합니다.
제 4 정규화 : 다치 종속성(Multivalued Dependency)을 제거하기 위한 정규형입니다. 테이블이 BCNF를 만족하고, 다치 종속성이 존재하지 않아야 합니다.
제 5 정규화 : 조인 종속성(Join Dependency)을 제거하기 위한 정규형입니다. 테이블이 4NF를 만족하고, 조인 종속성이 존재하지 않아야 합니다.
오랜 동안 DB를 운영하면서 실무에서 각 종류를 읊어가며 정규화를 하지는 않죠. 생각해보면 정규화라는 단어 자체를 그렇게 많이 언급하지도 않았던 것 같네요.
개발자 입장에서보면 코드 리펙토링을 하는 것과 유사하다고 할 수 있습니다. 데이터를 아무 기준도 없이 막 저장하면 사용하는데 지장이 많겠죠. 아마 DB를 운영해보신 분들이라면 정규화 종류들을 다 몰라도 이미 다 적용해서 사용중인 내용들일 겁니다. 위의 여섯가지 정규화(Normal Form)을 간단한 예를 들어 정리해 보겠습니다. 가볍에 읽어보시기 바랍니다.
제 1 정규형
- 모든 속성이 원자값을 가져야 합니다. 즉, 각 속성은 더 이상 분해할 수 없는 값을 가져야 합니다.
- 중복되는 데이터가 없어야 하며, 각 행이 고유해야 합니다.
어느 날 KPI 데이터 통합을 위해 웹 DB를 볼 일이 있었는데 결제 정보를 문자열로 하나의 컬럼에 모두 저장한 걸 본 일이 있었습니다. 여러 가지 이벤트가 생기고 없어지고를 반복하다보니 이벤트를 문자열로 정의하고 [,] 를 이용해 쿼리 시 split해 사용하고 있었습니다. 이런 경우가 바로 분해할 수 있는 값을 가진 속성 값(혹은 도메인)이라고 할 수 있습니다. 제 1 정규형은 이런 분해할 수 있는 값을 별도의 컬럼 혹은 테이블로 분리하는 것을 말합니다.
예를 들어 신규 유저를 위해 첫 아이템 구매 시 30%할인 이벤트가 있다고 가정해 봅시다. 그리고 어떤 아이템은 1개를 사면 1개를 더 주는 이벤트를 한다고 가정하고 이 이벤트들은 중복 적용 된다고 가정해 보겠습니다. 이런 이벤트 정보를 하나의 컬럼에 저장하고 매번 파싱해서 처리할 수도 있겠지만 각각의 컬럼 혹은 별도의 이벤트 테이블을 만들어 관리하는 방법이 있을 수 있습니다.
이처럼 한 속성이 여러가지 값을 동시에 가지고 있지 않고 더 이상 분해할 수 없는 값을 가지도록 하는 것을 제 1 정규형 이라 말합니다.
제 2 정규형
- 제 1 정규형을 만족해야 합니다.
- 기본키의 일부가 아닌 속성은 기본키 전체에 종속적(혹은 완전종속관계)이어야 합니다. 부분적 종속성(혹은 부분종속관계)을 제거합니다.
유저가 소유한 아이템들을 저장할 테이블을 정의한다고 가정해 보겠습니다.
유저가 소유한 아이템 테이블을 [유저ID, 아이템 ID, 아이템 이름, 소유한 개수, (유저가 커스터마이징 가능한) 접두사] 속성으로 구성했습니다. 이 속성들 중 기본키를 [유저 ID, 아이템 ID]가 될 것입니다. [소유한 개수]와 [접두사]는 기본키에 완전 종속 되어 있으나, [아이템 이름]는 [아이템 ID]에만 부분 종속되어 있습니다.
이런 부분종속관계의 속성을 해당 테이블에서 제거하고 별도의 테이블에서 관리하도록 수정하는 것을 제 2 정규형이라 합니다.
제 3 정규형
- 2NF를 만족해야 합니다.
- 기본키에 종속되지 않은 속성들 간의 이행적 종속성을 제거합니다. 즉, 기본키가 아닌 속성이 다른 기본키가 아닌 속성에 종속되지 않아야 합니다.
이행적함수종속관계란 데이터베이스 테이블에서 속성 A가 속성 B에 종속되고, 속성 B가 속성 C에 종속될 때 발생하는 종속 관계입니다. 이 경우 속성 A가 속성 C에도 이행적으로 종속되었다고 할 수 있습니다.
아이템 정보를 정의한 테이블의 속성이 [아이템 ID, 아이템 성능 이름, 아이템 성능 상세 기술] 로 구성되어 있다고 가정해 보겠습니다. 이런 경우 다음과 같은 문제가 발생할 수 있습니다.
- 유일한 아이템이 삭제될 경우 그에 해당하는 아이템 성능 이름과 상세 기술 정보가 사라져 해당 정보를 더 이상 찾을 수 없는 문제가 발생할 가능성이 있습니다.
- 아이템을 생성하기 전에는 새로운 아이템 성능을 정의할 수 없습니다.
- 아이템 ID가 다르지만 동일한 아이템 성능과 상세 기술을 가진 아이템이 여럿 추가될 경우, 특정 아이템 성능과 상세 기술 정보를 갱신할 때 자칫 갱신이 되지 않을 가능성이 있습니다.
이런 문제점을 대비하기 위해 아이템 테이블에서 성능과 관련된 정보를 분리해 별도의 테이블에서 관리한다면 이런 문제점을 방지할 수 있습니다. 2NF와 결과는 비슷해 보이지만 정규화의 목적은 명확히 다릅니다.
정규화는 장점도 있지만 간과할 수 없는 단점도 있으며 이런 문제들 때문에 비정규화를 하기도 합니다.
정규화의 장점
- 데이터 무결성: 데이터의 일관성과 정확성을 유지할 수 있습니다.
- 데이터 중복 감소: 데이터 중복을 줄여 저장 공간을 절약할 수 있습니다.
- 데이터베이스 유지보수 용이: 데이터 구조가 명확해지므로 유지보수가 용이합니다.
- 데이터 이상 현상 방지: 삽입, 갱신, 삭제 시 발생할 수 있는 이상현상을 방지할 수 있습니다.
정규화의 단점
- 복잡성 증가: 데이터베이스 구조가 복잡해질 수 있습니다.
- 성능 저하 가능성: 지나치게 정규화된 데이터베이스는 조인 연산이 많아져 성능이 저하될 수 있습니다.
비정규화 (Denormalization)
- 비정규화는 정규화된 데이터베이스에서 성능 향상을 위해 일부러 정규화를 되돌리는 과정을 말합니다. 이를 통해 조인 연산을 줄여 데이터 접근 속도를 높일 수 있습니다.
'개발 이야기 > DB, 데이터분석, AI' 카테고리의 다른 글
Chat with RTX 사용기 (32) | 2024.02.19 |
---|---|
수식없이 LLM 이해하기 (32) | 2024.02.15 |
Elasticsearch 에서 특정 날짜 데이터 재구축이 필요할 때 (32) | 2023.12.27 |
MySQL/MariaDB에 TLS 적용하기 (1) | 2023.12.08 |
Elasticsearch x_content_parse_exception 에러 (1) | 2023.12.07 |