기획자 알쓸신잡(2조: DB와 SQL)기획자 알쓸신잡(2조: DB와 SQL)
🎠

기획자 알쓸신잡(2조: DB와 SQL)

목차

1. IT 기획자가 DB를 알아야 하는 이유

1) 기획자가 DB구조를 제대로 고려하지 않았을 때 생기는 일

🚇T재단 에피소드
  • 시설에 거주하는 청소년들의 교통비 지원 사업을 운영 중인 T재단. 우편📮을 통해 사업 지원서를 받고 [엑셀 파일.xls]로 사업 현황을 관리하던 T재단은 재단 사이트 리뉴얼을 의뢰하며 사이트에 [지원 사업을 관리할 수 있는 시스템 구축]을 함께 요청함
  • 🚇앞서 T재단의 사이트 리뉴얼 프로젝트를 기획, 운영한 기획자 A는 과거 타 재단의 고교생 장학 지원 시스템을 기획한 경험을 살려 T재단의 지원 사업 시스템을 기획하기로 함
    • notion imagenotion image
       
  • 기획자 A가 경험한 타 재단 장학 지원 시스템은
      1. 관리자 페이지에서 2020년 장학 사업을 발행(?)하면
      1. 사용자 페이지에 신청 페이지가 열리고
      1. 해당 사업에 신청한 학생들의 신청 데이터(신상, 학적, 계좌 정보 등)가 쌓이는 구조로
      1. 2020년 사업엔 2020년 학생 데이터만 하위로 맞물려있는 구조였다.
  • 🚇<타 재단 장학 지원 시스템의 주체가 재단 학생>이었다면 <T재단의 지원 사업 주체는 재단 시설담당자 학생> 으로 달랐다.
  • 기획자 A는 이전과 마찬가지로 2020년 사업이 열리면 2020년의 시설담당자가 2020년의 시설과 학생 정보를 입력하는 구조로 T재단 시스템을 기획 하였다.
      1. 이는 매년 세 덩어리의 데이터가 연관되지 않고 새로 쌓이는 구조로 만들어 졌다.
      1. 한마디로 종이 장부 같은 시스템
  • 시스템 개발 막바지에 T재단 현업 책임자가 시스템 구조 자체에 대한 문제제기를 하였다. T재단 책임자가 예상했던 시스템은 매년 사업은 새로 등록되더라도 한 번 등록한 시설과 학생 정보는 새로 등록할 필요 없이 유지되는 구조였던 것
    • notion imagenotion image
      💁🏻‍♂️
      "매번 이용할 때마다 회원가입해야 하는 서비스도 있던가요?"
  • 이미 시스템 개발 막바지였던 상황. 일개 사원에 불과했던 기획자A는 상사 몰래 개발팀에 빌어가며 조금씩 시스템을 고치려다 개발팀의 난색과 고객사의 압박을 못 견딜 때가 돼서야 상사에게 보고하는 잘못된 대처를 함. → 초기 DB 설계가 잘못되면 엎고 새로 만들어야 할 수 있다!
  • 이 에피소드에서 기획자 A가 관계형 DB 설계에서는 "정규화(Normalization)"가 필요하다는 것을 알고 있었으면, 보다 나은 결말을 맞을 수 있었을 것이다.

2) 주요 키워드

간단한 테이블 하나 생성해 본 경험이 없더라도 여러분은 오늘 발표를 통해 '데이터베이스' 하면 아래 키워드들을 떠올릴 수 있고, 아는 척(?)을 하실 수 있을 겁니다.
  • DB
  • DBMS
  • RDMBS
  • 정규화(Normalization)
    • 기본키(primary key, PK)
    • 슈퍼키
    • 후보키
    • 대체키
    • 외래키
  • ERM
  • 스키마
  • 인덱스
  • SQL
  • 트랜잭션

2. DB와 DBMS

1) 데이터베이스(DB:Database)

여러 사람에 의해 공유되어 사용될 목적으로 통합하여 관리되는 데이터의 집합(Data + Base = '데이터들의 기지')

2) 데이터베이스의 특징

(1) 실시간 접근성(Real-Time Accessibility)

수시적이고 비정형적인 질의(조회)에 대하여 실시간 처리에 의한 응답이 가능해야 한다.
학생들의 시험성적 데이터베이스에서 "A학생의 a과목 점수 알려줘" 라는 질의와 "1학년 학생 전체 중에서 b과목을 제일 잘 본 학생의 a과목 점수 알려줘"라는 질의 모두가 가능해야 하고 그 응답은 즉각적이어야 한다.

(2) 계속적인 변화(Continuous Evolution)

데이터베이스의 상태는 동적이다. 즉 새로운 데이터의 삽입, 삭제, 갱신으로 항상 최신의 데이터를 유지한다.
게시판엔 새로운 게시물이 수시로 등록되고, 수정되고, 삭제되며 게시판은 게시물들의 최신 상태를 보여줄 수 있어야 한다.

(3) 동시공용(Concurrent Sharing)

데이터베이스는 서로 다른 목적을 가진 여러 응용자를 위한 것이므로 다수의 사용자가 동시에 같은 내용의 데이터를 이용할 수 있어야 한다.
하나의 게시물이 여러 사람에게 동시에 조회될 수 있어야 한다.

(4) 내용에 의한 참조(Content Reference)

데이터베이스에 있는 데이터를 참조할 때 데이터 레코드의 주소나 위치에 의해서가 아니라, 사용자가 요구하는 데이터 내용으로 데이터를 찾는다.
“전화번호부에서 xx페이지 xx째 줄 정보 보여줘”(X)
“전화번호부에서 XX시 XX구 XX동에 있는 XX마켓 번호 알려줘”(O)

3) 데이터베이스 모델의 종류

  1. 계층형 DB 모델(Hierarchical database model) : Tree data model
    1. └── src ├── main │ ├── java │ │ └── com │ │ └── example │ │ └── demo │ │ ├── DemoApplication.java │ │ ├── config │ │ ├── controller │ │ ├── dao │ │ ├── domain │ │ ├── exception │ │ └── service │ └── resources │ └── application.properties
      • 계층형 데이터베이스는 데이터의 관계를 트리 구조로 조직 한 것을 말한다. 부모-자식 관계 형태를 갖는 일-대-다(1:n) 구조로 상위 1개 레코드가 1개 이상의 하위 레코드를 갖는 구조이다.
      • 계층형 DB 모델은 초창기 메인프레임 컴퓨터와 초창기 이후 널리 쓰였으나, 오늘날에는 디렉터리 계층구조라는 이름으로 파일시스템, 윈도 레지스트리, 조직도, 주소록, 전화번호부, 명부, 구조화 문서(XML) 등에 쓰인다.
      • 자식을 두지 못한 맨 마지막 레코드를 단말 노드(terminal node) 라고 한다. 자주 쓰이는 용어이니 알아두는게 좋다.
      장점 - 디렉토리 서비스(어떤 이름을 기준으로 대상을 찾아 조회하거나 편집할 수 있는 서비스)에 최적화 되어 있다.
      단점 - 유연성이 떨어진다.
      • 어떤 레코드를 삭제 하면 그 자식들이 모두 따라 삭제된다.
      • 레코드 중복이 심하다 → 무결성 유지가 어려워진다
       
      • 대표적인 계층형 DBMS
        • IBM 정보 관리 시스템(IBM Information Management System, IMS) - 1968년 아폴로 계획을 위해 처음 만들어 졌다. 현재 까지도 꾸준히 버전업 되어 DB2와 함께 IBM 메인프레임의 주요 DBMS로 사용되고 있다.
        • 여러 디렉토리 서비스 : 이름 또는 ID를 기준으로 대상을 찾아 조회하거나 편집할 수 있는 서비스
          • LDAP(Lightweight Directory Access Protocol, 경량 디렉터리 액세스 프로토콜) : 인터넷 표준 디렉터리 프로토콜
          • DNS(Domain Name System, 도메인 네임 시스템) : LDAP를 이용해서 만든 도메인으로 ip 찾아주는 시스템.
          • 액티브 디렉터리(Active Directory, AD) : MS에서 만든 윈도서버용 LDAP
          • 애저 액티브 디렉터리(Azure AD) : MS에서 만든 애저 클라우드용 LDAP
  1. 네트워크형 DB 모델(Network database model) : 망 데이터 모델.
    1. notion imagenotion image
      • 네트워크형 데이터베이스 모델은 계층형과 비슷하나, 다-대-다(n:m)구조를 허용한다. 계층형을 부모-자식 관계라고 하는 것에 비해, 네트워크형은 오너-멤버 관계라고 한다.
      • 강력하나, 메인프레임에서만 쓰고 PC에는 쓰지 않는 것 같다.
  1. 관계형 DB 모델(Relational database model) : 표 데이터 모델.
      • 관계형 데이터베이스 모델은 1969년 IBM에 근무하던 에드거 F. 커드 박사가 혼자 만들었다. 그러나 IBM은 IMS DBMS의 수익을 보호하기 위해 관계형 모델의 구현을 거부하였다. 그래서 커드 박사는 A Relational Model of Data for Large Shared Data Banks 라는 논문을 1년 뒤 외부에 발표하였고, 그 논문을 바탕으로 래리 앨리슨이 오라클 RDBMS를 만들었다. 그 덕분에 오라클은 현재 유닉스 환경에서 가장 널리 사용되는 RDBMS가 되었다.
      • 관계형 DB 모델은 개체 집합에 대한 속성 관계를 표현하기 위해 모든 개체를 테이블(table)로 저장하고, 개체 집합들 사이의 관계를 공통 속성으로 연결함으로써 복잡한 관계를 표현한다.
      • 데이터 검색, 추가, 삭제 작업 등이 이전 모델들과 비교하면 '매우' 편리하며
        • 제약 조건이나 트리거 등의 장치를 통해 스스로 데이터의 무결성을 유지하는데다
        • '배열'을 이용하기 때문에 첨자를 통한 작업으로, 속도까지 뽑을 만한 효율을 보이기 때문에
        • 이후 빅데이터가 등장하기 전 까지 가장 많이 사용하는 데이터 모델이 되었다.
      • 기본 용어
        • = 테이블 = 릴레이션
        • = 레코드 = 튜플
        • = 칼럼 = 애트리뷰트(속성)
        • 차수 = degree : 한 릴레이션에 들어있는 애트리뷰트의 갯수. 잘 변하지 않는다.
        • 카디날리티(Cardinality) : 한 릴레이션의 튜플의 개수. 자주 변한다.
        • 도메인 : 한 릴레이션에서 속성 값으로 정의된 데이터 형식들을 그룹핑한 개념. 문자형, 숫자형, 일자형, 시간형 등.
        • 릴레이션 스키마 : 릴레이션의 구조. 릴레이션의 이름과 릴레이션에 포함된 모든 애트리뷰트의 이름으로 정의한다.
        • 릴레이션 인스턴스 : 어느 시점에 릴레이션에 존재하는 튜플들의 집합; 릴레이션 스키마에서 정의하는 각 속성에 대응하는 실제 값으로 구성되어있다.
          • notion imagenotion image
      • 키(Key)
        • 열쇠는 무언가를 열거나 잠글 때 사용하는 것으로, 같은 것이 하나도 없다. 우리집 열쇠가 옆집의 열쇠랑 다르듯이 말이다.
        • 이와 같이 키라는 것은 무언가를 식별하는 고유한 식별자(identifier) 기능을 한다.
        • 즉, 키는 데이터베이스에서 조건에 만족하는 관계의 행을 찾거나 순서대로 정렬할 때 다른 행과 구별할 수 있는 기준이 되는 속성의 집합이다.
      • 키의 종류
        • 슈퍼키(Super Key, SK) : 테이블에서 각 행을 유일하게 식별할 수 있는 하나 또는 그 이상의 속성들의 집합이다.
          • 슈퍼키는 유일성만 만족하면 슈퍼키가 될 수 있다.
          • 유일성이란 하나의 키로 특정 행을 바로 찾아낼수 있는 고유한 데이터 속성을 말한다. 예를 들면 전국에서 나를 구별할 수 있는 유일하고 고유한 속성은 주민번호이듯이 말이다. 주민번호는 전국민이 모두 겹치지 않아 유일하고 고유한 구별 방법으로 쓰인다.
          • 아래 사진을 보자. 7조라는 팀에 팀원은 4명이 있다. 이 4명을 구분할 수 있는 것은 절대 겹치지 않는 학번 일수도 있고, 주민번호일 수도 있다.
          • 이름과 나이를 묶어서 하나의 속성으로 만드는 것도 가능하다. 이름과 나이를 합쳐서 7조안에서 중복만 되지 않으면 가능하기 때문이다. 이름과 나이를 합쳐서 4명을 구분할 수 있으면 슈퍼키가 될 수 있다.
          • 학번과 주민번호를 묶어서 슈퍼키로 만들수도 있고, 학번과 주민번호과 이름을 합쳐서 슈퍼키로도 만들수 있고, 학번과 주민번호과 이름과 나이를 합쳐서 슈퍼키를 만들수도 있다. 어떤 속성끼리 묶던 중복값이 안나오고 서로 구별만 할 수 있으면 된다.
            • notion imagenotion image
        • 후보키(Candidate Key, CK) : 테이블에서 각 행을 유일하게 식별할 수 있는 최소한의 속성들의 집합
          • 후보키는 기본키가 될 수 있는 후보들이며 유일성과 최소성을 동시에 만족해야한다.
          • 아래 사진을 보자. 7조라는 팀에 팀원은 4명이 있다. 이 4명을 구분하는 슈퍼키들이 모여 있는데, 슈퍼키들 중에서 속성은 최소한의 갯수로 4명을 구분할 수 있어야 후보키가 될 수 있다.기본
          • 학번 슈퍼키와 주민번호 슈퍼키는 속성들이 각 1개씩 이루어져 있다. 하지만 이름+나이 슈퍼키는 이름과 나이를 묶어서 2개의 속성으로 되어 있다. 이름+나이 슈퍼키는 2개 이므로 각 1개의 속성인 주민번호와 학번 슈퍼키가 최소성을 만족한다고 할 수 있다.
          • 따라서 이름+나이 슈퍼키는 갯수가 다른 것보다 많기 때문에 최소성을 만족하지 못해서 후보키가 될 수 없다.
        • 기본키(Primary Key, PK) : 후보키들 중에서 하나를 선택한 키로 최소성과 유일성을 만족하는 속성이다.
          • 테이블에서 기본키는 오직 1개만 지정할 수 있다; 기본키는 테이블 안에서 각 행들을 구별하는 유일한 키로 정해지기 때문이다.
          • 기본키는 NULL 값을 절대 가질수 없고, 중복된 값을 가질 수 없다; 각 행들을 구별하려면 값이 없어선 안되고, 중복되어서도 안되기 때문이다.
        • 대체키(Alternate Key, AK) : 기본키로 선정되지 않은 후보키를 대체키라한다.
          • notion imagenotion image
          • 위 사진을 보자. 7조라는 팀에 팀원은 4명이다. 후보키로 학번과 주민번호가 뽑혔고, 둘 중에서 기본키는 학번이 되었다. 학번이 기본키가 되고 남은 후보키인 주민번호는 대체키가 될 수 있다. 학번 기본키가 없어지게 되면 주민번호는 없어진 기본키를 대체할 수 있게된다.
          • notion imagenotion image
        • 외래키(Foreign Key, FK) : 다른 테이블의 데이터를 참조하여 테이블간의 관계를 연결하는데 사용되는 속성이다.
          • 외래키가 참조할 부모 속성은 기본키여야만 한다. 할당 되기 전에는 null을 허용한다.
          • 참조 무결성을 위해 사용한다 - 다른 테이블의 데이터를 참조할 때 없는 값을 참조할 수 없도록 제약을 주는 것이다.
          • 참조 될 부모 테이블(A)이 먼저 만들어지고 참조하는 자식 테이블(B)에 값이 입력되어야 한다.
          • 이때, 참조될(A) 열의 값은 참조될(A) 테이블에서 기본키(Primary Key)로 설정되어 있어야한다.
          • 외래키는 참조되는 테이블의 기본키와 동일한 키 속성을 가진다.
          • 참조되는 부모테이블이 먼저 생성된 뒤 데이터를 넣고, 참조하는 자식 테이블이 다음에 생겨야된다.
          • 부모 테이블 먼저 삭제될 수 없다. 왜냐하면 부모테이블을 참조하는데 부모테이블이 삭제되면 자식테이블은 참조하는 것이 없어지기 때문에 외래키 오류가 생긴다.
          • 외래키 관계에서 부모테이블을 삭제하려면 자식테이블 먼저 삭제한 후 부모테이블을 삭제해야한다.
          • 아래 사진을 보자. 부모 테이블은 학생 테이블이고, 자식 테이블은 수강 테이블이다.
          • 학생테이블은 학번이 기본키이자 참조되는 참조키이다.
          • 수강테이블은 학번이 참조하는 키이자 외래키이다.
          • notion imagenotion image
  1. NOSQL
      • NoSQL의 장점
        • 대용량 데이터
        • 데이터 분산 처리
        • Cloud Computing
        • 빠른 읽기/쓰기 속도
        • 유연한 데이터 모델링
    1. 키-값형(KV store)
      1. 모든 데이터를 키(Key)와 값(Value)의 쌍으로 매핑한다. Key를 어떻게 인덱싱했느냐에 따라 다르지만 보통 특정 값 하나를 찾아내는 데에는 가장 뛰어난 성능을 보인다. 하지만 데이터를 그룹화하고 정렬하는 기능은 없다시피하다. 대신 RDBMS에 비해 가볍고, 빠르고, 다루기 쉽다.
        언뜻 보면 1차원 데이터만 다룰 수 있을 것 같이 생겼지만 Value에 넣을 수 있는 값이 자기 자신의 Key를 포함하여 Any object이기 때문에(크기 제한은 있을 수 있다) 대부분의 데이터를 다룰 수 있다. 물론 다른 DBMS는 이런 데이터 조직화를 도와주는 각종 도구를 제공하므로 2차원 이상 데이터는 KV store 말고 다른 걸 찾아보는 게 좋다.
        웹 캐시나 세션 데이터, 쇼핑몰의 장바구니 데이터 등을 담는 데에 최적인 DB여서 이쪽으로 활용을 많이 한다. 그 외에 KV store는 데이터베이스의 크기가 상대적으로 작아 메모리에 통째로 올려놓고 구동하는 것도 쉽기 때문에 인-메모리 데이터베이스로 많이 사용된다. 인-메모리 데이터베이스는 그 특성상 매우 고속으로 동작하는 대신 데이터의 안정성을 전혀 보장하지 않는데 장바구니 같은 건 날아가도 상관없는 데이터이면서 반응이 즉시 와야 하는 성격이라 주로 선택된다. KV store로 세션을 처리하는 웹 서버도 하드디스크에 부담을 상당히 덜어주면서 반응이 아주 빠르다. 그러니까 일종의 '임시 데이터' 저장소로서의 입지를 굳게 다지고 있다.
         
    2. 객체형(Object)
      1. 프로그래밍 언어에서 객체지향의 개념이 포함되었듯이, 관계형 데이터베이스 이후, 데이터베이스에서도 객체지향을 구현한 것이 바로 객체형 데이터베이스이다. 이러한 DBMS를 ODBMS라고 한다.
    3. 문서형(Document)
      1. MongoDB의 방식. 위의 객체형과 비슷하다. 문서의 구조를 나타내는 스키마가 필수가 아닌 것이 특징이다.
        스키마가 없기 때문에 인덱스 필드를 제외하고(인덱스를 해제하는 건 가능하다) 필드를 마음대로 넣거나 뺄 수 있다. 기존 데이터에 해당 필드가 있든 없든 상관없고 그런 데이터를 상대로도 조회, 그룹핑 등의 작업이 가능하다.
        객체 지향 프로그래밍이 주류인 현재, 데이터를 따로 매핑할 필요 없이 그냥 집어넣으면 알아서 잘 저장되는 객체형, 문서형 데이터베이스가 주목받고 있다.
        그러나 저장한 상태 그대로의 문서를 뽑아내는 게 아니라 뭔가 데이터를 가공하려고 하면 잘 되지 않는다. 예를 들어 Group by나 Join 쿼리 등. 또한 데이터를 지속적으로 '쌓아 올리는' 응용(예를 들어 금융거래 기록 저장)에서는 성능이 상당히 떨어진다. 이런 건 RDBMS가 가장 잘 하는 분야.
        데이터의 스키마가 자주 바뀌고 데이터가 다계층의 객체 형태이면서 대부분의 업무가 갱신, 삽입(문서단위), 조회에 집중돼있고 통계 연산에 쓰일 일이 많지 않은 곳에서 사용하기 좋다. 통계 연산이 가끔 필요한 곳에서는 필요한 데이터를 추출해 RDBMS에 옮기고 SQL로 처리한다. 아니면 DBMS에서 자체 제공하는 map/reduce 연산을 쓰던지.
        한마디로 바인더 서류철과 비슷한 성격을 가졌다. 바인더철에 추가로 종이를 꽂거나(삽입), 꽂힌 종이를 다른 걸로 갈아넣거나(갱신), 종이를 찾거나(조회) 하는 일에는 뛰어나지만 한 종이 안에 적힌 데이터가 계속 늘어나거나(추가), 여러 종이에 걸쳐 있는 어떤 값을 다 더하거나(통계) 하는 일에는 취약하다. RDBMS는 여기서 '종이'에 해당하는 놈이 무한한 두루마리와 같아서 데이터의 추가 작업이나 특정 필드를 대상으로 한 통계 및 그룹화 작업이 쉽다. 대신 RDBMS는 2차원을 넘어가는 데이터(트리 구조 데이터 등)를 저장할 때 두루마리를 여러 개 준비해야 하는 게 단점이다. 중간에 형식이 다른 데이터를 끼워넣는 건 불가능하고. 문서형 DB는 종이 하나에 모든 관련 데이터를 다 담아두므로 다른 종이에 무슨 데이터가 어떻게 저장되든 상관하지 않는다. 조회를 위한 인덱스만 하나 이상 있으면 OK.
    4. 컬럼 패밀리형(Column Family)
      1. 컬럼 패밀리는 컬럼들의 집합이다. 해쉬 테이블을 생각하면 되는데,하나의 테이블에 식별하기 위한 Key와 여러개의 컬럼이 달려 있는 형태의 컬럼 패밀리이다.
        관계형은 하나의 테이블에 식별이 가능한 기본키와 어러개의 컬럼을 가질 수 있지만 기본키는 필수가 아니고 같은 종류의 컬럼을 가져야 한다. Hive가 대표적인 컬럼 패밀리형 DB이다.
        컬럼 패밀리형은 관계형 데이터베이스에 비해 데이터를 검색, 분석을 빠르게 할 수 있도록 다양한 서버와 네트워크 시스템을 이해하고 구축해야 한다. 이에 따라 초보자는 클라우드 컴퓨팅 서비스로 제공되는 제품으로 가져다 쓰는 것이 좋다.
         

3) DBMS(DB Management System)

DBMS is 데이터베이스관리시스템
데이터베이스를 관리하며 응용 프로그램들이 데이터베이스를 공유하며 사용할 수 있는 환경을 제공하는 소프트웨어. 응용 프로그램들이 데이터베이스에 접근할 수 있는 인터페이스를 제공하고 장애에 대한 복구 기능, 사용자 권한에 따른 보안성 유지 기능 등을 제공
대표적인 DBMS
DBMS 종류
특징
구분
- 오라클이 만들어 판매 중인 상업용 데이터베이스 - Window, Linux, Unix 등 다양한 운영체제에서 설치 가능 - MySQL, MSSQL 보다 대량의 데이터를 처리하기 용이 - 대기업에서 주로 사용하며, DB 시장 점유율 1위 - 비공개 소스에 폐쇄적인 운영, 고비용
관계형
- MySQL사에서 개발, 현재 오라클에 합병됨 - Window, Linux, Unix 등 다양한 운영체제에 설치 가능 - 오픈소스로 무료 프로그램(상업적 사용 시 비용 발생) - 중소기업에서 주로 사용하며 상대적으로 비용이 저렴 - 5천만 건 이하의 데이터를 다루는 데 적합
관계형
- MySQL이 오라클에 합병된 후 불확실한 라이선스 문제를 해결하려고 나온 RDBMS - 언어는 C++ - MySQL과 동일한 소스 코드 기반 - MySQL보다 처리 속도가 더 빠름
관계형
- MS사에서 개발한 상업용 데이터베이스 - 비공개 소스에 폐쇄적인 운영(리눅스 버전은 오픈소스) - 다른 운영체제에도 사용 가능하지만 윈도우 환경에 특화 - 중소기업에서 주로 사용
관계형

4) RDBMS(Relational DBMS)

위에 언급한 DBMS 중 RDBMS(관계형 데이터베이스 관리 시스템)가 가장 기본이고 많이 쓰입니다. RDBMS는 아래와 같은 공통점을 가지고 있습니다.
  • 테이블 기반의 DBMS
  • 테이블과 테이블 간의 연관관계(외래키)를 이용해 필요한 정보를 구하는 방식
  • 엔티티-관계 모형(ERM)을 사용

3. ERM과 스키마

1) ERM

데이터의 구조를 엔티티(개체)와 관계라는 개념으로 설명하는 모형
 
교육생
교육생 번호
이름
나이
플랫폼
성격
전태규
37
아프리카
리더십있음
베이식
35
유튜브
근성있음
공혁준
28
트위치
인성문제있음
가브리엘
26
트위치
개인주의
꽈뚜룹
25
트위치
악바리
김재원
23
트위치
성실함
플랫폼
플랫폼이름
국가
주 서비스
미국
스트리밍
미국
스트리밍
한국
영상공유
최근 종영했지만 아직까지 밈으로서 네티즌 사이에 회자되고 있는 유튜브 '가짜사나이' 콘텐츠로 ERM을 설명해 보겠습니다. 여기 '교육생'이라는 이름의 테이블이 있습니다. 이 명부에는 '1번 교육생', '2번 교육생', ... , '6번 교육생'의 데이터가 6행으로 기록되어 있습니다.
엔티티는 "독립적으로 존재하면서 고유하게 식별이 가능한 실세계의 객체"입니다. 여기선 6명의 교육생이 "교육생"이라는 엔티티를 이루고 있습니다. 이 엔티티는 '속성(Attribute)'을 가질 수 있습니다. 속성은 엔티티의 특징이나 상태를 기술합니다. 교육생 엔티티는 교육생 번호, 이름, 나이, 플랫폼, 성격이라는 속성을 가지고 있네요. 이 중에서 교육생 번호라는 속성은 각 교육생이 중복으로 가질 염려가 없고 이 속성이 각 교육생을 분별할 수 있게 해주는 기준이 되므로 '키 속성'이라 할 수 있습니다. 교육생 중에 전태규가 2명일 수는 있어도 1번 교육생이 2명일 가능성은 없기 때문입니다. 여기까지가 가짜사나이 교육생 명부를 '엔티티'라는 개념을 사용해 설명한 것입니다. 이제 '관계'를 설명할 차례입니다.
교육생 엔티티에는 '플랫폼'이라는 속성이 있습니다. 사실 이 속성은 '플랫폼'이라는 엔티티에서 플랫폼 이름을 참조해 온 것입니다. 말하자면 교육생과 플랫폼 엔티티는 '활동'이라는 관계로 이어져 있습니다. 각 교육생이 해당 플랫폼에서 '활동'하고 있으니까요. 3명의 교육생이 '트위치'라는 속성값을 동시에 참조하는 것으로 보아 일 대 다(1:N) 형태의 관계라고 할 수 있겠습니다. 이렇게 데이터끼리의 관계를 엔티티와 관계의 개념으로 설명하는 것을 ERM 이라 하고 이 모델을 다이어그램으로 표현한 것을 ERD라고 합니다.
ERD 예시ERD 예시
ERD 예시

2) 스키마

데이터베이스 상에서 엔티티와 속성, 엔티티끼리의 관계, 그 관계의 제약조건 등을 기술한 것으로 외부 스키마, 개념 스키마, 내부 스키마로 구분됩니다.
 
  • 외부스키마: 사용자가 본인의 입장에서 필요로 하는 데이터베이스의 논리적 구조를 정의한 것
💡
말이 어렵지만 예를 들면 이렇습니다. 전화번호부 데이터베이스가 있다고 할 때, 사용자가 이 데이터베이스를 이용하는 건 적혀있는 모든 전화번호를 조회하기 위함이 아니라 본인이 찾고 싶은 전화번호를 조회하기 위함일 것입니다. 이때 사용자는 필요한 전화번호를 얻기 위해 지역, 업종과 같은 조건을 걸어 조회결과 범위를 좁힐 것이고 좁혀진 범위의 데이터 베이스를 얻게 될 것입니다. 이것을 외부 스키마라 합니다.
  • 개념스키마: 데이터베이스의 전체적인 논리적 구조로서, 개체 간의 관계나 제약 조건을 나타내고 데이터베이스의 접근 권한, 보안 및 무결성 규칙에 관한 명세를 정의한다.
💡
ERM을 구체적으로 명시한 것을 개념 스키마라고 이해하시면 됩니다.
  • 내부스키마: 실제로 데이터베이스에 저장될 레코드의 물리적인 구조를 정의하고, 저장 데이터 항목의 표현 방법, 내부 레코드의 물리적 순서 등을 나타낸다.
💡
일반 데이터베이스 이용자는 본인이 입력하는 데이터를 어떤 테이블에 삽입할지만 고려하지 데이터베이스가 있는 하드디스크의 어떤 부분에 저장할지는 고려하지 않습니다. 내부스키마는 바로 이런 물리적 차원의 데이터베이스 구조를 뜻합니다.

4. 뷰와 인덱스

뷰와 인덱스는 기본 테이블에서 원하는 데이터를 보다 편리하고 빠르게 찾기 위해 깔아둔 '밑밥'이라고 할 수 있습니다. 기본 테이블을 기반으로 어떤 사전작업을 해두는 것이고, 그 사전작업 덕분에 우리는 기본 테이블에서 원하는 데이터를 쉽고 빠르게 얻을 수 있는 것이지요.

1) 뷰

1년이 갓 넘은 경력이지만, 실무에서 '뷰'라는 용어를 접한 경험이 딱 한 번 있었습니다.
제가 다니는 회사에서 유지보수를 담당하는 A고객사가 있습니다. A고객사의 회원 정보는 우리가 아닌 B시스템즈에서 관리하고 있습니다. A고객사가 우리에게 어떤 기능 개발을 의뢰했는데 사용자가 로그인을 해야 사용할 수 있는 기능이라 B시스템즈에서 관리하는 회원정보 DB에 접근해야 했습니다.
A고객사와의 커뮤니케이션을 담당하고 있는 저는 B시스템즈의 담당자에게 메일을 보내 고객사 의뢰로 회원DB에 대한 접근 권한이 필요한데 어떻게 열어줄 것인지 의견을 구했습니다. "뷰를 만들어 그 뷰에 대한 접근 권한을 열어 주겠다"는 회신을 받았습니다.
뷰는 데이터를 가지고 있는 테이블에서 파생된 '가상테이블'입니다. 뷰를 설명하는 좋은 예가 있습니다. 방 안에서 창문을 통해 바깥에 있는 소나무 한 그루를 본다고 합시다. 창문은 자신의 크기 만큼 풍경을 축소하는 반면, 보고 싶었던 소나무를 확실히, 그리고 편히 볼 수 있게 해줍니다. 방문과 현관문을 열어 집 밖으로 나가지 않아도 고개만 돌리면 그 소나무를 볼 수 있게 해 주는 것이지요. 이렇듯 원하는 데이터를 얻기 위해 복잡한 절차를 생략하게 해주는 것이 '뷰'입니다. 예시를 보겠습니다.
학생정보
출석번호
이름
몸무게
1중간평균
1기말평균
2중간평균
2기말평균
김일
171
67
61
70
80
85
김이
170
70
62
71
81
86
김삼
169
49
63
72
82
87
김사
169
80
64
73
83
88
김오
184
75
65
74
84
89
김육
183
90
66
75
85
90
김칠
156
56
67
76
86
91
김팔
149
50
68
77
87
92
김구
176
65
69
78
88
93
김십
172
66
70
79
89
94
💡
위와 같이 출석번호를 키속성으로 하는 '학생정보'라는 테이블이 있다고 합시다. 우리는 이 테이블에서 1학기 중간평균이 65보다 큰 학생들의 각 시험평균점수가 궁금합니다. 그래서 아래와 같이 질의합니다. 아직 SQL을 다루지 않았으므로 자연어로 대체합니다. "학생정보 테이블에서 이름, 1중간평균, 1기말평균, 2중간평균, 2기말평균 데이터를 가져오는데 1중간평균이 65이상인 학생의 데이터만 가져와. 그 조회결과로 뷰를 만들건데 이름을 '쫌하는애들점수'로 하겠어. 이 뷰는 읽기전용이고 편집을 못하게 할거야." 그럼 아래와 같은 뷰가 만들어집니다. 겉보기엔 일반 테이블과 차이가 없지만 엄연히 자체적으로 데이터를 갖고 있지 않은, 뷰입니다.
쫌하는애들점수
이름
1중간평균
1기말평균
2중간평균
2기말평균
65
74
84
89
66
75
85
90
67
76
86
91
68
77
87
92
69
78
88
93
70
79
89
94
만약 뷰를 만들지 않은 상태에서 '1학기 중간 평균이 65점 이상인 학생 중 2학기 중간 평균이 87점 이상인 학생의 이름'을 알고 싶다면 어떻게 질의해야 할까요.
학생정보 테이블에서 1학기 중간 평균이 65점 이상인 학생의 정보를 질의한 후, 거기서 다시 2학기 중간평균이 87점 이상인 학생의 이름을 질의해야 합니다.
하지만 뷰를 사용하면 그냥 "쫌하는애들점수" 뷰에서 2학기 중간평균이 87점 이상인 학생의 이름을 질의하면 됩니다. 고개만 돌려 창문이 보여주는 소나무를 쳐다보기만 하면 된다는 것은 이런 의미입니다. 이미 창문이 소나무를 보여주게끔 위치해 있기 때문입니다. 다만 이 창문의 예시가 뷰를 완전히 설명해 주진 못합니다. 우리가 창문을 본다고 풍경에 어떤 변화를 주지는 못하지만, 뷰를 통해서 참조하고 있는 데이터를 제한적으로나마 수정할 수는 있기 때문입니다. 하지만 시간 상 여기서 다루진 않겠습니다.
처음 소개했던 제 경험을 다시 불러오겠습니다. B시스템즈의 담당자는 왜 전체 회원 DB에 대한 접근을 열어주지 않고 뷰를 만들어주었을까요? 전체 회원 DB엔 저희가 기능 개발을 위해 필요한 데이터 말고도 다른 데이터들이 있습니다. 우리에겐 '불필요한 것'입니다. 그리고 DB에 대한 접근을 허용하면 저희가 아무 질의를 통해 DB를 수정할 수 있습니다. B시스템즈에겐 '위험한 상황'입니다.
요약하자면, '불필요한' 데이터를 미리 제거해주고 '위험한 상황'을 미연에 방지해 주는 것이 뷰입니다. 물론 B시스템즈는 저희를 배려해 주기보단 본인들에게 위험한 상황이 생기는 것을 막기 위해 뷰를 제공했을 겁니다.

2) 인덱스

인덱스는 그것의 역할만 알고자 한다면 쉬운 개념이고 그 역할을 어떻게 하는지 알려면 복잡한 개념입니다. 우리는 쉬운 개념을 가져가되, 훗날 심화 학습을 위한 떡밥으로 인덱스의 대표적인 구조인 B-Tree 구조를 맛보고 넘어가겠습니다.
행이 100만개에 달하는 전화번호부 테이블을 상정하겠습니다. 여기서 A라는 조건에 맞는 전화번호를 찾고 싶습니다. 이렇게 질의할 수 있겠습니다.
"테이블에서 서울지역의 전화번호 가져와."
그럼 1번째 행에서 시작해 79만번째에서 원하는 전화번호를 찾았더라도 그 뒤로 조건을 만족하는 전화번호를 더 찾을 수 있기 때문에 결국 100만 번의 조회를 마친 후에 우리는 서울의 전화번호 목록을 얻을 수 있습니다.
하지만 인덱스를 만들어 두었다면 DBMS는 이렇게 조회를 합니다.
"서울지역의 전화번호는 50만번째에서 시작하고 70만 1번째부터는 다른 지역이네? 그럼 50만번째 데이터에서부터 조회를 시작하면 되겠다."
50만번째에서 조회를 시작하면 70만 번째에서 조회가 끝날 테니 처리 시간이 절반 이상 줄어들었습니다. 여기까지가 인덱스의 역할에 대한 설명입니다.

B-Tree

B-Tree는 대표적인 인덱스의 작동 방식입니다. B는 Balanced의 B이며, Tree는 탐색 방식이 트리 구조를 따른다는 의미입니다. 트리 구조란 하나의 뿌리(루트)로부터 가지(브랜치)를 거쳐 나뭇잎(리프)에 이르는 탐색 방식을 말합니다.
B-Tree는 어떤 값을 찾더라도, 즉 어떤 리프 블록에 도달하더라도 인덱스 루트에서 리프 블록에 도달할 때 거치는 블록 수가 동일하기에 Balanced 하다고 말하는 것입니다.
위의 전화번호부 예시로 설명하자면 인덱스를 사용하기 위해선 당연하게도 사전에 인덱스를 만들어야 합니다. '지역'을 기준으로 생성된 인덱스에는 가나다순으로 지역명이 정렬되어있고 전화번호부 상에서 그 지역명을 가지고 있는 전화번호의 위치값이 매핑되어 있습니다.
전화번호부 인덱스_지역
위 인덱스가 알려주는 것은 전화번호부 테이블에서 지역이 서울시인 데이터가 1행 있는데(실제로는 한 줄만 있을리가 없지요.), 그 행의 rowid가 10이라는 점입니다. 아무튼 그럼 DBMS는 질의문을 이렇게 번역해 이해합니다.
"rowid가 10인 행 가져와."
위 질의에 DBMS는 "지역이 '서울'인 행 가져와"와 다른 방식으로 반응합니다. '지역'과 같은 일반 속성으로 조건을 건다면 DBMS는 처음부터 끝까지 조회하지만 'rowid'가 조건이라면 딱 그 rowid를 가지고 있는 행만을 찾아 가지고 옵니다. rowid라는 값이 특수한 값이기 때문입니다. rowid는 테이블에서 특정 데이터(행)의 위치를 구분해 주는 ID이자 그 데이터를 가리키는 주소입니다. 이 rowid를 DBMS에게 알려주면 DBMS는 눈을 감고도 그 행을 콕집어 보여줄 수 있습니다.
notion imagenotion image
B-Tree구조에 따르면 루트 블록에서 시작해 서울시가 7번블록에 있다는 것을 알아내면 1~6번 블록은 건너뛰고 바로 7번블록부터 탐색을 시작할 것입니다. 그리고 서귀포시가 나오는 그 순간 조회를 멈추고, 조건에 부합하는 rowid(22)를 가진 행을 가져올 것입니다. 그렇다면 "rowid가 22인 행 가져와"라는 질의가 가능해지고, 원하는 데이터를 얻기까지의 여정이 엄청나게 줄어드는 것이지요. 여기까지가 인덱스가 작동하는 방식에 대한 설명입니다.

5. SQL

SQL은 Structured Query Language, 그러니까 DB를 조회하기 위해 질의문을 DBMS가 이해할 수 있도록 구조화된 언어를 말합니다. DBMS에서 사용하는 프로그래밍 언어라고 이해하시면 됩니다.
우리는 앞서 DB의 개념들을 이해하기 위해 질의문을 자연어로 표현했는데요. 그 질의문들을 SQL로 표현하면 다음과 같습니다.
/* 학생정보 테이블에서 이름, 1중간평균, 1기말평균, 2중간평균, 2기말평균 데이터를 가져오는데 1중간평균이 65이상인 학생의 데이터만 가져와. 그 조회결과로 뷰를 만들건데 이름을 '쫌하는애들점수'로 하겠어. 이 뷰는 읽기전용이고 편집을 못하게 할거야. */ CREATE VIEW 쫌하는애들점수 AS SELECT 이름, 1중간평균, 1기말평균, 2중간평균, 2기말평균 FROM 학생정보 WHERE 1중간평균 >= 65 WITH READ ONLY; -- 테이블에서 서울지역의 전화번호 가져와. SELECT 전화번호 FROM 전화번호부 WHERE 지역='서울' -- 전화번호부에서 지역을 기준으로 인덱스 생성하기 CREATE INDEX IDX_LOCATION ON 전화번호부(지역);
SQL을 처음 접하셨다면 위 질의문에 나와있는 영어단어들이 어떤 의미인지 바로 이해되는 것도 있고 그렇지 않은 것도 있으실 텐데요. 설명하기 전에 SQL의 기본 개념을 설명하겠습니다.

1) SQL의 종류

SQL문은 그 역할에 따라 아래의 종류로 구분됩니다. ● 데이터 정의어(DDL, Data Definition Language) ● 데이터 조작어(DML, Data manipulation Language) ● 데이터 제어어(DCL, Data Control Language) 전체적인 맥락을 잡아드리면 이렇습니다. 테이블을 만드는 명령문(DDL)이 있고, 만든 테이블에 값을 입력하는 명령문(DML)이 있고, 그 테이블의 접근 권한을 설정하는 명령문(DCL)이 있습니다. 하나씩 살펴보겠습니다.

(1) 데이터 정의어(DDL, Data Definition Language)

데이터 정의어를 통해 테이블을 만들거나 삭제하고, 테이블의 스키마를 정의할 수 있습니다.
 
  • CREATE: 테이블을 생성
CREATE TABLE STUDENT( STUDENT_NUM NUMBER(3) AUTO_INCREMENT PRIMARY KEY, STUDENT_NAME VARCHAR(10) NOT NULL, STUDENT_CIRCLES VARCHAR(20), STUDENT_BIRTH DATE NOT NULL CONSTRAINT ID_PK PRIMARY KEY (STUDENT_ID) );
STUDENT
STUDENT_NUM
STUDENT_NAME
STUDENT_CIRCLES
STUDENT_BIRTH
  • ALTER: 테이블의 속성을 변경(컬럼 추가 등)
ALTER TABLE STUDENT ADD STUDENT_ADDRESS VARCHAR2(30);
STUDENT
STUDENT_NUM
STUDENT_NAME
STUDENT_CIRCLES
STUDENT_BIRTH
STUDENT_ADDRESS
 
  • RENAME: 테이블의 이름을 변경
RENAME STUDENT TO STUDENT_INFO;
STUDENT_INFO
STUDENT_NUM
STUDENT_NAME
STUDENT_CIRCLES
STUDENT_BIRTH
STUDENT_ADDRESS
  • DROP: 테이블, 제약조건, 인덱스, 뷰 등 DB 객체를 삭제
DROP TABLE STUDENT_INFO;

(2) 데이터 조작어(DML, Data manipulation Language)

게시판에 글을 올릴 때, 제목, 내용 등을 입력하고 [등록] 버튼을 클릭하면 잠시 흰 화면이 뜨는 듯 하다가 '등록되었습니다.' Alert창이 뜨고 게시판 목록이나 작성된 게시물의 상세화면으로 이동하는 것을 보셨을 겁니다. Alert 창이 뜨기 전 흰 화면에서는 게시판 DB의 각 제목, 내용, 작성일, 작성자 등의 컬럼에 값을 입력하는 DML문이 실행됩니다. DML문은 이렇게 테이블 안에 들어가는 데이터 값의 생성, 수정, 삭제 그리고 조회를 위해 실행하는 SQL 구문입니다.
  • INSERT: 테이블에 레코드를 입력
INSERT INTO STUDENT_INFO( STUDENT_NAME, STUDENT_CIRCLES, STUDENT_BIRTH, STUDENT_ADDRESS ) VALUE( '홍길동', '활빈당', '91/01/16', '서울시 은평구' );
STUDENT_INFO
STUDENT_NUM
STUDENT_NAME
STUDENT_CIRCLES
STUDENT_BIRTH
STUDENT_ADDRESS
홍길동
활빈당
91/01/16
서울시 은평구
  • UPDATE: 입력된 레코드 값을 수정
UPDATE STUDENT_INFO SET STUDENT_ADDRESS = '서울시 마포구' WHERE STUDENT_NUM = 1 ;
STUDENT_INFO
STUDENT_NUM
STUDENT_NAME
STUDENT_CIRCLES
STUDENT_BIRTH
STUDENT_ADDRESS
홍길동
활빈당
91/01/16
서울시 마포구
  • SELECT: 입력된 레코드 값을 조회
SELECT STUDENT_NAME, STUDENT_CIRCLES FROM STUDENT_INFO WHERE STUDENT_NUM = 1 ;
조회결과
STUDENT_NAME
STUDENT_CIRCLES
활빈당
  • DELETE: 입력된 레코드 값을 삭제
DELETE FROM STUDENT_INFO WHERE STUDENT_NUM = 1 ; SELECT * FROM STUDENT_INFO ;
조회결과
STUDENT_NUM
STUDENT_NAME
STUDENT_CIRCLES
STUDENT_BIRTH
STUDENT_ADDRESS

(3) 데이터 제어어(DCL, Data Control Language)

서두에서 DB란 Data+Base, 즉 데이터의 기지라고 설명했습니다. 분대 > 소대 > 중대의 군대조직과 같이 DB도 값이 모여 한 줄의 데이터 행을 이루고 그 데이터 행이 모여 하나의 테이블을 구성하고 그 연관된 테이블들이 모여 하나의 '데이터베이스'를 이룹니다. 테이블 보다 상위 계층인 데이터베이스를 설명하기 위해 군대의 예시를 들었습니다.
데이터 제어어는 데이터베이스의 최고 권한 사용자가 각 사용자에게 특정 데이터베이스를 이용할 권한을 부여, 박탈하는 데 사용됩니다. 그리고 데이터베이스 연산작업을 저장하거나 원복하는데에도 사용됩니다. 개발자 분들과 일해보셨다면 커밋이나 롤백이라는 단어를 들어보신 적이 있으실 겁니다.
  • GRANT: 특정 사용자에게 특정 데이터베이스의 이용 권한을 부여
/* 모든 ip로 접속하는 YEONGGI 사용자에게 SCHOOL DB의 STUDENT_INFO 테이블에 대한 모든 권한 부여 */ GRANT ALL PRIVILEGES ON SCHOOL.STUDENT_INFO TO YEONGGI@'%'IDENTIFIED BY 'PASSWORD'; /* '197.240'으로 시작하는 IP로 접속하는 YEONGGI 사용자에게 SCHOOL DB의 모든 테이블에 대해 SELECT 질의만 할 수 있는 권한 부여 */ GRANT SELECT ON SCHOOL.* TO YEONGGI@'197.240.%' IDENTIFIED BY 'PASSWORD';
  • REVOKE: 특정 데이터베이스에 대한 특정 사용자의 이용 권한을 박탈
REVOKE ALL PRIVILEGES ON SCHOOL.STUDENT_INFO TO YEONGGI@'%' ;
COMMIT과 ROLLBACK를 설명하기 위해선 '트랜잭션'이라는 용어를 설명해야 합니다.

트랜잭션

트랜잭션은 연관된 데이터연산의 집합으로, 데이터베이스가 수행하는 논리작 작업의 가장 작은 단위가 됩니다.
가장 많이 사용되는 예가 '계좌이체'입니다. 간편한 은행 어플을 통해 상대방에게 10,000을 이체하면 DB상에선 어떤 연산이 이뤄질까요?
💡
1. 내 계좌에 10,000이 차감된다. 2. 상대방 계좌에 10,000이 추가된다.
내 계좌에서의 차감, 상대방 계좌에서의 추가는 '계좌이체'라는 논리적 작업의 가장 작은 단위입니다. 저 두 연산이 하나의 '트랜잭션(Transation)'을 이루는 것이지요.
  • COMMIT: 트랜잭션의 처리 결과를 데이터베이스에 영구저장(기본적으로 AUTOCOMMIT 설정되있어 데이터조작 시 따로 COMMIT할 필요가 없음)
  • ROLLBACK: 트랜잭션의 처리 결과를 취소하고 이전 COMMIT한 시점으로 데이터 상태를 원복함

ACID

처음 데이터베이스의 특징을 소개하며 '실시간 접근성'과 같은 특성을 소개했는데요. 방금 소개한 트랜잭션에도 중요한 특성이 있습니다. 영단어의 앞글자를 따 'ACID'라고 하는데 간단히 그 의미만 소개하겠습니다.
  1. Atomicity(원자성): 트랜잭션을 이루는 모든 연산은 모두 실행되거나, 아예 실행되지 말아야 합니다. 트랜잭션은 작업의 가장 작은 단위이기 때문입니다. 위의 예를 따른다면 차감만 되고 상대방 계좌에 추가가 안되는 일은 있어선 안된다는 의미입니다.
  1. Consistency(일관성): '계좌이체'라는 트랜잭션을 이루는 연산의 내용은 미리 정의된 규칙을 따라야 하며, 성공적으로 수행되면 그 데이터베이스 상태가 일관성이 있어야 한다는 뜻입니다. 계좌에 숫자가 아닌 문자가 입금되는 일이 없어야 한다는 의미입니다.
  1. Isolation(독립성): 트랜잭션이 수행되는 동안 다른 트랜잭션의 연산작업이 끼어들어 수행 중인 트랜잭션에 영향을 주면 안 됩니다. 두 사람 간의 계좌이체가 100번 연속으로 이뤄지는 트랜잭션이 있다고 할 때 DB관리자라 할지라도 트랜잭션이 수행되는 동안 그 중간 데이터를 확인할 수 없다는 의미입니다.
  1. Durability(지속성): 성공적으로 수행된 트랜잭션의 결과는 안정적으로 보존되어야 한다는 특성으로, 이에 따르면 모든 트랜잭션은 로그로 남아야 하고 장애 발생 시 발생 전으로 되돌릴 수 있어야 합니다.

6. DB 설계의 역사와 현재 트랜드

  • 60년 이전 : 컴퓨터가 개발된 초기 시대에는 데이터는 종이 테이프(Paper tape), 천공 카드(Punched card), 자기 테이프(magnetic tape)와 같은 순차적으로 정보를 저장하는 미디어 장비에 저장하였다. 그 결과 초반 정보 관리를 위한 노력은 파일의 구조와 정렬을 위한 알고리즘 개발을 중심으로 이루어졌다.
  • 1960년대 초반 : GE(General Electric)의 Bachman에 의해 개발된 Integrated Data Store(IDS)이라는 최초의 범용 데이터베이스 관리 시스템이 소개되어 많은 인기를 끌었다. IDS의 개발은 CODASYL(the Conference on Data Systems Language)의 표준 데이터 모델 개발을 위한 주요 원동력이 되었다.
  • 1960년대 중반 : 디스크와 메모리 개발에 의한 용량 증가와 가격 하락은 많은 양의 데이터 저장과 최적화된 데이터 접근을 가능하게 하였으며, IBM은 대규모 데이터베이스에 데이터 통신 기능이 추가된 정보관리시스템(IMS)를 출시하였다. IMS는 아메리카 항공과 협력하여 항공 예약 시스템 SABRE 개발에 사용되었다. IMS는 네트워크 기반 설계로 많은 사용자들의 동시 접속을 지원하였다.
  • 1970년대 초중반 : 대표 컴퓨터 생산업체에서 각 업체별 메인 데이터베이스 시스템을 생산해 공급하였으며, 주요 학술 연구 영역에서 데이터베이스 시스템 연구가 활발하게 이루어졌다. 에드거 F 커드(E.F Codd)는 모든 데이터베이스 이론의 기초가 되는 관계형 모델(Relational Model)을 발표하였으며, 1975년 크리소토퍼 J 데이트(C.J Date)에 의해 최초로 관계형 데이터베이스 서적이 출판되었다. 같은 시기 피터 첸(Peter Chen)은 객체-관계 모델 데이터 설명을 다이어그램으로 표현하는 방법을 제안하였다.
  • 1970년대 후반 : 관계형 모델은 주요 산업과 학술 연구 활동의 주제가 되었으며, IBM의 시스템 R 그룹에서 관계형 데이터베이스가 성능저하 없이 응용프로그램의 요청을 유동적으로 처리할 수 있다는 것을 보여주었고, 효과적인 클라이언트-서버 모델, 동시 접속 사용자 와 대용량 데이터 처리, 질의어 최적화에 의한 성공적인 성능향상을 시연해 보여주었다.
  • 1980년대 초반 : 오라클(Oracle), 인그레스(Ingres), 사이베이스(Sybase), 인포믹스(Informix)등 관계형 데이터베이스 시스템을 개발하는 소프트웨어 회사들이 아주 많아 졌으며, 성능저하 없이 하드웨어 독립적인 데이터베이스 시스템 개발이 가능하다는 것을 보여주었다. 80년대는 PC(Personal Computer)의 대중화가 본격화 되면서 DBase, Paradox 같은 PC용 데이터베이스 시스템이 개발되었다.
  • 1980년대 : 1985년 최초의 표준 SQL 언어가 발표되었다. 데이터 정의어(DDL), 데이터 조작어(DML)의 표준화는 신생 데이터베이스 소프트웨어 산업의 신뢰를 증대시켰다.
  • 1990년대 : 대략 1990년 중반기를 전후하여 오픈 시스템인 클라이언트 서버 환경으로 전환되면서 그때까지 활용하였던 파일 시스템과 계층형 데이터베이스가 관계형 데이터베이스로 빠르게 전환되었다. 90년대 후반에 들어와서는 데이터베이스와 관계형 데이터베이스가 동의어로 느껴질 정도로 모든 분야에서 관계형 데이터베이스가 유일무이하게 사용되면서 오라클의 경우 세계에서 두 번째로 큰 소프트웨어 업체로 급부상하게 되었다. 데이터베이스에 대한 산업분야와 학문분야에서의 방대하고 활발한 연구는 누구도 예상하지 못할 정도로 품질과 관계형 모델의 응용력을 향상시켰다.
  • 2000년대 : 객체지향 파라다임이 등장하면서 기존 관계형 DBMS의 공급업체들도 시장을 점유하기 위해 관계형 DBMS에 객체지향의 기능을 지원하는 ORDBMS(객체관계형 DBMS)로 전환하였다. 그러나 C나 코볼(COBOL)과 같은 구조적 개발 언어를 이용하여 시스템을 구성하는 세대에서 C++과 자바(JAVA)와 같은 객체지향 개발 언어로 시스템을 구성하는 것이 일반화된 반면, 데이터베이스는 ORDMS를 많이 사용하지만 기능은 대부분 RDBMS를 사용하고 있는 것이 2000년 초기 정보 기술의 추세다.
    • 2000년 중반 부터 클라이언트 서버 환경에서 웹 환경의 시스템으로 시스템의 구성 흐름과 개발 방법론이 바뀌어 적용되는 것이 일반화되었으나 DBMS의 구조는 객체지향형 DBMS로 전환되지 않고 역시 4세대 DBMS인 관계형 DBMS를 여전히 사용하고 있다.
      객체지향 기반의 데이터베이스는 XML과 지리정보시스템인 GIS 시스템에서 주로 쓰이고 있으며 일반적인 기업의 업무를 처리하는 단위에서는 대부분 관계형 데이터베이스를 활용하여 정보 시스템을 구성하고 있다.
  • 2010년대 : 모바일 혁명과 클라우드-빅데이터의 등장으로 말미암아 관계형 데이터베이스의 여러 규칙들을 크게 파훼시킨 NOSQL이 모바일과 클라우드에서 대두되었다.

7. 상황에 따라 적합한 DB 구조 고르는 길라잡이

RDBMS 고르기
국내에서 사용하는 RDBMS는 우리가 흔히 알고 있는 오라클, MS-SQL서버, MySQL을 사용하고 있다. 일반적으로 개인적 학습과 소호몰과 같은 작은 단위에서는 오픈소스인 MySQL을 많이 사용하고 학교, 기업, 관공서에서는 대용량 데이터를 처리하기 위한 엔터프라이즈급 데이터베이스인 오라클, MS-SQL서버, IBM DB2를 많이 이용하고 있다. 최근에는 개인 프로젝트 중심으로 MySQL 대신 MariaDB 를 쓰는 경우도 많아졌다.
  • MS-SQL Server / Microsoft
마이크로소프트 (Microsoft)사의 대표적인 관계형 데이터베이스 시스템이다. 1989년에 최초로 발표되었으며, 역시 MS제품군이기 때문에 window server에서만 구동이 되고 C#과는 가장 높은 호환성을 자랑하는 DBMS이다. 성능에 따라 엔터프라이즈 에디션(enterprise edition) 비즈니스 인텔리젼스 에디션(business intelligence edition) 스탠다드 에디션(standard edition) 익스프레스 에디션(express edition)으로 나뉘게 된다.
  • MySQL / Oracle (구 Sun)
썬 마이크로시스템즈에서 개발한 관계형 데이터베이스 시스템이다. 유닉스나 리눅스, 윈도우 운영 체제 등에서 사용할 수 있으며 무엇보다 오픈소스의 장점으로 많은 기업에서 홈 페이지나 쇼핑몰 등 일반적인 웹 개발에 널리 이용되고 있다.2008년 SUN에 인수되었으며, 2009년 Oracle에서 SUN을 인수함에 따라 자연스럽게 Oracle의 소유가 되었다. 아직 오픈소스를 유지하고 있지만, 오라클에 비해 사용자 편의를 위한 기능, 사용자 실수 또는 재해에 대비한 기능, 성능향상등,, 기능적인 한계를 보이고 있다. 다만 오픈소스이기 때문에 현재 많은 기업에서 활용하고 있다.
  • Maria DB / MariaDB 재단
마리아 DB는 2009년에 발표되었으며 비교적 역사가 짧다. 탄생배경은 My-SQL이 오라클에 인수되면서 시작이 되었다고 한다. 오라클에서 My-SQL을 인수,, 아무래도 무료버전인 My-SQL보다 주력 상품인 Oracle을 팔아야 하는 입장에서 오픈소스인 My-SQL의 기능을 감소시키게 되었다. 이에 My-SQL을 개발한 마이클 몬티 와이드니어스 (Michael Monty Widenius)는 오라클과의 의견 충돌로 회사를 나와 새롭게 MariaDB를 개발하였다고 한다. My-SQL과 완벽하게 호환되며 기본적인 명령어나 사용방법까지 동일하기 때문에 개발자 또는 DBA 가 쉽게 접할 수 있으며, My-SQL에 비해 성능적인 부분에서는 70%나 향상이 되었기 때문에 현재 Maria DB를 활용하는 기업들이 많이 늘어나는 추세이다.
  • DB2 / IBM
대형화된 데이터 관리를 목적으로 만들어진 IBM의 관계형 데이터베이스 관리 시스템이다. 1983년에 발표되었으며, 사용자들이 서로 관계된 여러 개의 데이터베이스를 동시에 접근할 수 있다. DB2의 특징은 각 워크로드(업무)의 특성에 맞게 시스템이 최적화될 수 있으며, 자가 최적화 , 자가 치유, 자가 구성 , 워크로드 관리, 확장된 자동화 기능 등 다양한 기능을 구현할 수 있다. 또한 데이터 압축 기술이 좋기 때문에 대형화된 데이터를 다루는데 최적화될 수 있다는 장점이 있다. 때문에 많은 중견기업 , 대기업 권에서 DB2를 활용하고 있다.
  • Sybase / Sybase
사이베이스 사에서 개발, 1984년에 공개한 관계형 데이터베이스 시스템, 현재 (2010년)는 SAP에서 인수를 했다. 2011년에는 사이베이스 IQ 15.3이 출시 되어 컬럼 단위 데이터 처리로 I/O 속도를 90%까지 향상시켰으며, 데이터 압축 저장, 스토리지 공간의 활용도를 높이게 되었다. 또한 오라클에 비해 비교적 저렴하기 때문에 많은 기업에서 관심을 가지고 있는 시스템이지만, 아직까지 국내에서는 오라클에 비해 밀리는 추세이다.
RDBMS는 모든 종류의 데이터를 관리하는 최선의 방법이 아니다.
  • 복잡한 DBMS일수록 트랜잭션, ACID(원자성, 일관성, 고립성, 지속성) 등의 많은 컨셉을 지원하기 위한 오버헤드가 발생하게 된다. 때문에 휴대폰 등의 임베디드 기기 같은 단순한 데이터베이스(예를 들어 전화번호부 등)의 경우는 다중사용자나 회복 기능 등을 뺀 가벼운 DBMS를 만들어 사용하기도 한다.
  • 대다수의 RDBMS는 비교적 크기가 작은 레코드를 수백만개씩 저장하는 것에 특화되어있다. 반대로 하나의 레코드가 몇십MB에서 GB급인 경우 데이터를 DB에 저장하면 쿼리 시 오버헤드가 클 수 있다. 이 경우 원래 파일은 파일 시스템에 직접 저장하거나 파일시스템 스타일의 클라우드(Amazon S3 등)를 이용하고 그 경로만 DB에 저장하는게 바람직하다.
  • 실시간으로 데이터 처리가 필요한 경우(예를 들어 군용, 항공/우주용 등)에도 일반적으로 복잡한 기능을 제공하는 RDBMS가 적합하지 않다. 다만 통신망, 금융권 등에서의 실시간 데이터 처리 개념에서는 오라클의 타임스텐이나 알티베이스의 ALTIBASE HDB와 같은 인 메모리 데이터베이스를 실시간 데이터 처리가 필요한 구간에 사용하고, 이력 데이터와 같은 안정성이 중요시되는 데이터는 back-end 구간에 전통적인 디스크 기반 RDBMS를 사용하는 방식으로 시스템을 구성한다.
  • 검색 엔진 등 극단적으로 데이터가 크며, READ/WRITE 간의 격차가 큰 경우에도 일반적으로 RDBMS를 사용하지 않는다. 이러한 경우는 MM DBMS와 NoSQL 기술을 혼용하여 서비스를 구축한다. NoSQL 기술이 응용된 사례가 페이스북의 쪽지 기능이 있다.

우리가 흔히 사용하는 SQL 데이터베이스(RDBMS)와 NoSQL의 데이터베이스는 언제 어떻게 사용하느냐가 성능에 굉장한 영향을 준다. 데이터 사이에 관계가 존재하면 SQL 데이터베이스를 사용하고, 데이터 사이에 관계가 필요 없으면 NoSQL 데이터베이스를 사용하면 된다. (너무 당연한 말이지 암... 이름이 저런디)
예를 들어 SNS를 개발한다면, User, Feed, Comment 등 다양한 데이터가 존재하고, 데이터 사이에 관계가 존재하기 때문에 SQL을 사용하면 보다 빠르게 데이터를 접근 할 수 있다. 만약 이 내용을 NoSQL로 구현을 했다면 모든 내용을 하나의 Document로 저장하면 되겠지만, 그렇게되면 데이터의 중복이 엄청나기 때문에 올바르지 못하다. 데이터 중복을 피하기 위해 만약 User, Feed, Comment 등의 값들을 각각 key-value로 저장하고 있다면, 데이터 접근 후 하나의 객체로 만드는 과정의 비용이 상당할 것이다. 생각만해도 클라이언트가 답답해 하는 소리가 들린다.
하지만 인터넷에 있는 기사를 긁어오는 스크랩 코드를 구현했다면 url + @로 key, 하나의 페이지를 value로 저장한다면 빠르고 쉽게 저장/접근이 가능하다. 이럴때는 NoSQL이 적절하지 않을까 싶다.

# DA와 DBA

  • 데이터관리자(DA, Data Administrator) - 데이터 매니저의 역할. PM의 역할.
  • 데이터베이스관리자(DBA, DataBase Administrator) - 데이터 개발운영자. 개발자의 역할.

#

#꿀팁 : 데이터 기획을 쉽게 하는 2가지 툴

이제 소개될 파워쿼리와 Notion 의 데이터베이스 기능은 위에서 언급한 수많은 개념중 딱 하나만 알아도 결과적으로 여러분들을 데이터베이스 기획에 실패하지 않게 해 줄 것입니다.

1. 파워쿼리

💡
기획자는 CLI 와 코드 에디터(code editor) 보다 , GUI와 엑셀 PPT가 익숙합니다. 기확자가 가장 접근하기 쉬운 UI/UX/스토리보드 기획 도구로 PPT와 draw.io 가 있다면, 기획자가 가장 접근하기 쉬운 데이터베이스 기획 도구로 저는 파워쿼리를 추천합니다.
커뮤니티를 보면 기획자가 개발 공부를 하는 게 좋겠냐는 주니어 기획자들의 질문을 종종 접하게 됩니다. 결론부터 말하자면 개발 공부 해서 손해볼 것은 전혀 없습니다. 그러나 한정된 시간을 투자해야 한다면 개발 공부보단 기획자 고유의 스킬을 우선 연마하는 것이 효율적이라고 생각합니다. 기획자는 CLI 언어인 SQL보단 GUI인 파워쿼리, HTML/CSS/JS 보단 PPT나 draw.io를 사용하여 일하는 것이, 개발자의 역할 보다는 IT 서비스의 번역자, 중개자 역할을 할 수 있게 되는 것이 보다 범용적이지 않나 하고 저는 생각합니다. 기획자의 무기는 ppt와 엑셀을 중심으로 해서, 확장해서 Notion과 draw.io 정도 까지가 기본이지 않나 제 경험으로는 그러합니다.
 

2. Notion.so 의 데이터베이스 기능

아래 2개만 보시면 됩니다.
Video preview
Video preview
 
위의 두 동영상 보시고 이 글을 보면 감 잡으실 겁니다.
 
노션 데이터베이스로 만들수 있는 것은 그대로 개발 가능하다고 보시면 됩니다.

노션 또는 파워쿼리로 DB를 기획하실때 1NF만 지키시면 됩니다.
1NF - 중복되는 항목이 없을것
 
  • Thanks to Edgar Frank "Ted" Codd.
<END>