DB 선택은 기본 설정, 비즈니스 요구사항, 볼륨, 데이터 유형에 따라 달라짐
SQL(Structured Query Language)
- RDBMS(관계형 데이터베이스 관리 시스템)에서 데이터를 저장, 수정, 삭제, 검색하는 데 사용되는 언어
- 정해진 데이터 스키마에 따라 데이터를 테이블에 분산하여 저장 - 다양한 엔티티와 변수 간의 관계가 있는 구조화된 데이터 관리 시 사용
- 다중 행 트랜잭션이 필요한 응용 프로그램에 유리
- ACID 속성을 준수
- 수직 확장 가능 - 단일 서버에서 하드웨어 용량(CPU, RAM, SSD 등)을 늘려 확장 가능
- 대표 예시: MySQL, Oracle, MS-SQL, SQLite
장점: 강력한 보안, DB 트랜잭션이 ACID 속성을 준수해 안정성 보장
역할 기반 보안, 사용자 수준 권한을 통한 액세스 제어, 암호화된 메시지, 행 및 열 액세스 제어 지원
코드 필요 X
DB 레코드를 쉽고 빠르게 검색할 수 있음
단점: 보안 라이센스 비용이 상당함
빅데이터 처리 시 확장을 위해 하드웨어를 늘려야 해서 비용 많이 듦
SQL은 객체라서 공간을 차지함
데이터 액세스 속도가 비교적 느림
쿼리문 분류
- DDL(데이터 정의어): 스키마 생성, 수정에 사용.
ex) CREATE, ALTER, DROP - DML(데이터 조작어): DB 선택, 삽입, 업데이트, 삭제에 사용.
ex) SELECT, INSERT, UPDATE, DELETE - DCL(데이터 제어어): 액세스 제어, DB 권한 제공에 사용.
ex) GRANT, REVOKE - TCL(트랙잭션 제어어): 데이터 무결성 유지를 위해 트랜잭션 제어, 관리에 사용.
ex) BEGIN, COMMIT, ROLLBACK
사용 시 참고하면 좋은 글: https://ko.myservername.com/top-90-sql-interview-questions
NoSQL
- 테이블 형식으로 구성되지 않는 비관계형 형식의 데이터를 관리하는 방법을 제공하는 DB 언어. 구조화된 쿼리 언어 지원 X
- 스키마 정의를 고수할 필요 X, 구조화되지 않은 데이터에 대한 동적 스키마가 있음 - 데이터 유연하게 저장 가능
- 빅데이터, 실시간 애플리케이션 등 대용량 분산 데이터 세트, 계층적 데이터 저장에 적합
- BASE 속성 - ACID 속성을 엄격하게 준수하지 않고 최종 일관성만 보장
- 수평 확장 가능 - 대규모로드를 관리하고 힙을 줄이기 위해 인프라에 더 많은 서버를 추가해 확장 가능
- 대표 예시: Apache, MongoDB, Redis
장점: 방대한 양의 비정형 데이터를 빠르게 액세스하고 처리하기 좋음 - 빅데이터 처리 가능
스키마와 테이블이 없어 데이터 모델에 높은 수준의 유연성 제공
확장성과 가용성이 뛰어나 비용이 저렴함
DB 모델링 필요 X
단점: RDBMS만큼 보안이 강력하지 않아 데이터에 액세스하는 애플리케이션의 보안에 의존해야 함
비교적 적은 커뮤니티 지원
고정되고 잘 정의된 스키마가 없어서 권한을 분리할 수 없음 - 마이그레이션 중에 몇가지 문제 발생
DB 유형 분류
- (와이드) 열
데이터 테이블을 열로 저장, 정렬
기존 DB보다 매우 빠르게 대량의 데이터 쿼리 가능. 추천 엔진, 카탈로그, 사기 탐지 등에 사용 가능
ex) Cassandra, HBase, Google BigTable, Scylla, Vertica - 문서
문서 형식의 설명과 함께 반구조화 된 데이터를 저장, 유지
각 문서에 주소를 지정하는 고유키가 있어, 콘텐츠 관리나 모바일 애플리케이션 데이터 처리에 유용
JSON, JavaScript와 함께 널리 사용
콘텐츠 기반으로 문서를 가져올 수 있는 API, 쿼리 언어 제공
ex) Apache, MongoDB, MarkLogic, CouchDB, BaseX, IBM Domino - 키-값
데이터가 키-값 쌍의 모음을 나타내는 연관 배열(지도나 사전)을 기반으로 하는 데이터 모델을 가짐
웹 애플리케이션의 세션 관리, 캐싱에 매우 적합
ex) Aerospike, Berkeley DB, Apache ignites, Dynamo, Redis, Riak, ZooKeeper - 그래프
데이터가 노드와 간선으로 구성
노드(node)는 레코드, 에지(edge)는 관계형 DB의 레코드 간 관계로 생각할 수 있음
데이터 관계의 풍부한 표현을 지원
고객 관계 관리 시스템, 로드맵, 예약 시스템 등에 유용
ex) AllegroGraph, InfiniteGraph, MarkLogic, Neo4j, IBM graph, Titan
참고 블로그:
https://ko.myservername.com/top-90-sql-interview-questions
https://gyoogle.dev/blog/computer-science/data-base/SQL%20&%20NOSQL.html
DB 트랜잭션의 ACID 성질
A(Atomicity, 원자성), C(Consistency, 일관성), I(Isolation, 고립성), D(Durability, 지속성)
- SQL은 ACID 속성을 준수하고, NoSQL은 ACID 속성을 엄격하게 준수하지는 않음
하지만 NoSQL의 이점은 ACID를 준수하지 않는 점에서 옴
- ACID는 DB 내에서 일어나는 각 트랜잭션의 안전성을 보장하기 위한 성질
주식거래, 금융업에서 중점적으로 사용 => 주식거래, 금융업에서는 관계형 DB 이용
- 관계형 DB 사용 시 상호작용 방식을 정확하게 규정할 수 있기 때문에
데이터 처리 시 발생가능한 예외 상황을 줄이고 데이터 무결성 보호 가능
- 원자성
시스템에서 한 트랜잭션의 연산이 모두 성공하거나, 아니면 전부 실패하는 성질
작업이 모두 반영되거나 모두 반영되지 않음으로써 결과 예측 가능 - 일관성
한 트랜잭션 이전과 이후, DB의 상태가 이전과 같이 유효해야 함
트랜잭션이 일어난 이후의 DB는 DB의 제약이나 규칙을 만족해야 함 - 고립성
모든 트랜잭션은 다른 트랜잭션과 독립되어 있어야 함
동시에 여러 트랜잭션 수행 시, 각 트랜잭션은 고립되어 있어 연속 실행된 것과 동일 - 지속성
트랜잭션이 성공적으로 수행됐을 시, 해당 트랜잭션에 대한 로그가 남아야 함
런타임 or 시스템 오류가 발생해도 기록은 영구적이어야 함
참고 블로그:
'기타' 카테고리의 다른 글
[웹 개발] 프론트와 백에서의 CORS 문제 해결하기 (0) | 2022.08.12 |
---|---|
[Javascript] 비동기 처리, Promise, async/await (0) | 2022.07.13 |
websocket과 socket.io 의 차이 (0) | 2022.06.22 |
[Sourcetree] Bitbucket 협업 시 충돌 병합(Conflict Merge) 해결 방법 (0) | 2022.06.07 |
Cognito 참고 자료 (0) | 2022.04.26 |