데이터베이스를 자신이 원하는 대로 잘 짜더라도 테이블에 중복된 값이나 효율적이지 않은 내용들이 포함될 수 있다.
그런 것을 처리하고자 정규화라는 과정이 중요하다. 실무에서는 3NF 까지를 많이 쓴다고 한다. 이 이후부터는 학술적인 내용이다.
데이터베이스 정규화는 왜 해야 할까?
- 데이터 중복 최소화 : 데이터 중복은 데이터베이스 크기를 증가시키고, 데이터의 일관성과 무결성을 저해할 수 있습니다. 정규화를 통해 데이터 중복을 최소화하면 데이터베이스 용량을 줄이고, 데이터 검색과 처리 속도를 높일 수 있습니다.
- 데이터 일관성 유지 : 데이터 일관성은 데이터베이스의 중요한 요소 중 하나입니다. 정규화를 통해 데이터를 분리하면 각각의 테이블에서 데이터가 일관되게 관리되므로 데이터 일관성을 보장할 수 있습니다.
- 데이터 무결성 유지 : 데이터 무결성은 데이터의 정확성과 유효성을 보장하는 것입니다. 정규화를 통해 데이터의 중복을 제거하고 테이블 간 관계를 명확하게 정의하면 데이터 무결성을 유지할 수 있습니다.
- 유지보수성 향상 : 정규화를 통해 테이블을 분리하면 데이터의 관리가 쉬워지고, 새로운 데이터를 추가하거나 수정할 때도 각각의 테이블에서 처리할 수 있습니다. 이렇게 구성된 데이터베이스는 유지보수가 용이해지므로, 시스템 전체의 효율성과 안정성을 높일 수 있습니다.
지금부터 내용은 생활코딩 유튜브를 참고해서 정리했다.
1NF(제 1 정규형)
제1 정규형은 테이블의 속성(칼럼)이 원자적(Atomic)이어야 한다는 것을 말하다. 원자적이라는 것은 더 이상 분해할 수 없는, 즉 더 이상 나눌 수 없는 값으로 이루어져 있어야 한다는 것입니다. 즉, 각각의 속성은 중복된 값을 가지지 않아야 합니다.
쉽게 말해서 각각의 칼럼들이 값을 하나씩만 가져라이다!!
이런 데이터베이스가 있다고 할 때 제일 큰 문제는 한 칼럼에 값이 2개가 들어갔다는 것이다. 이렇게 하면 query를 작성하거나 정렬을 할 때 엄청나게 큰 문제가 존재할 것이다. 그러므로 이 문제를 처리해줘야 한다.
이걸 처리해주기 위해서는 tag라는 table을 따로 만들어 매핑을 해주는 것이다.
이렇게 2개의 테이블로 나눌 수 있다. 이러면 topic 테이블에 중복값이 없어진다.
2NF(제 2 정규형)
제2정규형은 테이블의 모든 속성이 기본키에 대해 완전 함수적 종속을 만족해야 한다는 것을 말합니다. 이는 테이블의 모든 컬럼이 기본키에 종속되어야 하며, 기본키가 아닌 다른 컬럼에 의해 결정되는 컬럼은 별도의 테이블로 분리해야 한다는 것을 의미합니다.
1NF를 끝난 상태가 지금 위의 사진이다.
이제 여기서 문제는 topic 테이블에 중복 요소가 존재 한다는 것이다. 우리는 title 이라는 primary key를 가지고 type과 price를 제외한 나머지는 같은 값을 가져도 상관이 없다. 예를 들어 paper, online인지 에 따라 가격이 달라 질 수 있지만 description이 같거나 달라도 아무 상관이 없다.
즉, topic이라는 table은 title과 type과 price를 위한 테이블이다.
그러므로 title과 중복값을 가지는 요소들만 빼온다.
그럼 이렇게 중복값이 없어진다.
이제 type, price를 처리해줘야 한다.
3NF(제 3 정규형)
제3정규형은 테이블의 모든 속성이 기본키에 대해 이행적 함수 종속을 만족하지 않아야 한다는 것을 말합니다. 이는 한 속성이 다른 속성에 의존하지 않고 기본키에만 의존해야 한다는 것을 의미합니다. 만약 어떤 속성이 다른 속성에 의존하고 있을 경우, 이를 별도의 테이블로 분리하여 정규화한다.
현재 topic table에 문제는 멀까? title이 primary key로 title만이 나머지 칼럼들을 가려내야 한다. 하지만 author_name과 author_profile이 author_id에도 종속을 하고 있다. 즉 이 두 요소는 title에도 author_id에도 함수 종속을 하고 있다.
결국 이렇게 author를 빼오면 된다. 하지만 topic table은 author_id를 가지고 있어야 한다.
이렇게 생활코딩에서 알려준 예제로 정규화에 대해 공부해 보았다. 이제 내가 직접 ERD를 짜보고 정규화를 진행해 봐야겠다.
'토이프로젝트 > 나만의 프로젝트' 카테고리의 다른 글
테스트 코드 공부 (0) | 2023.06.21 |
---|---|
Docker로 CI/CD 구축하기 (0) | 2023.06.20 |
OAuth2.0 이란? (2) | 2023.02.07 |
SpringBoot를 이용한 이메일 인증 하기 (0) | 2023.02.06 |
Spring Boot와 JWT를 이용한 회원 가입(2) (0) | 2023.02.05 |