데이터베이스를 설명하기 앞서 가장 기본적인 RDBMS 구조를 보고 시작해보고자 합니다
* DBMS(DataBase Management System) :
사용자의 요청을 해석하여 데이터베이스에 저장된 정보를 관리할 수 있게 도와주는 소프트웨어
ex) MySQL, Oracle DB, Maraia DB 등
SQL : RDBMS에 저장된 데이터를 관리하기 위해 설계가 된 프로그래밍 언어
DBMS의 종류
관계형 데이터베이스(RDBMS)
◾ 정의
엑셀과 유사한 형식으로 2차원 테이블로써 속성과 값으로 나뉘어 데이터를 정의하고 저장 및 관리함.
튜플
- 릴레이션을 구성하는 각각의 행(row)
- 속성들의 모임으로 구성되어 있다.
- 튜플의 수 = 카디널리티
Attribute(속성)
- 릴레이션을 구성하는 각각의 열(column)
- 개체의 특성을 기술
- 속성의 수 = 차수
NoSQL 이란?
- 현재 많이 쓰이는 DBMS로 RDBMS 방식으로 처리할 수 없을 크고 방대한 데이터들의 등장으로 이용되기 시작
- key 값만 가지고 데이터에 대한 입출력을 수행할 수 있다.
- 테이블 간의 관게를 정의하지 않아 관계를 맺을 수 없음.
- 다른 구조의 데이터를 같은 컬렉션에 추가할 수 있다.
RDBMS vs NoSQL
1. RDBMS
- 장점
1. 명확한 데이터 구조(테이블)를 보장(데이터의 무결성)
- 관계는 각 데이터를 중복 없이 1번만 저장함.
- 단점
1. 테이블간 관계를 맺고 있어 시스템이 커질 경우 JOIN문이 많은 복잡한 쿼리가 만들어질 수 있음.
- 스키마로 인해 데이터가 유연하지 못하다.
-> 스키마가 변경되면 DB를 갈아엎는 등 번거로움이 생길 수도 있다.
😮 이럴 때 사용하면 좋다.
- 관계를 맺은 데이터가 자주 변경되는 시스템에 적합
- 변경될 여지가 없고, 명확한 스키마가 사용자와 데이터에게 중요한 경우
2. NoSQL
- 장점
1. 스키마가 없어서 유연하며 자유로운 데이터 구조
-> 저장된 데이터를 조정하고 새로운 필드 추가 가능
- 데이터는 시스템이 필요로 하는 형식으로 저장
- 수직 및 수평 확장이 용이
- 단점
1. 스키마가 존재하지 않기에 명확한 데이터 구조를 보장하지 않음
2. 데이터가 여러 컬렉션에 중복되어 있기에 변경 시 모든 컬렉션에서 수정해줘야 함
😮 이럴 때 사용하면 좋다.
- 정확한 데이터 구조를 알 수 없고 데이터가 변경/확장이 될 수 있는 경우
- 읽기는 하지만, 데이터 변경이 자주 없는 경우
- 데이터베이스를 수평으로 확장해야 하는 경우 (많은 양의 데이터를 다룰 경우)
✨정규화
* 정의
테이블 간에 중복된 데이타를 허용하지 않는다는 것이다. 중복된 데이터를 허용하지 않음으로써 무결성를 유지할 수 있으며, DB의 저장 용량 역시 줄일 수 있다.
⭐ 정규화 단계
이러한 테이블을 분해하는 정규화 단계가 정의되어 있는데, 여기서 테이블을 어떻게 분해되는지에 따라 정규화 단계가 달라지는데, 각각의 정규화 단계에 대해 자세히 알아보도록 하자.
[제 1정규화]
테이블의 컬럼이 원자값(하나의 값)을 갖도록 테이블을 분해하는 것
이렇게 취미가 중복된 값이 나왔기 때문에 제 1 정규화를 이용하여 중복된 값이 나오지 않도록 분리한다.
[제 2정규화]
제1 정규화를 진행한 테이블 + 완전 함수 종속을 만족하도록 테이블을 분해하는 것
- 완전 함수 종속 : 기본키의 부분집합이
결정자가 되어선 안된다는 것
<기존>
< 제 2정규화 적용>
기존 사진에서는 기본키인 (학생번호, 강좌이름)에서 기본키 일부인 강좌이름
에 의해 강의실
컬럼이 결정될 수 있다. (지장을 줄 수 있다)
- but 제 1정규화의 기존 상태에서 제 2 정규화를 적용하면 둘의 테이블로 분리되어 만족할 수 있다.
[제 3정규화]
제2 정규화를 진행한 테이블 + 이행적 종속을 없애도록 테이블을 분해하는 것
- 이행적 종속 :
A -> B
, B -> C
가 성립할 때A -> C
가 성립되는 것
<기존>
<제 3정규화 적용>
이행적 종속을 제거하는 이유는 만일 501 학생이 강좌를 '스포츠 경영학'으로 변경했을 경우 수강료가 바뀌지 않고 20000에 듣는다.
-> 학생번호->수강료
이렇게 되기 때문이다. 그때마다 일일히 바꿔주지 않기 위해 제 3정규화를 적용하는 것이다.
[BCNF 정규화]
'제3 정규화를 진행한 테이블' + '모든 결정자가 후보키'가 되도록 테이블을 분해하는 것
[BCNF 정규화 적용]
- 후보키는 슈퍼키(super key) 중에서 최소성을 갖는 키이므로 이 릴레이션에서는
(학번, 특강이름)
이나 (학번, 교수)
가 후보키가 된다.
-> 그러나 교수
는 후보키가 아님에도 불구하고 과목명이 바뀌면 관련된 과목명이 다 바뀌어야 함
=> 즉 교수
가 후보키가 아님에도 `특강이름
에 영향을 준다. 그래서 결정자이다.
최종적으로 모든 결정자가 항상 후보키가 되도록 테이블을 분해해주어 BCNF 정규화를 적용시켰다.
출처
망나니 개발자 님의 글을 참고하여 작성했습니다.
Rebro의 코딩일기장을 참고하여 작성했습니다.