[TIL] SQL

김민성·2021년 4월 9일
0

SQL

structured query language : 구조화된 쿼리 언어

query?

질의문
검색창에 적는 검색어도 쿼리의 일종
저장되어있는 정보를 필터링하기 위한 질문

Database가 필요한 이유

기존에는 in-memory 데이터로 서버를 끄면 추가, 수정했던 데이터가 없어지고 초기화된다.
file i/o 기능으로 원하는 데이터만 가져올 수 없고 항상 모든 데이터를 가져온뒤 서버에서 필터링을 하여 클라이언트에 표시했다.
-> 필터링 외에도 file i/o로 구현이 힘든 관리를 위한 여러 기능들을 가지고 있는 데이터에 특화된 서버가 Database이다!

트랜잭션 : 여러 개의 작업들을 하나의 실행 유닛으로 묶어준 것. 각 트랜잭션은 하나의 특정 작업으로 시작을 해 묶여 있는 모든 작업들을 다 완료해야 끝나게 되어 있습니다. 만약에 한 개의 작업이라도 실패하게 된다면 전부 실패를 하게 됩니다. 다시 말해 작업이 하나라도 실패를 하게 되면 트랜잭션도 실패이고 모든 작업이 성공적이면 트랜잭션 또한 성공적이게 됩니다. -> 성공 또는 실패 뿐!

이러한 데이터베이스 트랜잭션의 정의는 ACID 특성들을 가지고 있습니다.
ACID: ACID 는 Atomicity, Consistency, Isolation, Durability 를 말합니다.

ACID

Atomicity(원자성): 하나의 트랜잭션이 전부 성공하거나 전부 실패해야 됩니다.
-> 부분적으로 실행이 되면 안되는 성질.

Consistency: 데이터베이스 상태 일관성에 대한 성질입니다. 하나의 트랜잭션 이전과 이후 데이터베이스 상태는 이전과 같이 유효해야 한다는 뜻입니다. 즉, 데이터베이스의 제약이나 규칙에 의거한 데이터베이스이어야 한다는 뜻입니다.

Isolation: 하나의 트랜잭션이 다른 트랜잭션과 독립되어야 한다는 뜻입니다.
실제로 동시에 여러 개의 트랜잭션들이 수행될 때에 각 트랜잭션은 고립되어 있어 연속으로 실행된 것과 동일한 결과를 나타내야 합니다.

Durability: 지속성 (durability)은 하나의 트랜잭션이 성공적으로 수행되었다면 해당 트랜잭션에 대한 로그가 남고 런타임 오류나 시스템 오류가 발생해도 해당 기록은 영구적이어야 한다는 뜻입니다. -> 해당 특성이 기존의 in-memory데이터와 차이점인 것 같다.


*스키마: 데이터베이스에서 데이터가 구성되는 방식과 서로 다른 엔티티 간의 관계에 대한 설명입니다.


관계형 DB

행과 열의 형태로 데이터가 저장된다.
sql은 crud를 전부 충족하는 언어이다.
sql을 사용하려면 형식이 고정된 스키마가 필요하다.
primary key는 관계형 db 테이블의 각 레코드를 고유하게 식별하는 속성입니다.
pk는 하나이상의 컬럼에도 부여할 수 있다.

데이터의 형태가 정형화 되어있는 경우, ACID특성을 따라야할 경우 관계형 DB를 사용하는 것이 좋습니다.
ex) MySQL, Oracle, SQLite, PostgresSQL, MariaDB

테이블 간 관계는 다음과 같이 나눌 수 있습니다

1:1 관계 : 테이블 하나의 값에서 다른 테이블로 하나의 값만 가지는 경우가 해당합니다. 이런 경우는 같은 테이블에 적는 것이 더 좋습니다.

1:N 관계 : 테이블 하나의 값에서 다른 테이블로 여러개의 값을 가지는 경우입니다. 유저테이블, 게시물관리 테이블이 있을 경우 하나의 유저는 여러개의 게시물을 작성할 수 있지만 하나의 게시물은 한명의 유저만 관리할 수 있습니다. 이런 경우가 1:N 관계에 해당합니다. A(1):B(N) 관계일 경우 A의 PK가 B의 FK가 됩니다.

N:M 관계 : sns에서 유저와 팔로워 관계가 해당합니다. 한명의 유저는 여러명의 팔로워를 가질 수 있고, 한명의 팔로워 역시 여러명의 유저를 팔로잉할 수 있습니다. A(N):B(M) 관계일 경우 A, B테이블 사이에 조인테이블을 만들고 A, B의 키를 FK로 가집니다.

테이블 자체 관계
self referencing 관계
예를 들어 추천인이 누구인지 파악하기 위한 목적으로 사용합니다.
한 유저당 한 명의 추천인을 입력할 수 있습니다. 즉, 한 유저당 하나의 추천인을 가질 수 있습니다. 하지만 추천인 입장에서는 여러 개의 유저를 가질 수 있습니다. 복수로 추천될 수 있다는 뜻입니다.

비관계형 DB

데이터가 고정되어 있지 않은 데이터베이스 형태.
관계형 db는 정해진 스키마 형태에 따라 데이터를 저장하지만 비관계형 db는 Key-Value 타입, 문서형(Document) 데이터베이스, Wide-Column 데이터베이스, 그래프(Graph) 데이터베이스 형식등으로 데이터를 저장할 수 있습니다.

Key-Value 타입

데이터를 Key-Value의 쌍을 속성으로 하는 배열 형태로 저장합니다. 여기서 Key는 속성 이름을 뜻하고, Value는 속성에 연결된 데이터 값을 의미합니다. Redis, Dynamo 등이 대표적인 Key-Value 형식의 데이터베이스입니다.

문서형(Document) 데이터베이스

데이터를 문서처럼 저장하는 데이터베이스를 의미합니다. JSON 유사 형식으로 데이터를 문서화하는 것이 보통입니다. 각각의 문서는 하나의 속성에 대한 데이터를 가지고 있고, 컬렉션이라고 하는 그룹으로 묶어서 관리합니다. 대표적인 문서형 데이터베이스에는 MongoDB가 있습니다.

Wide-Column 데이터베이스

데이터베이스의 열(column)에 대한 데이터 관리를 집중하는 데이터베이스입니다. 각 열에는 key-value 형식으로 데이터가 저장되고, 컬럼 패밀리(column families)라고 하는 열의 집합체 단위로 데이터를 처리할 수 있습니다. 하나의 행에 많은 열을 포함할 수 있어서 높은 유연성을 자랑합니다. 데이터 처리에 필요한 열을 유연하게 선택할 수 있다는 점에서 규모가 큰 데이터 분석에 주로 사용되는 데이터베이스 형식입니다. 대표적인 wide-column 데이터베이스에는 Cassandra, HBase가 있습니다.

그래프(Graph) 데이터베이스

자료구조의 그래프와 비슷한 형식으로 데이터 간의 관계를 구성하는 데이터베이스입니다. 데이터는 노드(nodes)에 속성별(entities)로 저장됩니다. 각 노드간 관계는 선(edge)으로 연결됩니다. 대표적인 그래프 데이터베이스에는 Neo4J, InfiniteGraph가 있습니다.

-> 실시간 업데이트가 자주일어나는 앱의 경우 유연한 비관계형 데이터베이스가 적합합니다. 그리고
데이터의 구조가 거의 없거나, 클라우드 기반으로 데이터저장소를 구축하는 경우, DB의 확장성이 중요한 경우에 NoSQL를 사용하는 것이 좋습니다.


내가 my sql을 사용하면서 헷갈렸던 것

group by를 사용할 때는 집계 가능한 컬럼을 집계함수에 넣어주어야한다. 처음에는 집계함수를 넣지않고 무작정 group by만 쓰다가 나중에는 집계가 가능한 컬럼이 아닌 곳에 집계함수를 씌우면서 그룹핑이 되지않아서 헤맸다. 내가 집계함수를 내고 싶은 컬럼과 어떤기준을 가지고 그룹핑을 할지 생각을 하면서 group by를 작성해보자!

profile
https://github.com/alstjd8826

0개의 댓글