인프런 커뮤니티 질문&답변
숫자 형태의 컬럼 데이터 타입 질문드립니다
작성
·
241
0
안녕하세요~ 강사님 질문이 있습니다
현재 개발 중인 프로젝트에서 유지보수의 용이성을 위해 코드 테이블을 별도로 만들어서 쓰고 있는데요
예를 들어 아래와 같은 근무 상태 코드 테이블이 있으면
1 정상근무
2 휴가중
3 근무안함
사원이 정상근무 중이면 사원 테이블의 근무 상태 컬럼에는 1이 들어가는 식입니다
또 부서 정보 코드 테이블이 있다면
E8001254 인프라 부서
D1001594 마케팅 부서
A9882011 영업 부서
사원이 마케팅 부서면 사원 테이블의 부서 컬럼에는 D1001594가 들어가고
또 이메일 수신 여부 코드 테이블이 있다면
1 수신
0 거부
선택 사항에 따라 사원 테이블 해당 컬럼에는 1 또는 0이 들어가는 식입니다
이런 코드 테이블 종류가 굉장히 많은데요
코드의 데이터 타입을 일반적으로 뭘로 선언해야 할지 고민입니다
별다른 제약 사항이 없는 테이블은 코드 번호를 숫자로 표기하고 있으니
그냥 int로 선언하는 게 맞을 거 같으면서도
앞으로 추가될지 모르는 코드 번호가 반드시 숫자 형태일 거라는 확신은 없으니 (클라이언트 요청 사항이라든지)
처음부터 varchar로 선언해놓는 게 낫지 않을까? 라는 생각도 들고요
또 이메일 수신 여부 코드 테이블 같은 경우에는 무작정 int로 선언하기에는
프로그램에서 int 변수의 초기값이 0이다 보니 특정 상황에서는 변수값을 직접 바꿔줘야 하는 번거로움이 있긴 합니다
그래서 숫자 형태지만 확장성을 생각하면 varchar로 선언하는 게 맞지 않나 고민입니다
그리고 구글링을 하다가 문자형 타입보다는 숫자형 타입이 속도가 더 빠르다고 본 것 같아서...
데이터가 많아지면 타입이 검색 속도에 영향을 끼칠까? 하는 궁금증도 있습니다
관련하여 강사님의 의견을 듣고 싶습니다
감사합니다
답변 1
0
실전에서 자주 나오는 문제입니다.
우선 PK, FK로 사용되는 int 값들은 사람이 사용하기 위해서 만드는게 아닙니다. 무결성을 보장하기 위해서 DBMS가 사용하도록 만든거죠. 대부분의 프로그램에서 PK, FK값을 보여주는 경우는 거의 없습니다.
따라서 근무상태 코드 테이블을 만들어보면
WorkingStatusId int PK,
WorkingStatusCode nvarchar(50),
WorkingStatusName nvarchar(50)
이렇게 되는거죠. 여기서 WorkingStatusCode는 사람 보라고 만든 코드입니다. 그런데 이 경우는 궂이 WorkingStatusCode가 필요 없겠죠. 만일 자재 테이블이라고 하면 자재Id, 자재Code, 자재명이 있을 수 있는데 자재Code는 비즈니스 현장에서 사람들이 사용하는 코드 값입니다.
아주 오래전에는 메모리도 비싸고 CPU도 느리고 그래서 int32로 충분한 것은 int 64를 안썼죠. 그러나 요즘 누가 그런 것을 신경씁니까. 워낙 빠르고 워낙 많은 양을 저장할 수 있다보니 궂이 성능을 논할 필요가 없습니다.
RDB에서 성능을 신경써야 하는 것은 Select 명령에서 많은 레코드를 찾을 때 찾는 방식이 인덱스를 타는지 안타는지를 따져주는 겁니다. 아무리 빨라도 500 records x 20,000 records 조인을 생각해보면 인덱스를 안타면 몇초에서 몇분을 기다리는 현상이 나오겠죠. 이런 것이 성능문제가 되는거지 타입을 어떤 것을 쓰느냐가 중요하지는 않습니다.
int를 사용하는데는 또 이유가 있습니다. 자동증분이 되죠. 그리고 max(value)를 구할 때 varchar는 어떻죠? 123과 21 어느게 더 클까요?
그리고 int의 초기값을 걱정하셨는데 ...
메일수신여부 코드 테이블에 값은
1 읽음
2 안읽음
이렇게 되어 있겠죠?
그리고
public enum {읽음 = 1, 안읽음 = 2}이렇게 프로그램에 선언되어 있을 것이고,
코드를 사용하는 테이블에서는
ReadMail int default = 2, not null
이렇게 선언해 놓으면 기본적으로 값을 지정하지 않고 insert를 하면 초기값이 안읽은 상태로 되어 있겠죠.
도움이 되시길...






강사님 답변 감사드립니다! 많은 도움이 되었습니다~