데이터 타입 선정 원칙
- 가장 중요한 원칙은 속성에 저장될 데이터의 성격에 맞는 타입을 선택하는 것(날짜 : date, 숫자 : number, 문자 : varchar2)
주의점
저장할 데이터 형태와 속성의 타입이 다를 경우 유효하지 않은 데이터가 저장될 가능성이 있음(예 : 데이터는 날짜인데 varchar2 타입을 사용해서 2020년 2월 31일 같은 날짜가 저장될 수 있음)
데이터 타입 선정 절차
- 문자 타입인지 숫자 타입인지 결정
- 데이터 성격이 숫자이더라도 종류가 한정되어 있다면 문자 타입 선택(예 : 코드값)
- 문자 타입이라면 고정 길이인지 가변 길이인지 결정
- 가변길이 문자라면 문자의 최대 길이 결정(참고 : 최대길이가 매우 길 경우 CLOB등 사용)
- 날짜 데이터 타입은 date 타입사용이 원칙
- 숫자 타입이라면 숫자의 최대 길이와 소수점 길이 결정
데이터 타입 결정 시점
- 도메인에 해당하는 데이터 타입과 길이 등을 파악하지 않으면 속성을 명확하게 파악한 것이 아니므로 데이터 타입은 속성과 같의 정의되어야 함 -> 도메인 결정 단계에서 데이터 타입 결정(논리 모델링 초반)
- 이 시기는 논리모델링 시점
CHAR/VARCHAR2 타입
- 문자타입이라면 VARCHAR2 타입을 사용(CHAR 타입은 VARCHAR2 타입과 비교하여 이점의 거의 없어 사용하지 않음)
주의점
CHAR 타입 지정된 길이보다 짧은 문자가 저장될 경우 남은 공간을 빈칸(SPACE)로 채우므로 검색 조건이 불편하고 사람이 인지하기 어려움
- VARCHAR2 타입의 최대 자릿수는 실제 저장될 데이터에 적합한 최대 값 부여
- VARCHAR2(2000) 정도로 긴 텍스트를 저장하는 속성은 별도의 엔터티에서 관리할 수 도 있음
- 입력되는 데이터의 크기가 블록(BLOCK) 크기보다 크면 체인 현상이 발생할 수 있음(IO가 증가해 성능저하)
참고사항
명칭을 의미하는 도메인을 '고객명-varchar2(10)', '회사명-varchar2(50)', '종목명-varchar2'등과 같이 상세 관리하거나
명-varchar2 로 통합관리 할 수 있음
Number 타입
- 숫자타입이라면 전체 자릿수(Precision)와 소수점 자릿수(Scale)를 지정해 사용하는 것이 원칙
- 지정된 소수점 이하는 반올림 돼 저장되므로 scale 사용에 주의
- 최대 38자리의 양수와 음수 저장가능
- Number 타입은 가변 길이 데이터로 실제로 Precision과는 무관하게 저장된 데이터의 길이만큼 저장공간을 사용함(Precision을 18자리 지정하라고 필자는 권장)
- number타입은 자릿수에 따라 도메인을 세분화할 필요는 없으며, 금액의 경우 15~18자리로 정해서 사용하는 것이 무난(단, 율(%)은 정밀하게 관리해야 무결성이 높아지므로 세분화하여 관리할 것을 권장함)
- '고객번호' 같은 식별자 속성은 속성 이름에 번호가 붙었으나 문자로 관리하는 것이 like 검색 등의 이유로 효율적임(단, varchar2(10) 보다 number(10)이 저장공간을 덜 차지하므로 number(10) 이 성능상 유리)
참고사항
숫자 12,345.67을 아래와 같은 데이터 타입에 저장하면
ㄱ. number(7) = number(7,0) -> 12346
ㄴ. number(7,2) -> 12345.67
ㄷ. number(7,1) -> 12345.7
ㄹ. number() -> 12345.67
DATE 타입
- 데이터가 일시나 일자를 나타내는 경우 date 타입의 사용이 원칙(현장에서는 varchar2가 많이 사용되나 바람직 하지 않음)
- date 타입을 사용해야하는 가장 큰 이유는 정합성 때문(varchar2 타입의 경우 2001년 2월 31일 같은 데이터가 허용될 수 있음)
- date 타입은 물리적으로 7 byte를 차지하나 varchar2 타입을 날짜를 표현하려면 최소 8 byte를 차지하므로 저장 공간 측면에서도 date 타입이 유리함
- date 타입에 저장된 '2025년 12월 31일과 2026년 1월 1일 사이'는 하루 차이가 난다는 것을 옵티마이저가 알고 실행계획을 작성하나 varchar2 타입에 저장된 '2025년 12월 31일과 2026년 1월 1일 사이'는 하루 차이를 인식하지 못해 테이블 풀 스캔(Table full scan)이 발생 할 수도 있음.
- date 타입은 날짜 연산이 바로 가능하나, varchar2 타입은 to_date로 날짜 형변환 후에야 사용이 가능해짐
- 초 이하 단위에 대한 저장이 필요할 때는 Timestamp 타입을 사용
CLOB, BLOB타입
- CLOB(Character Large Object) : 대량의 문자 데이터를 저장할 때 사용, 최대 4Gbytes
- BLOB(Binary Large Object) : 이미지 파일이나, 문서 파일같은 이진 바이너리 파일 저장, 최대 4Gbytes
- Lob 타입은 PK로 사용할 수 없고, order by, group by 절에 사용할 수 없는 등 제약사항이 많음