영권's
20210809 - TIL (데이터베이스) 본문
데이터베이스가 왜 필요한가?
모든 IT서비스는 데이터를 만들어내고 이는 기록되어야 함
예) 쿠팡에서 회원 가입시 회정정보 저장 필요, 구매 관련 정보 저장 필요 등등
어디에 이런 데이터를 저장할까?
- 프로덕션 관계형 데이터베이스
- 어떤 서비스의 운영에 필요한 데이터를 저장하는 곳(MySQL, PostgreSQL ,... )
- 빠른 처리속도가 중요함
- vs 데이터 웨어하우스 관계형 데이터베이스
- 데이터를 구조화된 테이블들의 집합으로 구성하여 저장하고 관리
- 개발자라면 잘 알아야하는 기본 기술
- 관계형 DB의 프로그래밍 언어가 SQL
데이터 분석을 위한 데이터베이스
- 데이터 웨어하우스
- 회사 관련 데이터를 저장하고 분석함으로써 의사결정과 서비스 최적화에 이용
- BigQuery, Snowflake, MySQL ...
- 처리속도 보다는 구조화된 큰 데이터를 처리하는 것이 중요
- vs 프로덕션 관계형 데이터베이스
- 데이터 직군이라면 반드시 알아야 함(SQL)
- 데이터 엔지니어, 데이터 분석가, 데이터 과학자
- 회사 관련 데이터를 저장하고 분석함으로써 의사결정과 서비스 최적화에 이용
데이터 순환 구조 : 프로덕션 데이터베이스와 데이터 웨어하우스
- 서비스 사이트나 앱에서 생성되는 구매정보와 같은 다양한 데이터를 프로덕션 데이터에 저장
- 빠른 처리속도가 중요
- 프로덕션용 데이터베이스에 저장한 내용과 외부 데이터 추출을 포함한 데이터 웨어하우스에 저장할 수 있음
- 데이터 웨어하우스의 데이터를 통해 지표를 설정을 하고 시각화를 통해 회사가 가는 방향이 제대로된 방향인지 설정할 수 있다.
- 데이터들을 통해 사용자가 선호하는 데이터들을 개인화하여 제품 서비스 개선을 할 수 있다.
다양한 데이터베이스의 종류
- 관계형 데이터베이스 : 구조화된 데이터
- 프로덕션용 데이터베이스
- 데이터 웨어하우스용 관계형 데이터베이스
- 비관계형 데이터베이스 : 비구조화 데이터도 다룸
- 흔히 NoSQL 데이터베이스라고 부르기도 함
- 보통은 프로덕션용 관계형 데이터베이스를 보완하기위한 용도로 많이 사용됨
- 크게 4가지가 존재
- key/Value Storage : Redis, Memcache...
- Document Store : MongoDB
- Wide Column Storage : Cassandra, HBase, DynamoDB
- Search Engine : ElasticSearch
시스템 구성의 변화
2 tier
- 보통 데스크탑 응용프로그램에서 사용되는 아키텍쳐
- 클라이언트와 서버 두 개의 티어로 구성
- 클라이언트는 사용자가 사용하는 UI가 됨(front-end)
- 비즈니스 로직은 보통 클라이언트에 위치
- 서버단이 데이터베이스가 됨(back-end)
- 클라이언트는 사용자가 사용하는 UI가 됨(front-end)
3 tier
- 보통 웹 서비스에서 많이 사용되는 아키텍쳐
- 프리젠테이션 티어(Presentation Tier) : 프론트엔드
- 애플리케이션 티어(Application Tier) : 백엔드
- 데이터 티어(Data Tier) : 백엔드
시스템 구성의 예 : Spring Boot
- 기본적으로 3tier 구조
- 파이썬의 경우 Django/Flask, JS는 Node.js, 자바는 Spring Boot
- 프론트엔드로 가장 많이 쓰이는 옵션은 React
관계형 데이터베이스
- 구조화된 데이터를 저장하고 질의할 수 있도록 해주는 스토리지
- 엑셀 스프레드시트 형태의 테이블로 데이터를 정의하고 저장
- 테이블에는 컬럼(열)과 레코드(행)이 존재.
- 컬럼마다 타입이 존재.
- 엑셀 스프레드시트 형태의 테이블로 데이터를 정의하고 저장
구조화된 테이블에 레코드 추가, 읽기, 수정들을 어떻게 할것인가?
그런 행위를 해주는 것이 바로 SQL
관계형 데이터베이스를 조작하는 프로그래밍 언어가 SQL
- 테이블 정의를 위한 DDL(Data Definition Language)
- 앞서 보여준 테이블의 포맷을 정의해주는 언어
- 테이블 데이터 조작/질의를 위한 DML (Data Manipulation Language)
- DDL로 정의된 테이블에 레코드를 추가, 삭제, 수정, 읽어들이기 위해 사용하는 언어
대표적인 관계형 데이터베이스
프로덕션 데이터베이스 : MySQL, PostgreSQL, Oracle
- OLTP(OnLine Transaction Processing)
- 빠른 속도에 집중. 서비스에 필요한 정보를 저장.
데이터 웨어하우스 : RedShift, Snowflake, BigQuery, Hive
- OLAP(OnLine Analytical Processing)
- 처리 데이터 크기에 집중. 데이터 분석 혹은 모델 빌딩등을 위한 데이터 저장
- 보통 프로덕션 데이터베이스를 복사해서 데이터 웨어하우스에 저장
- 만약 데이터 분석과 같은 일을 하기위해 질의를 날렸을 때 프로덕션 DB에 지장을 안주기 위해
관계형 데이터베이스의 구조
- 관계형 데이터베이스는 2단계로 구성됨.
- 가장 밑단에는 테이블들이 존재(테이블은 엑셀의 시트에 해당)
- 테이블들은 데이터베이스(혹은 스키마)라는 폴더 밑으로 구성(엑셀에서는 파일)
- 테이블의 구조(테이블의 스키마라고 부르기도 함)
- 테이블은 레코드들로 구성(행)
- 레코드는 하나 이상의 필드(컬럼)로 구성(열)
- 필드(컬럼)는 이름과 타입과 속성(primary key)로 구성됨.
SQL(Structured Query Language)
- 관계형 데이터베이스에 있는 데이터(테이블)를 질의하거나 조작해주는 언어
- SQL은 1970년대 초반에 IBM이 개발한 구조화된 데이터 질의 언어
- 두 종류의 언어로 구성
- DDL(Data Definition Language)
- 테이블 구조를 정의하는 언어
- DML(Data Manipulation Language)
- 테이블에서 원하는 레코드들을 읽어오는 질의 언어
- 테이블에 레코드를 추가/삭제/갱신해주는데 사용하는 언어
- DDL(Data Definition Language)
SQL은 빅데이터 세상에서도 중요!
- 구조화된 데이터를 다루는한 SQL은 데이터 규모와 상관없이 쓰임
- 모든 대용량 데이터 웨어하우스는 SQL 기반
- Redshift, Snowflake, BigQuery, Hive
- Spark나 Haddop도 예외는 아님
- SparkSQL 과 Hive라는 SQL언어가 지원됨.
- 백엔드 / 프론트엔드/ 데이터분야에서 반드시 필요한 기본 기술
SQL의 단점
- 구조화된 데이터를 다루는데 최적화가 되어있음
- 정규표현식을 통해 비구조화된 데이터를 어느정도 다루는 것은 가능하나 제약이 심함
- 많은 관계형 데이터베이스들이 플랫한 구조만 지원함(no nested like JSON)
- 구글 빅쿼리는 nested structure를 지원함
- 비구조화된 데이터를 다루는데 Spark, Hadoop과 같은 분산 컴퓨팅 환경이 필요해짐
- 즉, SQL만으로는 비구조화된 데이터를 처리하지 못함
- 관계형 데이터베이스마다 SQL 문법이 조금씩 상이함
Star schema
- Production DB용 관계형 데이터베이스에서는 보통 스타 스키마를 사용해 데이터를 저장
- 데이터를 논리적 단위로 나눠 저장하고 필요시 조인
- 스토리지의 낭비가 덜하고 업데이트가 쉬움
- 조인을 사용해야 하므로 시간과 리소스를 사용 해야하는 단점이 있을 수 있다.
Denormalized schema
- NoSQL이나 데이터 웨어하우스에서 사용하는 방식
- Star schema를 사용해도 되지만 데이터 웨어하우스는 사이즈에 제약을 덜 받는 구조다.
- 프로덕션 DB는 보통 컴퓨터 1대에 들어가는 DB라서 메모리나 디스크의 크기가 한정적이라 넘어가면 처리를 못함
- 데이터 웨어하우스는 다수의 컴퓨터 형태기 때문에 메모리나 디스크가 부족하면 다른 컴퓨터를 더 붙이면 된다. 이런 형태를 클러스터라고 한다.
- 단위 테이블로 나눠 저장하지 않음으로 별도의 조인이 필요 없는 형태를 말함
- 이는 스토리지를 더 사용하지만 조인이 필요 없기에 빠른 계산이 가능
SQL 기본
- 먼저 다수의 SQL문을 실행한다면 세미콜론으로 분리 필요
- SQL문1; SQL문2; SQL문3;
- SQL 주석
- -- : 인라인 한줄짜리 주석.
- /*-- */ : 여러 줄에 걸쳐 사용 가능한 주석
- SQL 키워드는 대문자를 사용한다던지 하는 나름대로의 포맷팅이 필요
- 팀 프로젝트라면 팀에서 사용하는 공통 포맷이 필요 (SQL 뿐만 아니라 프로그래밍 코딩 컨벤션은 굉장히 중요하다.)
- 테이블 / 필드 이름의 명명 규칙을 정하는 것이 중요
- 단수형 vs 복수형
- User vs Users
- _ vs . CamelCasing
- user_session_chaanel vs UserSessionChannel
- 단수형 vs 복수형
SQL DDL - 테이블 구조 정의 언어 (1)
CREATE TABLE
- Primary key 속성을 지정할 수 있음
- Primary key uniqueness : 유일키 보장
- 성능향상을 위해 인덱스를 지정할 수 있음
-- 예
CREATE TABLE raw_data.user_session_channel
(
userid int,
sessionid varchar(32) primary key,
channel varchar(32)
);
DROP TABLE
- DROP TABLE TABLE_NAME;
- 없는 테이블을 지우려고 하는 경우 에러를 냄
- DROP TABLE IF EXISTS TABLE_NAME;
- vs DELETE FROM
- DELETE FROM은 조건에 맞는 레코드들을 지움(테이블 자체는 존재)
ALTER TABLE
- 새로운 컬럼 추가
- ALTER TABLE 테이블명 ADD COLUMN 필드이름 필드타입;
- 기존 컬럼 이름 변경
- ALTER TABLE 테이블명 RENAME 현재필드명 TO 새필드명;
- 기존 필드 제거
- ALTER TABLE 테이블명 DROP COLUMN 필드이름;
- 테이블 이름 변경
- ALTER TABLE 현재테이블이름 RENAME TO 새테이블이름;
SQL DML - 테이블 데이터 조작 언어
레코드 질의 언어 : SELECT
- SELECT FROM : 테이블에서 레코드와 필드를 읽어 오는데 사용
- WHERE를 사용해서 레코드 선택 조건 지정
- GROUP BY를 통해 정보를 그룹 레벨에서 뽑는데 사용하기도 함
- DAU, WAU, MAU 계산은 GROUP BY를 필요로 함
- ORDER BY를 사용해서 레코드 순서를 결정하기도 함
- 보통 다수의 테이블의 조인해서 사용하기도 함.
레코드 추가/삭제/수정 언어
- INSERT INTO : 테이블에서 레코드를 추가하는데 사용
- UPDATE FROM : 테이블 레코드의 필드 값 수정
- DELETE FROM : 테이블에서 레코드를 삭제 (테이블은 존재)
- VS TRUNCATE : 조건 없이 테이블의 레코드를 모두 삭제
'데브코스 웹 백엔드 > TIL' 카테고리의 다른 글
2021-08-16 TIL (Build) (0) | 2021.08.16 |
---|---|
2021-08-13 TIL (데이터베이스 - 트랜잭션,VIEW) (0) | 2021.08.14 |
TIL - (데이터베이스) (0) | 2021.08.12 |
TIL - 인터페이스(함수형)와 람다 (0) | 2021.08.04 |
TIL - 개발 환경(클래스패스) (0) | 2021.08.02 |
Comments