Home 데이터베이스 기본
Post
Cancel

데이터베이스 기본

데이터베이스

일정한 규칙, 규약을 통해 구조화되어 저장되는 데이터의 모음.

DBMS (Database Management System)

데이터베이스를 제어, 관리하는 통합 시스템.

DB 안에 있는 데이터들은 특정 DBMS마다 정의된 쿼리 언어를 통해 삽입, 삭제, 수정, 조회 등을 수행할 수 있다.

DB는 실시간 접근과 동시 공유가 가능하다. 그리고 위의 그림과 같은 구조로 이루어져있고 데이터 관련 로직을 구축하게 된다.

ex) MYSQL이라는 DBMS가 있고 그 위에 응용 프로그램에 속하는 Node.js에서 해당 DB안에 있는 데이터를 끄집어내 해당 데이터 관련 로직을 구축한다.

NoSQL (MongoDB, Redis 등)

데이터를 꺼낼 때 SQL 언어를 사용하지 않는다.

엔터티

엔터티는 사람, 장소, 물건, 사건, 개념 등 여러 개의 속성을 지닌 명사를 의미한다.

예를 들어 회원이라는 엔터티가 있으면 회원은 이름, 아이디, 주소, 전화번호 등등의 속성을 갖게 된다.

약한 엔터티와 강한 엔터티

엔터티는 약한 엔터티와 강한 엔터티로 나뉜다.

A가 혼자서는 존재하지 못하고 B의 존재 여부에 따라 종속적이면 A는 약한 엔터티이고 혼자 존재할 수 있는 B는 강한 엔터티가 된다.

예를 들면 방은 건물 안에만 존재하기 때문에 방은 약한 엔터티이고 건물은 강한 엔터티라고 볼 수 있다.

릴레이션

데이터베이스에서 정보를 구분하여 저장하는 기본 단위이다.

엔터티에 관한 데이터를 데이터베이스는 릴레이션 하나에 담아서 관리한다.

릴레이션은 MySQL에서는 ‘테이블’ 이라고 하며, NoSQL 데이터베이스에서는 ‘컬렉션‘이라고 한다.

테이블과 컬렉션의 차이

MySQL의 구조는 레코드-테이블-데이터베이스로 이루어져 있고, MongoDB 데이터베이스의 구조는 도큐먼트-컬렉션-데이터베이스로 이루어져 있다.

레코드가 쌓여서 테이블이 되고 테이블이 쌓여서 데이터베이스가 되는 구조이다.

속성(attribute)

릴레이션에서 관리하는 구체적이며 고유한 이름을 갖는 정보이다.

ex) ‘자동차’라는 엔터티의 속성을 보자. 자동차 번호, 바퀴 수, 자동차 색상, 차종 등이 있을 수 있다. 이 중 서비스 요구 사항을 기반으로 관리해야 할 필요가 있는 속성들만 엔터티의 속성이 된다.

도메인

릴레이션에 포함된 각각의 속성들이 가질 수 있는 값의 집합을 말한다.

ex) 성별이라는 속성이 있다면 이 속성이 가질 수 있는 값은 [남, 여] 라는 집합이 된다.

필드, 레코드(튜플)

위와 같이 회원이라는 엔터티를 정의한 member 테이블을 보자.

  • 필드 : name, ID, address
  • 레코드 : 테이블에 쌓이는 row 단위의 데이터.
    • 튜플이라고도 한다.

타입

책이라는 엔터티를 데이터베이스에 넣어 테이블로 만들어보자. book 테이블은 책의 제목, 출판년도, 장르 등등의 필드를 가지게 된다.

  • 책의 아이디 : INT
  • 책의 제목 ; VARCHAR(255)
  • 책의 저자 ID : INT
  • 책의 출판년도 : VARCHAR(255)
  • 책의 장르 : VARCHAR(255)
  • 생성 일시 : DATETIME
  • 업데이트 일시 : DATETIME

위와 같이 각 속성에 맞는 타입을 정의하게 된다. 아이디는 INT형, 제목은 VARCHAR의 문자열 등등의 필드타입을 정하는 것이다.

MySQL로 테이블 생성하기

1
2
3
4
5
6
7
8
9
CREATE TABLE book(
	id INT NOT NULL AUTO_INCREMENT,
	title VARCHAR(255),
	author_id INT,
	....
	created_at DATETIME,
	updated_at DATETIME,
	PRIMARY KEY (id)
);

숫자 타입

  • TINYINT
  • SMALLINT
  • MEDIUMINT
  • INT : 4byte
    • -21억 ~ 21억
  • BIGINT

날짜 타입

  • DATE
    • 날짜 부분은 있지만 시간 부분은 없는 값에 사용된다.
    • 1000-01-01 ~ 9999-12-31 지원
    • 3byte
  • DATETIME
    • 날짜 및 시간 부분을 모두 포함하는 값에 사용된다.
    • 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 지원
    • 8byte
  • TIMESTAMP
    • 날짜 및 시간 부분을 모두 포함하는 값에 사용된다.
    • 1970-01-01 00:00:01 ~ 2037-01-19 03:14:07 지원
    • 1970-01-01 00:00:01 이 1이라는 카운트 값을 가진다.
    • 1970-01-01 00:00:10 은 10이라는 값을 가지는 것.
    • 4byte

문자 타입

  • CHAR
  • VARCHAR
  • TEXT
    • 큰 문자열 저장에 사용
    • 주로 게시판의 본문을 저장할 때 쓰인다.
  • BLOB
    • 이미지, 동영상 등의 큰 데이터 저장에 사용 (잘 안쓰인다.)
    • 보통 아마존의 이미지 호스팅 서비스인 S3을 이용하는 등 서버에 파일을 올리고 파일에 관한 경로를 VARCHAR로 저장한다.
  • ENUM
    • 문자열을 열거한 타입
    • ENUM(‘XS’, ‘S’, ‘M’, ‘L’, ‘XL’)
    • 열거된 문자열 중 하나만 선택하는 단일 선택만 가능
    • ENUM 리스트에 없는 값을 삽입하면 빈 문자열이 삽입된다.
    • XS 등이 0,1 등으로 매핑되어 메모리를 적게 사용하는 장점.
  • SET
    • ENUM과 비슷하지만 여러 개의 데이터를 선택할 수 있다.

CHAR과 VARCHAR의 차이

  • CHAR는 테이블을 생성할 때 선언한 길이로 고정되며 길이는 0에서 255사이의 값을 가진다.
  • VARCHAR는 가변 길이 문자열이다. 길이는 0에서 65,535 사이의 값을 가지고 입력된 데이터에 따라 용량을 가변시켜 저장한다.

ENUM, SET

ENUM이나 SET을 사용하는 공간적으로 이점을 볼 수 있지만 애플리케이션의 수정에 따라 DB의 ENUM이나 SET에서 정의한 목록을 수정해야 할 수도 있는 단점이 있다. 공간적인 이점이 요즘 하드웨어 상태에서는 크지 않고 위의 단점때문에 잘 안쓰인다.

관계

DB에는 여러 개의 테이블이 있고 이러한 테이블은 서로 관계가 정의되어 있다.

이러한 관계를 관계 화살표로 나타낸다.

1:1 관계

테이블을 두 개의 테이블로 나누어 테이블의 구조를 더 이해하기 쉽게 만들어준다.

1:N 관계

위의 그림의 경우 한 유저당 여러 개의 상품을 장바구니에 넣을 수 있다. 이런 경우 1:N 관계가 된다. 물론 장바구니에 하나도 넣지 않는 경우도 있으니 0도 포함되는 화살표로 표시되었다.

N:M 관계

학생도 강의를 많이 들을 수 있고, 강의도 여러 명의 학생을 포함할 수 있다.

이러한 경우를 N:M 관계라고 정의한다.

N:M 관계는 보통 위와 같이 테이블 두 개를 직접적으로 연결해서 구축하지는 않고, 1:N, 1:M 관계를 갖는 테이블 두 개로 나누어 설정하게 된다.

테이블 간의 관계를 조금 더 명확하게 하고 테이블 자체의 인덱스를 위해 설정된 장치로 기본키, 외래키, 후보키, 슈퍼키, 대체키가 있다.

  • 슈퍼키 : 유일성을 가짐
    • 후보키 : 유일성 + 최소성
      • 기본키
      • 대체키 : 기본키로 선택되지 못한 키

유일성은 중복되는 값이 없다는 의미이고, 최소성은 필드를 조합하지 않고 최소 필드만 써서 키를 형성할 수 있는 것을 말한다.

기본키(Primary Key)

줄여서 PK또는 프라이머리키라고 많이 부르며, 유일성과 최소성을 만족하는 키이다.

이는 테이블의 데이터 중 고유하게 존재하는 속성이며 기본키에 해당하는 데이터는 그림의 ID 처럼 중복되어서는 안된다. PDT-0002 ID가 중복되기 때문에 ID라는 필드는 기본키가 될 수 없다.

위의 그림에서 ID는 중복이 없기 때문에 기본키로 설정할 수 있다.

하지만 [ID, name] 이라는 복합키를 기본키로 설정할 수도 있지만 그렇게 되면 최소성을 만족하지 않는다. (ID만을 써서 기본키로 설정할 수 있는데 ID와 name필드를 합쳐서 키로 사용할 필요가 없는 것.)

기본키는 자연키 또는 인조키 중 골라 설정한다.

자연키

예를 들어 유저테이블을 만든다고 가정하면 주민등록번호, 이름, 성별 등의 속성이 있다. 이 중 이름, 성별 등은 중복된 값이 들어올 수 있으므로 부적절하고 남는 것은 주민등록번호이다.

이런 식으로 중복된 값들을 제외하며 중복되지 않는 것을 자연스레 뽑다가 나오는 키를 자연키라고 한다.

자연키는 언젠가 변하는 속성을 가진다.

인조키

인위적으로 유저 아이디를 부여하는 경우가 있다. (MySQL auto increment)

이렇게 인위적으로 생성한 키를 인조키라고 한다. 자연키와는 대조적으로 변하지 않는 속성을 가진다.

따라서 보통 기본키는 인조키로 설정한다.

외래키 (Foreign Key)

FK라고도 하며, 다른 테이블의 기본키를 그대로 참조하는 값으로 개체와의 관계를 식별하는 데 사용한다. 외래키는 중복되어도 상관없다.

위의 그림을 보면 client라는 테이블의 기본키인 ID가 product 라는 테이블의 user_id라는 외래키로 설정될 수 있음을 보여주는 것이다.

product PDT-0001과 user a_2가 연결되는 것이다.

후보키 (candidate Key)

기본키가 될 수 있는 후보들이며 유일성과 최소성을 동시에 만족하는 키이다. 어떤 기본키가 설정이 되어있다면 다른 후보키는 대체키가 된다.

대체키 (alternate Key)

후보키가 두 개 이상일 경우 어느 하나를 기본키로 지정하고 남은 후보키들을 말한다.

슈퍼키(super key)

각 레코드를 유일하게 식별할 수 있는 유일성을 갖춘 키이다.

ERD(Entity Relation Diagram)

데이터베이스를 구축할 때 가장 기초적인 뼈대 역할을 하며, 릴레이션 간의 관계들을 정의한 것이다.

만약 서비스를 구축한다면 가장 먼저 신경 써야 할 부분이며 이 부분을 신경쓰지 않고 서비스를 구축한다면 단단하지 않은 골조로 건물을 짓는 것이나 다름없다.

ERD는 시스템의 요구 사항을 기반으로 작성되며 이 ERD를 기반으로 데이터베이스를 구축한다.

쇼핑몰 ERD 만들어보기

orderdetails는 복합키로 되어있다.

(orderNumber + productCode)

1주문(orderNumber)안에 상품코드가 많다고 가정하자. orderNumber만 키로 설정한다면 orderNumber는 상품마다 중복될 것이고 유일성을 만족하지 못한다. 따라서 2개의 키를 결합해 유일성 + 최소성을 만족한다.

MySQL CURD

SQL 연습

This post is licensed under CC BY 4.0 by the author.

대규모 트래픽으로 인한 서버과부화 해결 방법

트랜잭션