TIL 200317

조양권·2021년 5월 18일

TIL

목록 보기
18/24

1. 오늘

  • 여태 연쇄할인마 프로젝트는 flask와 mongodb를 사용했다.
  • 하지만 프로젝트의 마무리가 눈앞에 있는 지금 로그인 기능과 여타 여러 이유를 포함해 좀더 범용적으로 이용되는 django와 mysql을 이용하기로 했다.
    / 그 과정에서 mysql과 mongodb, 둘의 db의 차이점을 알아 보았다.

1) SQL

  • SQL은 ‘구조화 된 쿼리 언어 (Structured Query Language)’의 약자이다.
  • 데이터베이스 자체를 나타내는 것이 아니라, 특정 유형의 데이터베이스와 상호 작용하는 데 사용 하는 쿼리 언어이다.
  • 이러한 관계형 데이터베이스에는 두 가지 주요 특징이 있다.
  1. 데이터는 정해진(엄격한) 데이터 스키마 (= structure)를 따라 데이터베이스 테이블에 저장된다.
  2. 데이터는 관계를 통해서 연결된 여러개의 테이블에 분산된다.

1–1) 정해진(엄격한) 데이터 스키마

  • 데이터는 테이블에 레코드로 저장되며, 각 테이블에는 명확하게 정의된 구조가 있다.

  • 구조란 어떤 데이터가 테이블에 들어가고 어떤 데이터가 그렇지 않을지를 정의하는 필드 집합을 가르킨다.

  • 구조(structure)는 필드의 이름과 데이터 유형으로 정의된다.

  • 스키마를 준수하지 않는 레코드는 추가할 수 없다.

  • 내 프로젝트의 경우, 현재 할인중인 게임을 모아놓은 데이터베이스의 필드는 platform, link, img, original_price, discount_price, discount_rate인데 만약 이 db에 할인중이지 않는 게임을 추가로 저장시키고 싶다고 해서 새로운 필드로 sale_status같은 필드를 새로 추가할수 없다. 아예 스키마를 뜯어 고쳐야 한다.

1–2) 관계

  • 데이터들을 여러개의 테이블에 나누어서, 데이터들의 중복을 피할 수 있다.

  • 만약 사용자가 구입한 상품들을 나타내기 위해서는, Users(사용자), Products(상품), Orders(주문한 상품) 여러 테이블을 만들어야 하지만, 각각의 테이블들은 다른 테이블에 저장되지 않은 데이터 만을 가지고 있다.

  • 하나의 테이블에서 중복없이 하나의 데이터만을 관리하기 때문에, 다른 테이블에서 부정확한 데이터를 다룰 위험이 없다.

2) NoSQL

  • NoSQL은 기본적으로 SQL(관계형 데이터베이스)와 반대되는 접근방식을 따르기 때문에 지어진 이름이다.
  • NoSQL세상에서는 레코드를 문서(documents)라고 부른다.
  • SQL 세상에서는 정해진 스키마를 따르지 않는다면 데이터를 추가 할 수 없지만, NoSQL에서는 다른 구조의 데이터를 같은 컬렉션(= SQL에서의 테이블)에 추가할 수 있다.
  • 여러 테이블 / 콜렉션에 조인(join) 할 필요없이 이미 필요한 모든 것을 갖춘 문서를 작성하게 된다. 실제로 NoSQL 데이터베이스는 조인이라는 개념이 존재하지 않는다
  • 이러한 방식의 커다란 장점은 복잡하고 (어떤 순간에는 느린) 조인을 사용할 필요가 없다는 것입니다. 필요한 모든 데이터가 이미 하나의 컬렉션안에 저장되어 있기 때문이다. 특히 자주 변경되지 않는 데이터 일때 더 큰 장점이 있다.

3) 확장

  • 확장은 수직적(vertical) 확장과 수평적(horizontal) 확장으로 구별 할 수 있다.

  • 수직적 확장이란 단순히 데이터베이스 서버의 성능을 향상시키는 것이다.

  • 수평적 확장은 더 많은 서버가 추가되고 데이터베이스가 전체적으로 분산됨을 의미한다. 따라서 하나의 데이터베이스에서 작동하지만 여러 호스트에서 작동한다.

  • SQL 데이터베이스는 일반적으로 수직적 확장만을 지원한다.

  • NoSQL 데이터베이스는 수평적 확장만에서만 가능하다.

4) 장, 단점

SQL

  1. 장점
  • 명확하게 정의 된 스키마, 데이터 무결성 보장
  • 관계는 각 데이터를 중복없이 한번만 저장
  1. 단점
  • 상대적으로 덜 유연하다. 데이터 스키마는 사전에 계획되고 알려져 한다. (나중에 수정하기가 번거롭거나 불가능 할 수 도 있다.)
  • 관계를 맺고 있기 때문에, JOIN문이 많은 매우 복잡한 쿼리가 만들어 질 수 있다.
  • 수평적 확장이 어렵고, 대체로 수직적 확장만 가능하다. 즉 어떤 시점에서 (처리 할 수 있는 처리량과 관련하여) 성장 한계에 직면하게 된다.
  1. 언제?
  • 관계를 맺고 있는 데이터가 자주 변경(수정)되는 애플리케이션일 경우
  • 변경될 여지가 없고, 명확한 스키마가 사용자와 데이터에게 중요한 경우

NoSQL

  1. 장점
  • 스키마가 없기때문에, 훨씬 더 유연하다. 즉, 언제든지 저장된 데이터를 조정하고 새로운 “필드”를 추가 할 수 있다.
  • 데이터는 애플리케이션이 필요로 하는 형식으로 저장된다. 이렇게 하면 데이터를 읽어오는 속도가 빨라진다.
  • 수직 및 수평 확장이 가능하므로 데이터베이스가 애플리케이션에서 발생시키는 모든 읽기 / 쓰기 요청을 처리 할 수 있다.
  1. 단점
  • 유연성 때문에, 데이터 구조 결정을 하지 못하고 미루게 될 수 있다.
  • 데이터 중복은 여러 컬렉션과 문서가 여러 개의 레코드가 변경된 경우 업데이트를 해야 한다.
  • 데이터가 여러 컬렉션에 중복되어 있기 때문에, 수정(update)를 해야 하는 경우 모든 컬렉션에서 수행해야 함을 의미합니다.
  1. 언제?
  • 정확한 데이터 구조를 알 수 없거나 변경 / 확장 될 수 있는 경우
  • 읽기(read)처리를 자주하지만, 데이터를 자주 변경(update)하지 않는 경우 (즉, 한번의 변경으로 수십 개의 문서를 업데이트 할 필요가 없는 경우)
  • 데이터베이스를 수평으로 확장해야 하는 경우 ( 즉, 막대한 양의 데이터를 다뤄야 하는 경우)

참고한 사이트
SQL vs NoSQL (MySQL vs. MongoDB)
mongodb vs mysql 차이점

profile
할 수 있는 것이 늘어나는 즐거움

0개의 댓글