안녕하세요. yangheeb입니다 :)
오늘은 NoSQL과 SQL 각각의 장단점에 대해 알아보고자 합니다.
더불어 현재 진행하는 프로젝트에서
왜 MySQL(RDB) 데이터베이스 사용이 더 적합한지에 대해 생각해 보겠습니다.
** 데이터베이스 개념
01. MySQL (관계형 DBMS)
ㅇ MySQL은 Oracle Corporation의 관계형 데이터베이스 관리 시스템(RDBMS)
ㅇ 테이블에 데이터를 저장하고 데이터베이스 액세스를 위해 SQL(구조적 쿼리 언어)을 사용
ㅇ MySQL 개발자가 애플리케이션의 데이터에 액세스해야 하는 경우 조인이라는 프로세스를 통해 여러 테이블의 데이터를 병합
ㅇ MySQL에서는 데이터베이스 스키마를 미리 정의하고 테이블의 필드 간 관계를 제어하는 규칙을 설정
다시 말해, 모든 열과 그와 관련된 데이터 유형이 사전에 파악 되어야
애플리케이션이 데이터를 데이터베이스에 작성할 수 있다.
02. NoSQL (비관계형 DB)
ㅇ 비관계형 데이터베이스 유형을 가리킴
ㅇ 관계형 테이블과는 다른 형식으로 데이터를 저장
ㅇ 언어마다 관습화된 API, 선언적 구조의 쿼리 언어, 쿼리별 언어를 사용하여 질의할 수 있음
NoSQL 데이터베이스에서 데이터 는 사전에 스키마를 정의하지 않아도 저장될 수 있습니다.
작업을 진행하는 동시에 데이터를 정의하는 방식으로
빠르게 데이터를 작성하고 반복할 수 있는 능력을 얻게된다는 얘기입니다.
또한 그래프 기반, 열 지향, 문서 지향 또는 키-값 저장소 등 특정 비즈니스 요구 사항 수행에 적합합니다.
# MongoDB
MongoDB는 데이터를 JSON과 유사한 문서로 저장하는 NoSQL 데이터베이스
문서는 관련 정보를 함께 저장하고 MongoDB 쿼리 언어(MQL)를 사용
필드는 문서마다 다를 수 있으며, 문서는 자체 설명적이므로 시스템에 문서 구조를 선언할 필요가 없음
필요에 따라 스키마 유효성 검사를 사용하여 각 컬렉션에 대한 데이터 거버넌스 제어를 적용할 수 있음
두 가지의 DB를 정리해보자면 다음과 같습니다.
RDB | NoSQL | |
데이터 모델 | - 테이블과 행으로 이루어진 고정된 스키마 - 정확한 구조에 따라 데이터 저장 - 각 테이블은 관계를 통해 연결 |
- 동적인 스키마를 가지고 있거나 스키마가 전혀 없을 수 있음 - 주로 문서, 키-값 쌍, 열 지향등으로 표현됨 |
확장성 | - 수직 확장 (vertical scaling)이 주로 사용됨 - 성능 향상을 위해 더 강력한 하드웨어로 업그레이드하는 방식 |
- 수평 확장 (horizontal scaling)이 주로 사용됨 - 데이터베이스 서버를 추가하거나 분산 데이터베이스를 사용하여 시스템의 성능을 향상 |
트랜잭션 및 일관성 |
- ACID(원자성,일관성,고립성,지속성) 트랜잭션을 지원 - 데이터 일관성이 중요한 경우에 적합 |
- 일관성 모델이 다양함 - 일부 NoSQL DB는 일관성을 희생하는 대신 가용성이나 분할 허용성을 강조할 수 있음 |
데이터 쿼리 언어 | - SQL을 사용하여 데이터를 조회 및 조작 | - 고유한 쿼리 언어를 제공 - SQL을 사용하지 않는 경우가 많음 |
용도 및 사용 사례 | - 복잡한 관계를 가지는 데이터 또는 정형화된 데이터에 적합 - 트랜잭션 처리와 데이터 일관성이 중요한 시스템에 사용됨 |
- 대규모 데이터나 다양한 형식의 데이터를 다루는데 유용함 - 읽기 및 쓰기 처리가 많은 대규모 웹 응용프로그램, 로그 및 이벤트 기록, 소셜 미디어 등에 적합 |
https://chat.openai.com/share/2f9f2030-eb5e-4673-b058-5217cba565fc
** 어떤 DB가 past-forward 프로젝트에 적합할까 ?
우리가 구현하게 될 KPT 회고보드는 데이터의 형태에 따라서 데이터베이스를 선택하는 것이 중요합니다.
이 프로젝트는 NoSQL DB도 사용 가능하지만.
필자는 NoSQL을 사용하지 않고 MySQL DB로도 진행 가능하다 생각합니다.
NoSQL 데이터베이스 사용 사례
NoSQL 데이터베이스는
뚜렷하지 않거나 관련이 없거나 빠르게 변화하는 데이터를 처리하는 데 가장 적합합니다.
데이터베이스 스키마를 지시하는 애플리케이션에서 직관적으로 사용할 수 있으며, 다음과 같은 애플리케이션에 사용할 수 있습니다.
- 더 빠르고 반복적인 개발을 가능하게 하는 유연한 스키마가 필요합니다.
- 강력한 데이터 일관성과 데이터 테이블 간의 관계 유지(참조 무결성)보다 성능을 우선시합니다.
- 서버 간 샤딩을 통한 수평 확장이 필요합니다.
- 반구조화된 데이터와 구조화되지 않은 데이터를 지원합니다.
KPT 회고방식을 사용할 'past - forward 프로젝트'에서는
특히 빠르게 변화하는 데이터를 처리하는 것에 중점을 두는 것이 아니기에
이러한 NoSQL DB를 무조건적으로 필요할 것 같지는 않다 생각합니다.
MySQL 사용 사례
- 전통적인 비즈니스 애플리케이션:
- 회계 시스템, CRM 시스템 등과 같이 데이터 간의 관계가 중요한 전통적인 비즈니스 애플리케이션에서 MySQL을 사용할 수 있습니다.
- 온라인 쇼핑몰:
- 제품, 주문, 고객 정보 등을 효과적으로 다룰 수 있으며, 트랜잭션 처리와 정확한 데이터 일관성이 필요한 경우 MySQL을 사용할 수 있습니다.
- 데이터 분석 및 보고 시스템:
- 정형 데이터를 기반으로 한 데이터 분석 및 보고 시스템에서 MySQL을 사용하여 복잡한 쿼리 및 조인을 수행할 수 있습니다.
- CMS (콘텐츠 관리 시스템):
- 블로그, 뉴스, 웹페이지 등을 관리하는데 MySQL은 효과적입니다. 데이터의 일관성과 구조가 중요한 경우에 적합합니다.
MySQL 또는 다른 관계형 데이터베이스를 사용하는 경우,
구조화된 데이터 및 강한 일관성이 필요한 상황에서 적합할 수 있습니다.
아래는 KPT 회고보드에 사용될 수 있는 적절한 데이터의 예시입니다.
- 사용자 정보:
- 사용자의 이름, 이메일 주소, 가입 일자 등과 같은 사용자 정보는 일반적으로 정형화되고 구조화된 데이터입니다. MySQL은 이러한 사용자 데이터를 효과적으로 저장하고 관리할 수 있습니다.
- 회고 항목:
- 회고보드에서 각 항목은 주제, 작성자, 생성 일자와 같은 속성을 가질 수 있습니다. MySQL은 이러한 정형화된 데이터를 테이블에 저장하고 복잡한 쿼리를 통해 효과적으로 관리할 수 있습니다.
- 댓글 및 답글:
- 사용자들이 회고 항목에 댓글을 달거나 답글을 작성하는 경우, 이러한 데이터는 각각의 댓글과 답글에 대한 관계를 가질 수 있습니다. MySQL은 이러한 관계형 데이터를 효과적으로 다룰 수 있습니다.
- 팀 및 프로젝트 정보:
- 회고보드가 여러 팀 또는 프로젝트를 다루는 경우, 각 팀이나 프로젝트에 대한 정보를 테이블에 저장할 수 있습니다. MySQL은 팀 및 프로젝트 간의 관계를 관리하는 데 적합합니다.
- 통계 및 리포트 데이터:
- MySQL은 복잡한 집계 및 통계 처리를 지원하므로, 회고보드에서는 특정 주제에 대한 통계 및 리포트 데이터를 효과적으로 저장하고 분석할 수 있습니다.
https://chat.openai.com/share/9bef0044-d1c5-43ef-91c6-85c2415a67c3
프로젝트의 요구 사항에 따라 두 유형의 데이터베이스를 비교하여 선택하는 것이 좋습니다.
MySQL은 관계형 데이터에 강점이 있고,
NoSQL 데이터베이스는 유연한 데이터 모델과 확장성을 강조하는 경우가 많지만
KPT 회고방식을 사용할 'past - forward 프로젝트'에서는
특히 빠르게 변화하는 데이터를 처리하는 것에 중점을 두는 것이 아니기에
이러한 NoSQL DB를 무조건적으로 필요할 것 같지는 않다 생각합니다.