필드와 레코드
앞에서 설명한 것들을 기반으로 데이터베이스에서 필드와 레코드로 구성된 테이블을 만들 수 있다.
회원이란 엔티티는 member 라는 테이블로 속성인 이름, 아이디 등을 가지고 있으며 name, ID, address 등의 필드를 가진다. 그리고 이 테이블에 쌓이는 행(row) 단위의 데이터를 레코드라고 한다. 또한 레코드를 튜플이라고도 한다
행 = 레코드 = 튜플
예를 들어 ‘책’이나는 엔티티를 정의하고 이를 기반으로 테이블을 만들어본다.
어떠한 속성이 있을까?
- 제목
- 저자의 아이디
- 출판년도
- 장르
- 생성 일시
- 업데이트 일시
등이 있다.
이를 데이터베이스에 넣어 테이블로 만들면 어떻게 해야할까?
우선 타입을 정의해야 한다. MySQL 기준으로 설명
- 책의 아이디: INT
- 책의 제목: VARCHAR(255)
- 책의 저자 아이디: INT
- 책의 출판년도: VARCHAR(255)
- 책의 장르: VARCHAR(255)
- 생성 일시: DATETIME
- 업데이트 일시: DATETIME
이를 MySQL에서 구현하려면 다음과 같은 코드를 입력하면 된다.
CREATE TABLE book (
id INT NOT NULL AUTO_INCREMENT,
title VARCHAR(255),
author_id INT,
publishing_year VARCHAR(255),
genre VARCHAR(255),
created_at DATETIME,
updated_at DATETIME,
PRIMARY KEY (id)
);
필드 타입
필드는 타입을 갖는다. 예를 들어 이름은 문자열, 전화번호는 숫자, 이러한 타입들은 DBMS 마다 다르며 MySQL 기준으로 설명한다. 여러 가지 타입이 있고 대표적인 타입인 숫자, 날짜, 문자 타입에 대해 알아보겠다.
숫자 타입
숫자 타입으로는 TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT 등이 있다.
타입 | 용량(바이트) | 최솟갑(부호 있음) | 최댓값(부호 있음) | 최솟값(부호 없음) | 최댓값(부호 없음) |
TINYINT | 1 | -128 | 127 | 0 | 255 |
SMALLINT | 2 | -32768 | 32767 | 0 | 65535 |
MEDIUMINT | 3 | -8388608 | 8388607 | 0 | 16777215 |
INT | 4 | -2147483648 | 2147483647 | 0 | 4294967295 |
BIGINT | 8 | -263 | 263-1 | 0 | 264-1 |
날짜 타입
날짜 타입으로는 DATE, DATETIME, TIMESTAMP 등이 있다.
DATE
날짜 부분은 있지만 시간 부분은 없는 값에 사용된다.
지원되는 범위는 1000-01-01~9999-12-31 이다. 3바이트의 용량을 가진다.
DATETIME
날짜 및 시간 부분을 모두 포함하는 값에 사용된다. 지원되는 범위는 1000-01-01 00:00:00 에서 9999-12-31 23:59:59 이다. 8바이트의 용량을 가진다.
TIMESTAMP
날짜 및 시간 부분을 모두 포함하는 값에 사용된다. 1970-01-01 00:00:01 에서 2038-01-19 03:14:07 까지 지원한다. 4바이트의 용량을 가진다.
문자 타입
문자 타입으로는 CHAR, VARCHAR, TEXT, BLOB, ENUM, SET 이 있다.
CHAR와 VARCHAR
CHAR 또는 VARCHAR 모두 그 안에 수를 입력해서 몇 자까지 입력할지 정한다. 예를들어 CHAR(30) 이라면 최대 30글자까지 입력할 수 있다.
CHAR
고정 길이 문자열이며 길이는 0에서 255 사이의 값을 가진다.
레코드를 저장할 때 무조건 선언한 길이 값으로 ‘고정’해서 저장된다. 예를 들어 CHAR(100) 으로 선언한 후 10글자를 저장해도 100바이트로 저장되게 된다.
VARCHAR
가변 길이 문자열이다. 길이는 0에서 65,535 사이의 값으로 지정할 수 있으며, 입력된 데이터에 따라 용량을 가변시켜 저장한다. 예를 들어 10글자의 이메일을 저장할 경우 10글자에 해당하는 바이트 + 길이기록용 1바이트로 저장하게 된다. VARCHAR(10000) 으로 선언을 해도, VARCHAR(300) 으로 선언을 해도 저장되는 용량은 같다.
때문에 CHAR 의 경우 유동적이지 않은 길이를 가진 데이터의 경우 효율적
유동적인 길이를 가진 데이터는 VARCHAR로 저장하는 것이 좋다
TEXT와 BLOB
두 개의 타입 모두 큰 데이터를 저장할 때 쓰는 타입이다.
TEXT
큰 문자열 저장에 쓰며 주로 게시판의 본문을 저장할 때 쓴다.
BLOB
이미지, 동영상 등 큰 데이터 저장에 쓴다. 그러나 보통은 아마존의 이미지 호스팅 서비스인 S3를 이용하는 등 서버에 파일을 올리고 파일에 관한 경로를 VARCHAR 로 저장한다.
ENUM 과 SET
ENUM 과 SET 모두 문자열을 열거한 타입이다.
ENUM
ENUM(’x-small’, ‘small’, ‘medium’, ‘large’, ‘x-large’) 형태로 쓰이며, 이 중에서 하나만 선택하는 단일 선택만 가능하고 ENUM 리스트에 없는 잘못된 값을 삽입하면 빈 문자열이 대신 삽입된다. ENUM 을 이용하면 x-small 등이 0, 1 등으로 매핑되어 메모리를 적게 사용하는 이점을 얻는다. ENUM은 최대 65,535 개의 요소들을 넣을 수 있다.
SET
ENUM 과 비슷하지만 여러 개의 데이터를 선택할 수 있고 비트 단위의 연산을 할 수 있으며 최대 64개의 요소를 집어넣을 수 있다는 점이 다르다.
참고로 ENUM 이나 SET 을 쓸 경우 공간적으로 이점을 볼 수 있지만 애플리케이션의 수정에 따라 데이터베이스의 ENUM 이나 SET 에서 정의한 목록을 수정해야 한다는 단점이 있다.