[데이터베이스] - DBMS 종류, 정규화

링딩·2023년 3월 26일
0

Computer Science

목록 보기
11/49

데이터베이스를 설명하기 앞서 가장 기본적인 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번만 저장함.
  • 단점
    1. 테이블간 관계를 맺고 있어 시스템이 커질 경우 JOIN문이 많은 복잡한 쿼리가 만들어질 수 있음.
    1. 스키마로 인해 데이터가 유연하지 못하다.
      -> 스키마가 변경되면 DB를 갈아엎는 등 번거로움이 생길 수도 있다.

😮 이럴 때 사용하면 좋다.

  • 관계를 맺은 데이터가 자주 변경되는 시스템에 적합
  • 변경될 여지가 없고, 명확한 스키마가 사용자와 데이터에게 중요한 경우

2. NoSQL

  • 장점
    1. 스키마가 없어서 유연하며 자유로운 데이터 구조
    -> 저장된 데이터를 조정하고 새로운 필드 추가 가능
    1. 데이터는 시스템이 필요로 하는 형식으로 저장
    2. 수직 및 수평 확장이 용이

  • 단점
    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의 코딩일기장을 참고하여 작성했습니다.

profile
초짜 백엔드 개린이

0개의 댓글