데이터를 다룸에 있어서 SQL과 NoSQL을 필수적으로 접해야하는 언어이고, 그 차이도 분명히 할 필요가 있다고 생각했다. 이 전에 정리를 했지만, 좀 더 자세히 정리를 해보기로 했다! 😤
https://deep-flame.tistory.com/7
SQL
Structured Query Language의 줄임말로, 관계형 데이터베이스 시스템(RDBMS)에서 자료를 관리 및 처리하기 위해 설계된 언어이다.
👉 SQL 문법의 종류
- DDL (Data Definition Language, 데이터 정의 언어)
데이터를 정의하기 위해 사용되는 언어 (CREATE, ALTER, DROP...) - DML (Data Manipulation Language, 데이터 조작 언어)
데이터를 추가/수정/삭제하기 위한 언어 (SELECT, INSERT, UPDATE ...) - DCL (Data Control Language, 데이터 제어 언어)
데이터를 관리하고 접근하는 권한을 다루기 위한 언어 (GRANT, REVOKE ...)
👉 RDBMS의 종류
- Oracle
현재 가장 많이 쓰이는 RDBMS. 사실상 표준이다. - PostgreSQL
오픈소스 커뮤니티에서 개발된 소프트웨어 실험적이고 진보적인 기능을 추구하여 사용자가 필요한 부분을 고안해서 개발된다. - MySQL
처음에는 경량 DB를 강조하여 최소한의 기능만을 갖추었지만, 지금은 기능이 확장됨
NoSQL
관계형 DB를 지양하며, 스키마가 없거나 느슨한 스키마를 제공하는 저장소이다. 복잡한 구조를 쉽게 저장할 수 있으며, 대량의 분산된 데이터를 저장하고, 조회하는데 특화된 언어이다.
👉 CAP 이론
시스템은 일관성, 가용성, 분단 허용성 중 두 가지만 가질 수 있으며, 이는 CA/CP/AP로 나뉜다.
- 일관성 (Consistency)
다중 클라이언트에서 같은 시간에 조회하는 데이터는 항상 동일한 데이터임을 보증하는 것을 의미한다.
방법
1. 동기식: 데이터 저장 결과를 클라이언트로 응답하기 전, 모든 노드에 데이터를 저장한다. (응답시간이 느리다.)
2. 비동기식: 메모리나 임시 파일에 기록하고 클라이언트에 먼저 응답한 다음, 이벤트 또는 프로세스를 이용하여 노드로 데이터를 동기화한다. (쓰기 노드에 장애가 발생할 경우 데이터가 손실될 수 있다.) - 가용성 (Availability)
모든 클라이언트의 읽기와 쓰기 요청에 대하여 항상 응답이 가능함을 보증하는 것을 의미한다. 클러스터 내 몇 개의 노드가 망가지더라도 정상적인 서비스가 가능하다.
이를 위해 몇몇 NoSQL은 데이터 복제를 사용한다.
1. Master-Slave: 동일한 데이터를 가진 저장소를 하나 더 생성
2. Peer-to-Peer: 데이터 단위로 중복 저장 - 네트워크 분할 허용성 (Partition tolerance)
지역적으로 분할된 네트워크 환경에서 동작하는 시스템에서 네트워크가 단절되거나 네트워크 데이터의 유실이 일어나도 각 지역의 시스템은 정상적으로 동작함을 보증하는 것을 의미한다.
관계형 DB는 CA 시스템이다. 따라서 다량의 서버를 운용하는 클러스터링에 적합하지 않다.
대부분의 NoSQL은 대용량 분산 시스템을 구축하는데 알맞은 CP나 AP 시스템이다.
👉 저장 방식에 따른 NoSQL 분류
Key-Value, Document, Column으로 구분할 수 있다.
1. Key-Value Model
- 가장 기본적인 형태. 저장과 조회라는 가장 간단한 원칙에 충실한 DB.
하나의 키에 하나의 데이터를 저장하고 조회할 수 있는 구조이다. - 값에 모든 데이터 타입을 허용함 → 개발자들이 데이터 입력 단계에서 검증로직을 제대로 구현해야 함
- 하나의 서비스 요청에 다수의 데이터 조회 및 수정 연상이 발생하면 트랜잭션 처리가 불가능하여 정합성을 보장할 수 없다. (AP)
- 간단한 DB로 데이터를 자주 읽고 쓰는 경우 사용한다.
- 장바구니 정보와 같은 일시적 속성 추적
- 사용자 데이터 정보와 구성 정보 저장
- 이미지나 오디오 파일같은 대용량 객체 저장
- Redis. AWS DynamoDB.
2. Document Model
- key-value Model의 확장한 구조. 하나의 키에 하나의 구조화된 문서를 저장하고 조회한다.
여기서 문서란 JSON이나 XML같은 표준 형식을 가진 문서이다. (Key-Value와 차이점) - B 트리 인덱스를 사용하여 2차 인덱스를 생성한다. 따라서 쓰기의 성능이 떨어지게 된다. (읽기:쓰기 = 7:3 → 이상적)
- 아래와 같이 사용된다.
- 대용량 데이터를 읽고 쓰는 웹 사이트용 백엔드 지원
- 제품처럼 다양한 속성이 있는 데이터 관리
- 다양한 유형의 메타데이터 추적
- JSON 데이터 구조를 사용하는 앱
- 비정규화된 중첩 구조를 사용하는 앱
- MongoDB.
Document Model의 예는 아래와 같다.
{
"_id": "10006546",
"listing_url": "https://www.airbnb.com/rooms/10006546",
"name": "Ribeira Charming Duplex",
"summary": "Fantastic duplex apartment with three bedrooms, located in the historic area of Porto, Ribeira (Cube)...",
"house_rules": "Make the house your home...",
"property_type": "House",
"calendar_last_scraped": {
"$date": {
"$numberLong": "1550293200000"
}
},
"amenities": [
"TV",
"Cable TV",
"Wifi",
"Kitchen",
"Paid parking off premises",
"Smoking allowed",
"Microwave"
]
}
3. Column Model
- Row형으로 저장하는 대신 Column으로 저장하는 방식이다.
- c1 열의 값을 조회하고 싶을 때 우리는 모든 행을 읽어야한다.
- 아래 처럼 한번의 조회로 c1 열의 값을 모두 가져오고 싶다. → Column Model 사용
- c1 열의 값을 조회하고 싶을 때 우리는 모든 행을 읽어야한다.
- 하나의 키에 여러 개의 칼럼 이름과 칼럼 값의 쌍으로 이루어진 데이터를 저장하고 조회한다. 저장의 기본 단위는 Column이며, Column 수가 많다면 이를 묶어 Column Family로 구성한다.
- 다수의 클러스터에서 운영된다. 만약 단일서버에서 운영해도 될만큼 데이터가 적다면 적합하지 않다.
- 읽기보다 쓰기에 특화되어 있다. 빠른 시간 안에 대량의 데이터를 입력하고 조회하는 서비스를 구현할 때 가장 좋은 성능을 보인다.
- 수백만 테라바이트 정도의 대용량 데이터를 처리할 수 있는 앱
- 지리적으로 여러 데이터 센터에 분산되어 있는 앱
- 동적 필드를 처리하는 앱
- BigTable. Cassandra. HBase.
'Engineering 💻 > CS' 카테고리의 다른 글
[CS] 객체 지향 프로그래밍 (0) | 2022.01.16 |
---|