Database

younghyun·2022년 2월 3일
0

Database ( Data + base )

컴퓨터 시스템에 저장된 정보나 데이터를 모두 모아 놓은 집합 ( 필요한 데이터를 가득 모아놓은 베이스 )
실제로 데이터베이스는 아래 사진과 같이 생긴 커다란 기계에 숫자나 문자열로 이루어진 데이터들이 가득 들어있음

사진과 같은 데이터(데이터베이스 내부에 들어있는 데이터)들은 일반적으로 데이터베이스 관리 시스템(DBMS)에 의해 제어됨.
데이터와 DBMS를 관련 응용 프로그램과 함께 '데이터베이스 시스템'이라고 하며, 줄여서 '데이터베이스(DB)'라고도 함.

  • databse, DBMS 사용 이유

    데이터 보존 : 데이터를 오랜기간 저장 및 보존하기 위해
    체계저 관리 : 데이터를 체계적으로 보존하고 관리하기 위해
    생산성
    기능성
    신뢰성

  • 웹 시스템 내 데이터베이스

    프론트 엔드가 웹 클라이언트(브라우저)에서 동작하는 모든 것을 자바스크립트 코드로 만듦.
    백 엔드가 프론트가 작성한 자바스크립트 코드가 요청했을 때 API를 만드는, 데이터베이스 관리하는 일을 함.
    실제 브라우저 상에 저장 되있는 게 아니라. 데이터가 영구히 보존되어있는 데이터베이스에 저장되어있음.
    웹 어플리케이션 서버는 데이터베이스 응답을 프론트 분들이 쉽게 사용하게 가공함. 데이터베이스도 체계적으로 쓰고 있지만 날 것. 날것 데이터를 조금더 예쁜 데이터로 가공해서 클라이언트에게 응답을 보내줘야 함. 정제된 응답을 받은, 프론트가 다시 화면을 예쁘게 렌더링


실제로 데이터가 저장되는 공간은 하드디스크. 하드 디스크앞에 DBMS라는 소프트웨어 설치되있음.

  • 데이터 베이스 종류
    관계형 데이터 베이스 ( RDBMS, Relational DataBase Management System )
    비관계형 데이터 베이스 ( Non-relational ) database

관계형 데이터베이스

데이터 사이의 관계에 기초를 둔 데이터베이스 시스템
모든 데이터는 2차원 테이블(table)로 표현

Primary Key : 각 로우는 저만의 고유 키(Primary Key)가 있음. 특정 로우를 찾거나, 인용(reference)할 수 있음.

  • 테이블 사이 관계 종류

    • One To One ( 일대일 ) : 테이블 A의 로우와 테이블 B의 로우가 정확히 일대일 매칭이 되는 관계

      외래키( Foreign Key ) : 다른 테이블의 pk를 참조한 컬럼에 입력되어 있는 숫자들. ex) user_id

    • One to Many ( 일대다 ) : 테이블 A의 로우가 테이블 B의 여러 로우와 연결이 되는 관계

    • Many to Many ( 다대다 ) : 테이블 A의 로우가 테이블 B의 여러 로우와 연결이 되는 관계

      authors 컬럼에 해당하는 로우 하나에 너무 여러 데이터가 들어가있음. ( 정규화 제 1법칙 위반 ) 테이블의 행 하나에는 딱 하나의 데이터만 들어가야 함.

      똑같은 데이터가 너무 많음. author 컬럼 같은 작가 이름 반복, title 컬럼책 제목이 두 번, 세 번씩 중복. price마찬가지
      책 한 권이 늘어날 때마다, 작가의 수에 맞춰서 똑같은 데이터를 또 여러번 저장해 주어야 하는 문제가 발생
      Foreign Key 사용해서 중복된 데이터 획기적으로 줄임

  • 어떻게 테이블과 테이블을 연결하는가?

    • Foreign key(외부키)라는 개념을 사용하여 주로 연결.
    • 앞서 본 one to one 예에서 user_profiles 테이블의 user_id 컬럼은 users 테이블에 걸려있는 외부 키라고 지정.
    • 즉 데이터베이스에게 user_id의 값은 users 테이블의 id 값이며 그러므로 users 테이블의 id 컬럼에 존재하는 값만 생성될 수 있음.
    • 만일 users 테이블에 없는 id 값이 user_id 에 지정되면 에러가 발생함
  • 왜 테이블들을 연결하는가?

    • 왜 정보를 여러 테이블에 나누어서 저장하는가?
    • 앞서 본 one to many의 예에 경우 그냥 하나의 테이블에 고객 정보와 구입한 제품 정보 모두를 저장 하면 안되는가?
    • 하나의 테이블에 모든 정보를 다 넣으면 동일한 정보들이 불필요하게 중복되어 저장됨.
      더 많은 디스크를 사용하게 되고, 잘못된 데이터가 저장 될 가능성이 높아짐
    • 예를 들어, 고객의 아이디는 동일한데 이름이 서로 다른 로우들이 있다면 어떻게 해야 할까요? 어떤 이름이 정확할까요?
    • 여러 테이블에 나누어서 저장한후 필요한 테이블 끼리 연결 시키면 위의 두 문제가 사라집니다.
      중복된 데이터를 저장하지 않음으로 디스크를 더 효율적으로 쓰고,
      또한 서로 같은 데이터이지만 부분적으로만 내용이 다른 데이터가 생기는 문제가 없어짐.이것을 normalization(정규화) 이라고 함.

정규화

  • 도메인 원자값 (1NF) : 도메인 원자값 조건 만족 해야 함

    • 반복 그룹이 존재하면 안됨.

      • Tom이라는 학생에 대한 정보인 이름,메일,대학,전공은 초기 설정하면 이후 계속 따라옴. 해당 정보는 수강 내역을 확인하기 위해서 계속 반복되기에 테이블을 분리
    • 모든 행은 식별자로 완전하게 구분


      그런데, '학생' 테이블은 2번 조건인 "모든 행은 식별자로 완전하게 구분 되어야 한다." 라는 조건이 만족하는 반면
      수강내역은 prime key인 '학번'만으로는 모든 행이 구분되지 않음.
      그렇기 때문에 추가적으로 key를 설정 해 주어야 함.
      그래서 '수강 내역' 테이블의 '학번'+'수강학기'+'과목명'을 복합하여 식별자로 두면서 문제를 해결하면 제 1 정규화는 마무리 됨.

  • 부분 함수 종속 제거 (2NF) : Key가 아닌 값들은 모두 key에 종속 되어야한다는 말

    • key가 아닌 컬럼(속성)은 key 컬럼에만! 종속 되어야 함
    • 복합키 일때만! 제 2정규형의 조건이 되는것 ( 복합키가 아니면, 제 2정규형을 넘어 제 3정규형을 보면 됨 )
      - 결과적으로 Key 값에 주목하는것이 제2 정규화의 핵심!

      수강내역' 테이블은 '학번+수강학기+ 과목명'(이하 학+수+과)으로 이루어진 복합키
      제2 정규형에 만족을 하려면 복합키인 학+수+과에 성적과 제한 인원이 확실하게 종속 돼야 한다는 것.
      '성적'의 경우는 학번과 수강학기 과목명을 알아야 해당 학기 성적을 알 수 있기 때문에 key에 종속이 되는 것을 확인했는데, '제한인원'의 경우는 학번과는 딱히 관계가 없어 보임.
      그렇기 때문에 이것을 한번 더 나눌 수 있다는 것!
  • 이행 함수 종속 제거 (3NF) : 제 2정규형을 만족하고, 테이블 내의 모든 속성이 키에만 의존하며 다른 후보키에 의존하지 않음.
    - 모든 key가 아닌 컬럼(non-key)은 key 컬럼(속성)에 완전히 종속 되어야 함.
    - 모든 non-key 컬럼은 key 컬럼(속성)에만 종속 되어야 함함
    - 그래서 key가 아닌 값에 주목!

    non key 컬럼인 '대학'과 '전공'을 보게되면 key가 아닌 컬럼인데도 불구하고, 종속 관계가 성립이 됨
    '대학'의 경우 '전공'을 포함하기 때문. 즉, 생물학과면 무조건 이과대학에 포함되고, 컴퓨터 학과의 경우 IT대학의 부분으로 포함이 됨.
    정규화가 잘 된 테이블은 갑-을 관계만 있는 것.
    그런데 '학생'테이블의 경우 갑(key:학번)-을(non-key:대학)-병(non-key : 전공) 관계가 있기 때문에 이 관계를 깔끔하게 정리 해주어야 함.

    '대학정보' 테이블의 경우 대학이 전공을 포함. 하지만 key는 테이블의 튜플을 구분해 낼 수 있어야 함.그래서 튜플을 구분하기 위해서는 '전공'이 key 값이 됨.
    '대학'정보를 참조하기 위해서는 학생 테이블의 '전공'을 외래키(foreign key)로 설정하여 '대학정보' 테이블을 참조 할 수 있게 해야 함.그래서 제 3정규화를 마친 '학생' 테이블은 다음과 같이 분리 하게 됨.

    최종 테이블

  • 결정자이면서 후보키가 아닌 것 제거 (BCNF)

  • 다치 종속 제거 (4NF)

  • 조인 종속성 이용 (5NF)

profile
선명한 기억보다 흐릿한 메모

0개의 댓글