[데이터베이스] 관계형 데이터 베이스

Ethan KIM·2022년 8월 14일
0

Achievement Goals

목록 보기
3/7

데이터 베이스 학습.

ACID 성질.

데이터베이스 트랜젝션이 발생할 때, 그 안전성을 보장할 수 있는 성질.
Atomicity : 원자성. 하나의 트랜젝션 내에는 모든 연산이 성공하거나, 모두 실패애야함. 입금,출금시에 오류가 발생한다면, 트랜젝션을 롤백하는것.

Consistency : 하나의 트랜젝션 전후에 데이터베이스의 일관된 상태가 유지되어야 한다. 데이터베이스에서 트랜잭션이 일어났는데, 그 트랜잭션이 데이터베이스에 영향을 끼친다면, 트랜젝션을 롤백하는것.

Isolation : 가각의 트랜젝션은 독립적이다. 서로의 연산을 확인받거나 영향을 줄 수 없음. 서로 영향을 주면 트랜젝션 롤백.

Durability : 하나의 성공된 트랜젝션에 대한 로그가 기록되고 영구적으로 남는다. 계좌 이체를 성공하고 은행이 서버 오류가난다면, 계좌이체를 성공한 로그는 기록되어야함. 만약 계좌 이체 확인 전에 은행 서버에 오류가 난다면, Atomicity 오류가 나기 때문에 트랜젝션 롤백이됨.


  • SQL 문법에 대해 알아보자.
  • SQL이란?
    Structured Query Language의 줄임말로, 구조화된 Query언어 라는 뜻이다.
    아래의 Learn SQL Goal 에서 자세하게 다룰것이다.

    데이터 베이스용 프로그래밍 언어이고,
    데이터베이스에 Query를 보내 원하는 데이터만 필터링해서 가져올 수 있다.
    종류 : MySQL, Oracle, SQLite...

    Query?

    질의문.
    검색창에 적는 검색어도 Query의 일종.
    저장되어 있는 정보를(보통 데이터 베이스에 저장되어있겠지) 필터 하기 위한 질문으로 생각.
    API 요청할때 http://URL:PORT/file ?=여기서 ?= 이게 Query문. ?= 뒤에 경로로 가기위한 질의문.

    SQL의 문법은 다음과 같이 분류한다.

    Data Definition Language : 데이터 정의할 때 사용하는 언어. CREATE, DROP
    Data Manipulation Language : 데이터 저장할 때 사용하는 언어. INSERT INTO, DELETE, UPDATE
    Data Control Language : 데이터베이스 접근 권한 관련 문법 : GRANT, REVOKE
    Data Query Language : 정해진 스키마 내에서 쿼리할 수 있는 문법 : SELECT
    Transaction Control Language : DML의 거친 데이터 변경사항을 수정하는 문법 : COMMIT, ROLLBACK


  • Node.js에서 데이터베이스를 사용하는 방법이 무엇인지 설명하시오.
  • Node.js 에서 데이터 베이스를 사용하는 방법은 연결해주면된다.

    var mysql      = require('mysql');
    var connection = mysql.createConnection({
      host     : 'example.org',
      user     : 'bob',
      password : 'secret'
    });
    ---------------------------------------------------------------------
    connection.connect(function(err) {
      if (err) {
        console.error('error connecting: ' + err.stack);
        return;
      }
      console.log('connected as id ' + connection.threadId);
    });

    3tier Architecture를 이해한다. DB 관점.

    영속성의 개념을 설명하고, 데이터베이스가 왜 필요한지 말하시오.

    데이터베이스가 필요한 이유.

    2가지 이유가 있다.

    1. In-memory 방법* 으로 저장할 경우, 데이터를 클라이언트나 서버 쪽에 저장해서 사용하게 되는데, 이때 서버나 클라이언트의 전원이 꺼지면, 데이터도 없어진다.

    2. File I/O 파일시스템을 사용하게되면, 데이터가 필요할 때마다 항상 파일을 통쨰로 가져와서 서버에서 필터링을 해주어야함. 이럴 경우 파일의 크기가 커질수록 버거워지고 비효율적이게됨. 원하는 데이터만 쏙 가져올 수가 없음.

    그래서 위의 일들을 전문적으로 처리할 데이터베이스가 생김.
    필터링 외에도 File I/O로 구현이 힘든 것들을 위한 여러 기능을 가지고 있는 데이터에 특화된 서버임.

    데이터 처리 과정에 대해서 알아보면,

    1. 클라이언트가 데이터를 서버에 요청한다.
    2. 서버는 요청받은 데이터를 데이터베이스에 Query문을 작성하여 요청한다.
    3. 데이터베이스는 Query문 을 바탕으로 필터링된 데이터를 JSON이나 여러가지 형식으로 서버에 전달한다.
    4. 서버는 클라이언트에게 필터링된 데이터를 포함한 요청문에 대한 화면을 렌더링한다.
    • In-memory 방식이란, 서버나 클라이언트쪽에 파일을 저장해서 가져다 쓰는것. 메모리에 모든 데이터를 보유하고 있는 데이터데이스임. 디스크 검색 보다 자료 접근이 훨씬 빠름. 데이터 양이 많아지면, 데이터 베이스 응답 속도가 느려지는데 그 문제를 해결할 수 있는 대안이 되기도함.
      단점은, DB서버 전원이 꺼지면 자료들은 초고속 삭제됨. 데이터에 비해 RAM 용량이 넉넉치 않을 경우 가상메모리를 쓰게 되어 역효과 일어남.

      예시로, JavaScript에서 데이터를 다룰 때를 생각하면 된다. JavaScript에서 변수를 만들어 저장한 경우 프로그램이 종료될 때 해당 프로그램이 사용하던 데이터도 사라지게된다.
      이는, 변수 등에 저장한 데이터가 프로그램의 실행에 의존한다는 말임.

    데이터베이스 종류를 설명하시오.

  • 관계형 데이터베이스와 NoSQL의 차이를 설명하시오
  • SQL과 NoSQL은 만들어진 방식, 저장하는 정보의 종류, 저장하는 방법등에 차이가 있다.

    SQL

    테이블의 구조와 데이터 타입 등을 사전에 정의. 그 정의된 내용에 알맞는 형태의 데이터만 삽입가능.
    행과 열로 구성된 테이블에 데이터를 저장. 각 열은 하나의 속성에 대한 정보를 저장. 각 행은 각열의 데이터 형식에 맞는 데이터가 저장됨.
    이러한 이유로, 데이터를 정확히 입력했다면,

    사용시 편리, 스키마가 뚜렷. 테이블 간의 관계를 직관적으로 파악 가능함.

    NoSQL

    데이터가 고정되어 있지 않은 데이터 베이스.
    스키마는 당연히 존재함. 단지, 입력할 때 스키마에 맞게 입력해야하는 SQL과는 다르게 읽어올때 스키마에 따라 데이터를 읽어옴. "schema on read" 데이터를 입력하는 방식에 따라, 데이터를 읽어올 때 영향을 미침.
    NoSQL 기반 비관계형 데이터베이스

  • Key-Value타입
  • : Key-Value 쌍으로 나타내는 데이터를 배열의 형태로 저장.
  • 문서형 데이터베이스
  • : 데이터를 테이블이 아닌 문서의 형태로 저장. JSON과 유사한 형식의 데이터를 문서화하여 저장. 각 문서엔 하나의 속성에 대한 데이터를 가지고, 컬렉션이라고 하는 그룹으로 묶어서 관리.
  • Wide-Column 데이터베이스
  • : 데이터베이스의 열에 대한 데이터를 집중적으로 관리하는 데이터 베이스. key-value형식으로 저장. 칼럼패밀리라고 하는 열의 집합체 단위로 데이터 처리 가능. 빅데이터 분석에 많이 쓰임.
  • 그래프 데이터베이스
  • : 자료구조의 그래프와 비슷한 형식으로 데이터간 관계를 구성하는 데이터 베이스. 노드에 속성별로 데이터 저장.

    차이점

    SQL과 NoSQL은 만들어진 방식, 저장하는 정보의 종류, 저장하는 방법등에 차이가 있다.

    데이터 저장
    SQ: SQL을 이용해서 데이터를 테이블에 저장. 미리 작성된 스키마를 기반으로 정해진 형식에 맞게.
    NoSQL : key-value, document, wide-column등의 방식

    스키마
    SQL : 고정된 형식의 스키마 필요. 처리하려는 데이터 속성별 열에 대한 정보를 미리 정해두어야함. 스키마를 변경하려면 데이터베이스 전체를 수정하거나, 오프라인(down-time)으로 전환해야함
    NoSQL : 동적으로 스키마 관리 가능. 행을 추가할때 즉시 새로운 열을 추가할 수 있고, 개별 속성에 대해서 모든 열에 대한 데이터를 반드시 입력 안해도됨.

    쿼리
    SQL : 테이블의 형식과 테이블간의 관계에 맞춰 데이터 요청. SQL 같은 구조화된 쿼리언어 사용
    NoSQL : 데이터 그룹 자체를 조회. 구조화 되지 않은 쿼리 언어로도 데이터 요청 가능.

    확장성
    SQL : 수직적 확장. 높은 메모리, CPU 사용. 하드웨어 성능을 많이 이용하여 비용 높아짐.
    NoSQL : 수평적 확장. 값싼 서버증설, 클라우드 서비스 이용하는 확장. NoSQL 데이터베이스를 위한 서버를 추가적으로 구축하면, 많은 트래픽을 보다 편리하게 처리할 수 있음. 저렴한 범용 하드웨어나 클라우드 기반의 인스턴스에 NoSQL 데이터베이스를 호스팅할 수 있어서, 비용도 저렴해짐.


  • 관계형 데이터베이스 및 NoSQL이 어떤 경우에 적합한지 설명하시오.
  • SQL 선택

    1. 데이터베이스의 ACID 성질을 준수해야 하는경우. 예외상황 줄이고, 무결성 보호. 전자상거래 금융거래는 ACID 성질 준수해야 하기 때문에 SQL을 선택.
    2. 소프트웨어에 사용되는 데이터가 구조적이고 일관적인 경우. 데이터 규모가 적은경우.

    NoSQL 선택

    1. 데이터 구조가 없거나 거의 없는 대용량의 데이터 저장할 경우.
    2. 클라우드 컴퓨팅 및 저장공간을 최대한 활용하는 경우 (확장성의 특징.)
    3. 빠르게 서비스를 구축하는 과정에서 데이터 구조를 자주 업데이트 하는 경우.

    Leran SQL

    SQL 주요 문법을 나열하라.

  • 조회, 삽입, 갱신, 삭제 구문을 사용
  • 조회시 다양한 조건을 걸어 원하는 정보만 조회
  • 통계를 위한 쿼리를 만들어봐라.

  • SQL 주요 문법을 나열

    testDB 를 예를 들어 설명하겠다.

    데이터 베이스 생성 : CREATE DATABASE testDB;
    데이터 베이스 사용 : USE testDB;
    user 테이블 생성 : CREATE TABLE user (id int, name varchar(255), email varchar(255));

    테이블 생성할때, 위의 id, name, email이 각 칼럼(field)이 된다. 이때, 항상 필드 타입을 설정해 주어야한다.

    테이블 정보 확인 : DESCRIBE testDB;
    아래와 같이 테이블 정보를 확인 할 수 있다.

    SQL 명령어

    SELECT, FROM, WHERE, ORDER BY, LIMIT, DISTINT, INNER JOIN, OUTER JOIN, OUTER JOIN

    WHERE 에 대해 좀 더 자세하게 알아보면,
    WHERE 특성_1 = '특정값' : 특정 값과 동일한 데이터 찾기.
    WHERE 특성_2 <> '특정값' : 특정 값을 제외한 데이터 찾기.
    WHERE 특성_1 > "특정 값" : 특정 값보다 크거나 작은 데이터 필터를 비교할땐 <, >
    WHERE 특성_1 <= '특정값' : 특정 값을 포함하는 '이상', '이하' 값을 비교.
    WHERE 특성_1 LIKE "%특정 문자열%" : 특정 문자열에 %의 위치에 따라서 비슷한 값을 필터할떄.
    WHERE 특성_1 IN ('특정값_1', '특정값_2') : 리스트의 값과 일치하는 데이터를 필터링.

    브라질에서 온 고객을 도시별로 묶은 뒤에, 각 도시 수에 따라 내림차순으로 정렬한다. 그리고 CustomerId에 따라 오름차순으로 정렬한 3개의 결과만 요청하는 예시.

    SELECT c.Cutomer.ID, c.FirstName, count(c.City) as 'City Count'
    FROM customers AS c 	// customers 를 c로 선언하고, c.c.Cutomer.ID, c.FirstName과 count(c.City)를 'City Count'로 선언한 데이터를 불러옴.
    JOIN employees AS e ON c.SupportRepId = e.EmployeedId // employees를 e로 선언 후, c와 e의 값중 SupportRepId가 같은 값을 필터링.
    WHERE c.Country = 'Brazil' // 그중에서 c.Country가 'Brazil'인 것을 필터링.
    GROUP BY c.City // c.City 로 그룹화 === 도시별로 묶음.
    ORDER BY 3 DESC, c.CustomerID ASC // 도시수에 따라 내림차순으로 정렬하고 CustomerId에 따라 오름차순으로 정렬.
    LIMIT 3 // 결과는 3개만.

    스키마 디자인에 대해 설명하시오.

  • 스키마 디자인이 무엇인지 설명하시오.
  • 스키마란?

    데이터베이스에서 데이터가 구성되는 방식과 서로 다른 엔티티(고유한 정보 단위) 간의 관계에 대한 설명이다.
    데이터베이스의 청사진

    간단 용어정리.

    엔티티 : table 고유한 정보 단위. 아래 그림에서 Teachers, Classes, Student
    Field : table 에서의 필드. 행렬에선 열 아래 그림에서 각 엔티티의 하위 속성들.
    Record : table에 저장된 항목. 행렬에선 행 아래 그림에서 각 필드에 저장된 항목들.

    ex) Teachers Record 의 예시 : Cynthia / Music / Music Theory, Brass Methods. 필드의 순서, Name / Department / Classes 의 순서에 맞게 저장된 항목을 의미한다.


  • 앱에 필요한 테이블과 필드, 그리고 관계를 부여해보시오.
  • 1:N, N:N 관계에 대해 설명하고, 데이터베이스에서 테이블 조작해보시오.

    1:N 의 관계에선, N의 테이블에 1의 key를 foreign Key로 설정해서 foreign Key 필드를 만들어주는게 가장 좋은 방법이다.

    왜냐하면, 1의 테이블에 N의 Foreign Key 필드를 설정하여 레코드를 만들면, N개의 key값이 하나의 레코드에 들어오게될 수 있으므로, 데이터를 찾고 처리하는 시간이 오래걸린다. (레코드 작성시, 갯수 제한도 있음.)
    또한, 1의 테이블에 N개의 테이블과 같은 수의 필드를 만들어도, N개의 테이블 필드에 수정이 있을시에, 1의 테이블의 N개의 필드를 전부 수정해 주어야 하는 상황이 발생하므로, N의 테이블에 1의 Forign Key 값을 필드화 해서 넣어주는것이 가장 합리적이고 효율적인 방법일 것이다. 이렇게 되면, 1의 테이블만 훑으면 데이터를 한번에 찾을 수 있기때문에 빠르고 간결하다.

    N:N 관계에선, 각자의 ID 값을 가진 JOIN TABLE을 만들어 1:N 의 관계를 2번 만든다.

    Self referencing 관계도 있음.

    이 경우엔, 테이블 내에서 관계가 필요할 때이다. 추천인이 누구인지 파악하기 위해 사용할 수 있음.

  • Foreign Key, Primary Key에 대해 설명하시오.

  • Foreign Key = 다른 테이블에서 해당 테이블의 기본키를 참조할때 해당 값을 외래 키(foreign Key)
    라고 부름.

    Primary Key = 테이블의 기본 키.

    SQL을 Node.js 앱에서 쿼리하시오.

    var mysql      = require('mysql');
    var connection = mysql.createConnection(...);
    
    connection.query('SELECT 1', function (error, results, fields) {
      if (error) throw error;
      // connected!
    });

    클라이언트 HTTP 요청에 따라 CRUD API를 구현하시오.

    profile
    좋아하는것만 함

    0개의 댓글