ENN
[MySQL] 데이터베이스 컬럼 데이터 타입 선택하기 본문
Doodle의 DB를 설계하면서 컬럼마다 어떤 데이터 타입으로 작성해야 할지 고민해 보았다.
MySQL의 데이터 타입은 크게 3가지로 나뉜다.
1. Numeric types(숫자형 타입)
2. Date and time types(날짜 및 시간 타입)
3. String types(문자열 타입)
create table users (
username varchar(30) NOT NULL,
nickname varchar(30) unique not null,
email varchar(50) unique not null,
userid varchar(30) unique NOT NULL,
userpw varchar(40) not null,
primary key (userid)
)
create table challenges (
clgid bigint(5) auto_increment not null,
clgname varchar(100) not null,
clgmanagerid varchar(30) not null,
clginfo varchar(300) not null,
clgmemberno int(4) not null,
clgCateId varchar(30) not null,
made_date date not null default (current_date),
end_date date not null,
isValid bool not null default 1,
primary key (clgid),
foreign key (clgmanagerid) references users (userid) on delete cascade
)
create table friends(
relatingUserID varchar(30) not null,
relatedUserID varchar(30) not null,
relationType bool default 0,
acceptDate timestamp default now(),
primary key (relatingUserID, relatedUserID),
foreign key (relatingUserID) references users(userid) on delete cascade,
foreign key (relatedUserID) references users(userid) on delete cascade
)
(Doodle의 db)
1. Numeric types(숫자형 타입)
BOOL | 0은 false, 0이 아닌 값은 true 로 간주하는 논리형 데이터 |
TINYINT | TINYINT : -128 ~ 127 TINYINT Unsigned : 0 ~ 225 (1바이트) |
SMALLINT | SMALLINT : -32768 ~ 32767 SMALLINT Unsigned : 0 ~ 65535 까지 표현 (2바이트) |
MEDIUMINT | MEDIUMINT : -8388608 ~ 8388607 MEDIUMINT Unsigned : 0 ~ 16777215 까지 표현 (3바이트) |
INT | INT : -2147483648 ~ 2147483647 INT Unsigned : 0 ~ 4294967295 까지 표현 (4바이트) |
BIGINT | BIGINT : -92233720036854775808 ~ 92233720036854775807 BIGINT Unsigned : 0~18446744073709551615 (8바이트) |
챌린지가 생성될 때마다 자동으로 부여되는 챌린지의 고유 ID clgid는 BIGINT형, 챌린지 최대 인원을 나타내는 clgmemberno는 INT형을 사용했다. 완료된 챌린지를 나타내는 isValid는 BOOL형을 사용했다.
그 외의 실수형 타입은 아래와 같다.
DECIMAL(M,D) | M자리 정수와 D자리 소수점으로 표현 M은 최대 65자리, D는 30자리까지 표현 가능 |
FLOAT(M,D) | -3.402823466E+38 ~ 3.402823466E+38 |
DOUBLE(M,D) | -1.7976931348623157E+308 ~ 1.7976931348623157E+308 |
2. Date and time types(날짜 및 시간 타입)
DATE | 날짜를 나타내는 타입 (3바이트) 1000-01-01 ~ 9999-12-31 |
DATETIME | 날짜와 시간을 같이 나타내는 타입 (8바이트) 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 |
TIMESTAMP | DATETIME보다 작은 범위로 날짜와 시간을 같이 나타내는 타입 1970-01-01 00:00:00 ~ 2037-01-19 03:14:07 (4바이트) |
TIME | 시간을 나타내는 타입 (3바이트) -838:59:59 ~ 838:59:59 |
YEAR | 연도를 나타내는 타입 (1바이트) 1901 ~ 2155, 70 ~ 69 (1970~2069) |
유저가 다른 유저가 보낸 친구 신청을 수락한 시간인 acceptDate나 채팅이 등록된 시간인 regDate 컬럼에 insert, update 연산에 유리한 TIMESTAMP를 사용했다.
유저가 특정 챌린지에 참여한 날짜를 저장하는 start_date, 챌린지가 생성된 날짜 made_date, 챌린지가 끝나는 날짜인end_date DATE형을 사용해서 각자 필요한 크기에 따라 타입을 지정해 주었다.
3. String types(문자열 타입)
CHAR(M) | 고정 길이의 문자열을 저장한다. (M : 0~255) |
VARCHAR(M) | 가변 길이의 문자열을 저장하며, 후행 공백을 제거하지 않는다. (M : 0~65,535) |
TINYTEXT | 1~255 개의 가변 길이의 문자열을 저장한다. |
TEXT | 1~65,535 개의 가변 길이의 문자열을 저장한다. |
MEDIUMTEXT | 1~16,777,215 개의 가변 길이의 문자열을 저장한다. |
LONGTEXT | 1~429,496,729 개의 가변 길이의 문자열을 저장한다. |
ENUM | 문자 형태인 값을 숫자로 저장하여 최대 65,535개의 문자열 중 한 가지를 반환 |
유저 테이블의 username, nickname, email, userid, userpw는 유저마다 다른 가변 길이의 문자열을 받아야 하기 때문에 VARCHAR형으로 지정해 주었다.
그 외에도 챌린지 테이블과 친구 테이블의 컬럼의 기본 정보들 또한 같은 이유로 VARCHAR형으로 지정해 주었다.
'백엔드' 카테고리의 다른 글
[Mybatis] @RequestParam 사용하기 (0) | 2022.09.20 |
---|---|
[Spring boot] Spring project의 폴더 구조 (0) | 2022.09.19 |
[Spring] "redirct:/"와 "view이름" retrun의 차이점 (0) | 2022.09.19 |
쿠키(Cookie)와 세션(Session) (0) | 2022.09.19 |
My Batis (0) | 2022.09.19 |