특정 데이터를 확인하고 싶을때 간단하게 찾아낼 수 있도록 정리된 데이터의 집합
컴퓨터 시스템에 저장된 정보나 데이터를 모두 모아 놓은 집합
웹 시스템 내의 데이터베이스 (웹 구현을 위한 모든 데이터가 저장되어 있다)
web client가 상품사진을 누르면 → 상세정보를 web application server로 요청 → 필요한 정보를 database에 요청
database에서 필요한 정보를 응답 → web application server에서 상세정보 응답 → web client에서 렌더링
모든 요청과 응답은 http 프로토콜을 통해 이루어지며 인터넷 연결이 필요하다.
왜 굳이 Web application server를 거치는가?
통신규약으로 인한 제약, 가공을 거치는 과정이 필요
DBMS: DB를 효율적으로 관리하는 소프트웨어
요청을 받고 응답을 한다.
(위 예시라면 web application server와 DB 사이에서)
DB와 DBMS는 왜 사용할까?
DB
DBMS
생산성 (검색, 추가, 삭제, 갱신 기능)
기능성 (복수의 유저 요청 대응, 대용량 데이터 저장, 고속 검색, 기능 확장의 유연함)
신뢰성 (확장성 Scalability, 부하 분산 Load balancing, 데이터 추출, 데이터 리스토어)
→ 여러 하드웨어로 분산할 수 있어서 신뢰성과 성능이 향상된다.
관계 대수에서 착안
행과 열을 가지고 표 형식으로 데이터를 저장 (2차원)
수 많은 표를 저장해두고 각 테이블에 이름을 붙여 관리한다.
SQL을 사용할 수 있다.
가장 일반적으로 사용되는 인프라는 인터넷. 웹 시스템과 연동하여 널리 사용된다.
RDBMS 소프트웨어 : MySQL, PostgreSQL, Oracle 등
모든 데이터는 2차원 테이블들로 표현할 수 있다.
ex) 모든 책 정보로 테이블을 만든다면?
Column (열) : 테이블의 각 항목 (id, 책 제목, 작가, 출판사, 가격)
Row (행) : 항목에 해당하는 값
테이블의 각 Row (행)은 자신만의 고유 키(Primary Key)가 있다.
다른 행과 겹치지 않는 고유한 번호가 있어야한다.
특정 로우를 찾거나 인용(reference)할 수 있다.
→ 데이터의 완전성
각 테이블은 서로 상호 관련성을 가지고 서로 연결될 수 있다.
각 테이블이 완전히 독립적이지 않고 서로 연관된 사이이다.
One to One
: 하나의 A 테이블 데이터는 하나의 B 테이블 데이터와 연결된다.
ex) 이름 테이블 A와 주민번호 테이블 B
B 테이블의 Foreign Key는 A 테이블의 PK를 참조한다.
One to Many
: 하나의 A 테이블은 B 테이블의 여러 데이터와 연결된다.
ex) 이름 테이블 A와 수강 과목 테이블 B
Many to Many
: 하나의 A 테이블은 B 테이블의 여러 데이터와 연결된다.
또한, 하나의 B 테이블은 A 테이블의 여러 데이터와 연결된다.
ex) 한 작가는 여러 권을 책을 쓸 수 있고, 한 책은 여러 작가가 쓸 수 있다.
→ Many to Many 관계는 중간 테이블이 필요하다.
테이블을 나누는 이유는 무엇일까? 하나의 테이블에 모두 저장하면?
→ 더 많은 디스크를 사용하게 되고, 잘못된 데이터가 저장 될 가능성이 높아진다.
여러 테이블에 나누어서 저장한후 필요한 테이블 끼리 연결 시키면?
→ 중복 데이터가 없어서 디스크를 더 효율적으로 쓰고,
→ 같은 데이터안에서 부분 내용이 달라질 수 있는 문제가 없어진다.
→ 따라서 normalization
(정규화)이 필요하다.
트랜잭션(Transaction)
: ACID를 보장하면서
일련의 작업들이 마치 하나의 작업처럼 취급되어 모두 성공하거나 아니면 모두 다 실패하는 것.
ex) 은행 계좌 이체 시스템, 쇼핑몰 결제나 장바구니 등
Atomicity (원자성) : 중간에 실패하면 다시 되돌아간다.
Consistency (일관성) : 규칙을 위반하는 트랜잭션은 중단된다.
Isolation (고립성) : 트랜잭션 수행 중 다른 트랜잭션은 끼어들지 못한다.
Durability (지속성) : 성공된 트랜잭션은 영원히 반영되어야한다.
AQuery Tool로 ERD를 만들어보자.
스타벅스 사이트
메뉴(음료, 푸드,상품, 카드..) → 카테고리(콜드브루, 에스프레소...) → 음료 (카푸치노, 카페 라떼...)
FK를 가지고 있는 테이블이 자식 테이블이다.
one to many
메뉴-카테고리 / 카테고리-음료 / 음료-이미지
(이미지 테이블 반드시 따로 빼서 관리한다 → 확장성)
one to one
음료-영양정보 (사이즈를 고려X)
(한 테이블에 넣을 수 있지만, 자주 조회되는 데이터 정보가 나오면 별도로 테이블 분리한다 → 성능 향상)
many to many
음료-알러지성분
중간 테이블명 : 복수 이름으로 _
이용해 두 테이블명 더하기
CHAR
: 고정 길이 데이터
VARCHAR
: 가변 길이 데이터
TEXT
: tiny, medium, long 등 용량별 문자열 데이터
INT
: small, medium, big 등 용량별 정수형 데이터
TINYINT
: 보통 불리언 타입 데이터 표현에 사용
FLOAT(길이, 소수)
: 부동 소수형 데이터 타입 - 고정 소수점 사용
DECIMAL(길이,소수)
: 고정 소수형 데이터 타입 - 소수점 사용
→ decimal은 float보다 연산속도는 느릴 수 있지만 정밀도가 더 높다.
DATE
: 날짜 형태
TIME
: 시분초 형태
DATETIME
: 날짜와 시간 형태
TIMESTAMP
: 시스템 변경시 날짜와 시간 자동 저장