말 그대로 데이터베이스 관리 시스템이다.
데이터베이스는 메타데이터를 포함하여 로직상 관련이 있는 데이터의 모음이다.
e.g.) Data: name, city, birthdate
Metadata: name - string, length
💨 DBMS라고도 하는 데이터베이스 관리 시스템은 사용자가 데이터베이스를 생성, 유지 관리 및 쿼리할 수 있게 해주는 소프트웨어 시스템이다.
💨 데이터를 장기 기간동안 저장 및 보존 하기 위해서 데이터 베이스를 사용한다.
💨 대부분의 DBMS는 데이터 액세스를 빠르고, 신뢰할 수 있고, 안전하게 하는 성능을 기본적으로 갖추고 있다.
💨 일반적으로 database에는 크게 관계형 데이터베이스(RDBMS)와 "NoSQL"로 명칭되는 비관계형(Non-relational) database가 있다.
말 그대로, 이름 그대로, 관계형 데이터 모델에 기초를 둔 데이터베이스 시스템을 말한다.
가장 대표적인게 MySQL, 그리고 Postgres, Oracle DB 가 있다.
💨 관계형 데이터란 데이터를 서로 상호관련성을 가진 형태로 표현한 데이터를 말한다.
💨 각각의 테이블들은 서로 상호관련성을 가지고 서로 연결될 수 있는데 이때 연결된 테이블끼리의 관계에는 크게 3가지 종류가 있다.
💨 Foreign Key(외래키)를 주로 이용하여 테이블을 연결한다.
- A, B 테이블을 서로 연결한다고 하면, A 테이블의 고유 키를 B 테이블에서 외래 키로 지정하는 방식으로 연결한다.
💨 하나의 테이블에 모든 정보를 다 넣으면 동일한 정보들이 불필요하게 중복되어 저장되며 더 많은 디스크를 사용하게 되고 잘못된 데이터가 저장 될 가능성이 높아진다.
💨 여러 테이블에 나누어서 저장한후 필요한 테이블 끼리 연결 시키면 위의 2문제가 사라진다. 중복된 데이터를 저장하지 않음으로 디스크를 더 효율적으로 쓰고, 서로 같은 데이터이지만 부분적으로 틀린 데이터가 생기는 문제가 없어진다. 이것을 normalization(정규화) 이라고 한다.
🧡 관계형 데이터베이스는 데이터를 더 효율적으로 그리고 체계적으로 저장할 수 있고 관리 할 수 있다.
🧡 미리 저장하는 데이터들의 구조(테이블 스키마)를 정의 함으로 데이터의 완전성이 보장된다.
🧡 트랜잭션(transaction)
🧡 정형화된 데이터들 그리고 데이터의 완전성이 중요한 데이터들을 저장하는데 유리하다.
💔 테이블을 미리 정의해야 함으로 테이블 구조 변화 등에 덜 유연한다.
💔 확장성이 쉽지 않다.
NoSQL은 'NotSQL' (SQL이 아닌), 혹은 'NotOnlySQL' (SQL만이 아닌)로도 정의된다.
대표적으로 MongoDB, Redis 등이 있다.
💨 NoSQL은 데이터베이스가 구축되기 전에 설계된 테이블과 데이터 스키마가 있는 구조인 기존의 RDBMS(Relational Database Management System)-관계형DBMS에서 기존방식에서 벗어나 변화를 나타내는 데이터베이스에 대한 접근방식이고, NoSQL 데이터베이스는 이러한 구조에 의존하지 않고 보다 유연한 데이터 모델을 사용한다.
💨 RDBMS는 클라우드 및 웹 애플리케이션에서 대규모 데이터베이스 클러스터링이 요구하는 성능, 확장성 및 유연성 요구사항을 충족하지 못하고 있다.
💨 NoSQL은 특히 비정형 데이터를 저장하는 데 유용하다. 일반적인 비정형 데이터 유형으로는 사용자 및 세션 데이터, 채팅, 메시징 및 로그 데이터, IoT 및 장치 데이터와 같은 시계열 데이터, 비디오 및 이미지와 같은 큰 개체 등이 있다.
기존의 방식인 관계형DBMS를 사용하지 않는 NoSQL에는 특정 요구 사항과 사용 사례를 지원하기 위해 다양한 방식(type)이 존재한다.
💨 Key-value data stores
💨 Document stores
💨 Graph stores
💨 Wide-column stores, Multi-modal databases 등 굉장히 많은 방식이 존재한다.
🧡 테이터 구조를 미리 정의하지 않아도 됨으로 저장하는 데이터의 구조 변화에 유연하다.
🧡 확장하기가 비교적 쉽다. 그냥 서버 수를 늘리면 된다(scale out).
🧡 확장하기가 쉽고 테이터의 구조도 유연하다 보니 방대한 양의 데이터를 저장하는데 유리하다.
🧡 주로 비정형화 데이터 그리고 완전성이 상대적으로 덜 유리한 데이터(ex. 로그 데이터)를 저장하는데 유리하다.
💔 데이터의 완전성이 덜 보장된다.
💔 트랜잭션이 안되거나 비교적 불안정하다.