Database를 이야기할 때 SQL을 논하지 않을 수 없다.
SQL
데이터베이스 용 프로그래밍 언어로 데이터베이스에 query(질의문 : 저장되어 있는 정보를 필터 하기 위한 질문)를(을) 보내 원하는 데이터 만을 뽑아올 수 있다.
Database가 필요한 이유는
In-memory 방식은 끄면 데이터가 없어진다.
File I/O 방식은 원하는 데이터를 가져올 수 없을 뿐만 아니라 항상 모든 데이터를 가져온 뒤에 서버에서 필터링 작업이 필요하다. 그렇기에 서버의 과부하가 생긴다.
그렇기에 필터링 이외에도 File I/O 로 구현이 힘든 관리를 위한 여러 기능들을 가지고 있는 데이터에 특화된 서버인 Database가 필요한 것이다.
DB는 스프레드시트(엑셀)와 비슷하게 생겼다. 비교해보자면
테이블(DB) – 시트(스프레드시트)
쿼리문(DB) - 자동필터자동 필터,고급 필터 사용(스프레드시트)으로 일단 볼 수 있을 것 같고
비슷하게 생겼기 때문에 column(열) row(행 : 각 데이터를 의미)는
Client – Server – Database의전반적인 흐름을 보자면
Client가 해당 요구 사항을 Server에 요청하면 Server는 요구 사항을 쿼리문으로 DB로 보내게 된다. 그럼 DB는 필터링을 하게 되고 요구 사항의 결과 값(json, xml등 환경설정에 따라 다르다)을 다시 Server로 전달해준다.Server는 이 데이터를 이미 필터 된 데이터이기에 가공할 필요 없이 Client에게 보여주기만 하면 된다.
좀 더 DB로 파고든다면 한 번쯤을 들어보았을 단어 Schema
Schema
DB에서 데이터가 구성되는 방식과 서로 다른 엔티티 간의 관계에 대한 설명이다. DB의 청사진이라고도 불린다.
여기서 엔티티는 고유한 정보의 단위로 DB에서는 위에서 언급한 테이블로 보면 되고 우리가 그동안 배웠던 js에서 보자면 객체로 이해하면 편할 것이다.
엔티티를 설명하는 필드가 있으며 행렬로 보았을 때 열에 해당된다.
레코드는 테이블에 저장된 항목으로 행렬로 본다면 행에 해당된다.
여러 엔티티 즉, 테이블이 존재하는 이들 간에는 관계를 지정해 볼 수 있다.
1:N, M:N과 같은 관계로 말이다.
테이블의 관계
1:N
예를 들면 사용자가 여러 개의 댓글을 작성할 수 있다. 이를 바탕으로 이야기해보면
우선 각 테이블에는 고유한 id라는 필드가 존재한다. 각 테이블의 레코드 하나를 가리키는 숫자로 추가될 때마다 자동적으로 값이 증가하며 이를 기본 키(Primary Key)라고도 부른다.
그리고 기본 키 말고도 다른 테이블에서 테이블의 기본 키를 참조할 때 해당 값을 외래 키(Foreign Key)라고 한다. 예를 들면 사용자 테이블에 댓글 id라는 필드는 댓글 테이블의 특정 레코드를 고유하게 식별하는 외래 키라는 것이다.
쉽게 말해 어떤 값을 참조할 수 있는 키라고 이해하면 될 것 같다.
이러한 외래 키를 지정할 때도 id를 담을 공간 부족의 문제와 한 열에 여러 값을 저장하여 검색 손실이 발생하는 경우 등 여러 리스크들을 고려하여 지정해주어야 한다.
물론 위에서 언급한 대로 하나의 열에 여러 값을 저장할 수 없기에 여러 개의 레코드를 만들어 쭉 늘어뜨리는 방법을 사용할 수도 있지만 이는 정합성이 깨지는 결과를 초래하게 된다. 동일하여야 하는 데이터가 하나의 오류가 정합성이 깨지는 상태가 올 수 있는 것이다. 그래서 소스는 한 군데에 정의되어야 한다.
그렇기에 제일 좋은 방법은 댓글 테이블에 사용자 id를 저장하는 것이다.
N(다)인 쪽에 다가 1의 필드를 만든다 라는 것으로 이해하면 될 것 같다. N(다)는 1에 속해 있다.
M:N
M:N 인 경우에는 어떻게 해주어야 할까?
이 경우에는 어떤 방법으로든 위에서 언급한 대로 하나의 열에 여러 값을 저장할 수 없다는 경우가 생기게 된다. 해결방법으로는 각 테이블들의 id를 하나에 테이블에 교차하는 부분에 맞게 저장해 보는 것이다. 우리는 이렇게 새롭게 만들어진 테이블을 조인 테이블이라고 한다. 이러한 조인 테이블은 1:M의 관계를 두 번 사용한 것과 같은 것이다.
이러한 것들이 바탕이 되어 DB가 구성되어 있는 것이고 우리는 DB에서 원하는 정보를 추출할 수 있는 방법인 SQL 쿼리문을 사용하여 원하는 정보를 얻으면 된다.
'개념정리' 카테고리의 다른 글
1/18[TIL]MVC Pattern, ORM (0) | 2021.01.18 |
---|---|
1/11[TIL]Redux (0) | 2021.01.11 |
1/7[TIL]React Hooks (0) | 2021.01.07 |
1/6[TIL]React(3) (0) | 2021.01.06 |
1/5[TIL]React(2) (0) | 2021.01.05 |