티스토리 뷰

반응형

이 글은 필자가 SQL에 대해 공부하기 위해 인터넷에서 공부한 것을 요약한 글입니다.

 

각 개념과 솔루션의 차이점, 그리고 장단점을 설명합니다.

 

1. SQL (관계형 데이터 베이스)

SQL(Struectured Query Language)는 데이터 베이스 자체를 나타내는 것이 아닌,

데이터베이스 관리 시스템(RDBMS)에서 데이터를 저장, 수정, 검색, 삭제를 하기 위한 쿼리 언어.

 

이러한 관계형 데이터베이스에는 두 가지 주요 특징이 있다.

1. 데이터는 이미 정해진 데이터 스키마(=structure)를 따라 데이터베이스 테이블에 저장된다.

2. 데이터는 관계를 통해서 연결된 여러개의 테이블에 분산된다.

 

스키마

엄격한 스키마의 경우, 테이블의 형식으로 데이터가 저장되는 걸 말한다.

각 테이블에 명확하게 정의 된 구조(Id, name, value 등등의 열(column))가 있고, 구조는 어떤 데이터가 테이블에 들어가고 어떤 데이터가 그렇지 않을지를 정의하는 필드(field) 집합을 가르킨다.

 

관계형 데이터베이스에서는 스키마를 준수하지 않는 레코드는 추가할 수 없다.

더 많은 필드(테이블에서의 열)를 추가하고 싶다면 다른 테이블을 선택해야 한다.

 

관계

SQL 기반의 데이터 베이스에서는 데이터들을 여러 개의 테이블에 나누어서 데이터들의 중복을 피할 수 있다.

만약 사용자가 구입한 상품들을 나타내기 위해서는 사용자의 특징(사는 집, 주소, 전화번호)들을 담은 여러 테이블을 만들어야 하지만, 각각의 테이블들은 다른 테이블에 저장되지 않은 데이터 만을 가지고 있다(필드가 독립적이며, 중복이 없다)

 

다만 이런 명확한 구조는 단점이 있다. 하나의 테이블에서 중복없이 하나의 데이터만을 관리하기 떄문에, 다른 테이블에서 부정확한 데이터를 다룰 위험이 있다.

 

 

2. NoSQL (비관계형 데이터베이스)

NoSQL은 SQL과 반대대는 접근방식이다.

 

스키마 X, 관계 X

 

NoSQL에서는 레코드를 문서(documents)라고 부른다.

 

중요한 차이점은 SQL에서는 스키마를 따르지 않는다면 데이터를 추가할 수 없다.

NoSQL에서는 다른 구조의 데이터도 같은 컬렉션(테이블)에 추가할 수 있다.

 

Database - collections - documents의 구조를 따른다.

Database User Info
collections Place Phone number
documents { address : seoul } { :: }

 

문서는 JSON 데이터와 비슷한 형태를 가진다.

 

일반적으로 관련 데이터를 동일한 컬렉션에 넣는다. 관계형 데이터베이스처럼 여러 테이블에 나누어 담지 않는다.

즉, 사는 집, 주소, 전화번호를 한꺼번에 저장할 수 있다.

 

그러므로 여러 테이블 / 컬렉션에 join 할 필요 없이 모든 걸 갖춘 documents가 완성된다.

 

NoSQL 데이터베이스는 조인이라는 개념이 별도로 존재하지 않는다.

하지만 컬렉션을 통해 데이터를 복제해서, 각 컬렉션 일부분에 속하는 데이터를 정확하게 추출한다.

 

다만 이런 방식은 데이터가 중복되기 때문에 불안정한 측면이 있다.

(하나의 컬렉션에서만 데이터를 업데이트하고, 다른 컬렉션에서 데이터가 방치될 수도 있다)

그래서 특정 데이터를 같이 사용하는 모든 컬렉션에서 똑같은 데이터 업데이트를 수행하도록 해야 한다.

 

그래도 장점은 조인을 사용할 필요가 없다는 것.

필요한 모든 데이터가 이미 하나의 컬렉션 안에 저장되어 있기 때문.

특히나 자주 변경되지 않는 데이터를 다룰 때 더 큰 장점이 있다.

 

수직적 스케일링 vs 수평적 스케일링

두 데이터 베이스의 비교에서 확장성이 비교된다.

 

확장은 수직적과 수평적으로 비교된다.

수직적 확장이란 단순하게 데이터베이스 서버의 성능을 향상시키는 것(하드웨어 업그레이드)

수평적 확장이란 더 많은 서버가 추가되고 데이터베이스가 분산하는 것을 의미한다.(하나의 데이터베이스, 여러 호스트(파티션(?))

 

데이터가 저장되는 방식 때문에 SQL 데이터베이스는 수직적 확장만을 지원.

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

 

SQL은 샤딩을 못하고, NoSQL은 여러 서버에서 데이터베이스를 쉽게 분리 가능.

 

선택

어떤 데이터를 다루는지, 어떤 상황에서 사용되는지 고려해야 한다.

 

SQL의 장점

1. 스키마로 인해 데이터 무결성 보장

2. 관계성으로 인해 데이터의 중복이 없다.

 

NoSQL의 장점

1. 스키마가 없어서 언제든지 저장된 데이터를 조정하고 새로운 필드 추가 가능

2. 데이터는 어플리케이션이 필요로 하는 형식으로 저장된다. 따라서 데이터를 읽는 속도가 빨라진다.

3. 수직 및 수평 확장이 가능하므로 데이터베이스가 애플리케이션에서 발생시키는 모든 읽기와 쓰기 요청이 처리 가능하다.

 

 

SQL의 단점

1. 데이터 스키마는 사전에 설계되어야 하고 어떻게 되어있는지 모두가 알고 있어야 합니다.

2. 관계성이 있어 JOIN 문이 매우 많은 쿼리문이 생성될 수 있는 가능성이 있다.

3. 수평적 확장이 어렵고 수직적 확장만 가능하다.

 

NoSQL의 단점

1. 오히려 너무 유연해서 데이터 구조 결정을 하지 못하고 미루게 될 수 있다.

2. 데이터 중복의 위험성이 있어서 수정 시 무조건 전체 업데이트를 해야한다.

 

 

SQL의 사용처

-관계를 맺고 있는 데이터가 자주 변경되는 어플리케이션

- 수정 여지가 있으며, 엄격한 스키마가 사용자와 데이터에게 중요한 경우

 

NoSQL의 사용처

- 정확한 데이터 구조를 알 수 없고 변경 / 확장 될 수 있는 경우

- 읽기 처리는 자주 하지만, 데이터를 자주 변경(update)는 하지 않는 경우

- 데이터베이스를 수평으로 확장해야 하는 경우 (즉, 막대한 양의 데이터를 다루는 경우)

 

아무래도 딥러닝을 하려면 데이터를 많이 다뤄야 하므로, 필자의 경우엔 NoSQL이 좋을 것 같다.

 

----2024-05-13 추가

DBMS의 종류는 

RDBMS와 NoSQL이 있다.

관계형 데이터 베이스는 시트 1과 시트2를 합쳐서 시트 3을 만들어낼 수 있으면 관계가 있는 것.

Oracle,mysql,postgresql

sqlite는 쓰기는 간편하지만 성능이 굉장히 안좋다.

 

스타트업 - mysql, 금융권 oracle, postgresql은 django와 증권 사업

NoSQL

mongodb를 가장 많이 사용

 

데이터 베이스 엔진에 대한 성능 랭킹은 oracle이 1등, mysql이 2위이나, mongodb는 nosql 중에서는 1위이다.

사용률이 가장 높은 건 mysql.

oracle이 좋긴 하나, 가격이 매우 높다. 기술지원 라이센스 =1만 달러 = 1천만원

 

mysql조차 oracle이 인수해서 가지고 있다.

RDBMS의 장점 => Read가 빠르다. 오래된 만큼 신뢰성도 높다. 스키마 수정이 어렵다.

하나가 삭제될 때 다른 것까지 삭제하거나 해야 해서 CRUD중 나머지 3개는 느리다.

 

스키마 - 데이터 베이스 구조(어떠한 관계를 가지느냐)에 대한 디자인이다.

 

NoSQL
• NoSQL : Not Only SQL
• RDBMS의 한계를 극복하기 위해 만들어진 데이터 베이스
• 확장성이 좋음 - 데이터의 분산처리 용이 (빅데이터에서 많이 쓴다. 빅데이터는 Create(저장)에서 속도가 빨라야 한다.)

데이터 베이스를 설계 할 떄는 RDBMS - R이고,

NoSQL은 CUD가 빠르므로,

 

댓글 내용은 RDBMS = Read가 1만번 될 때 create가 1번 된다. read는 많고 create는 적기 때문에 RDBMS에 저장

그러나 행동 log 같은 데이터들은 read가 적다. create는 겁나 많다. 거의 5초에 한번씩 체크한다.

이러한 데이터는 NoSQL 데이터베이스에 저장한다.

 

즉, 저장하려는 데이터의 특징을 파악해서 저장해야 한다. = 시니어 개발자들이 하는 일이다.


• 데이터 저장이 유연함 - RDBMS와 다르게 구조의 변경이 불필요
• 스키마(Schema) 및 Join이 없음
• Collection 별로 관계가 없기 때문에 모든 데이터가 들어있어야 함
• 저장되는 데이터는 Key- Value 형태의 JSON 포멧을 사용
• Select는 RDBMS 보다 느리지만 Insert가 빨라 대용량 데이터 베이스에 많이 사용됨
• 트랜젝션(transaction)이 지원되지 않음 (동시수정에 대한 신뢰성이 지원되지 않음)

 

Mongodb
• C++로 작성된 오픈소스 데이터 베이스
• 뛰어난 확장성과 성능을 가짐
• NoSQL에서는 인지도가 가장 높음
• Collection
• RDBMS의 Table과 같은 개념
• Document
• RDBMS의 Row와 같은 개념
• Key
• RDBMS의 Column과 같은 개념

 

nosql의 구조는 계층적 구조를 가진다.

 

Server에서 DBS라고 하는 데이터 베이스 프로그램이 돌아간다. 따지자면 엑셀

엑셀 : DB

엑셀 파일 : DB - DB1, DB2 등

Collection은 파일 안의 시트의 개념이다. 행과 열의 개념으로 이루어져 있다.

Document는 Collection의 행이다.

key:value는 Collection의 열이다.

 

그래서 Server>DBS>DB>Collection>Document>Document=key:value이다.

 

데이터베이스에서 데이터를 가져올 때는 데이터 베이스에 접속해서, Collection에서 

client.mongo.user

client = DBS

.mongo = DB 이름

.user = collection의 이름이다.

 

 

 

반응형