물리적 모델링은 실제로 만들 데이터베이스에 가장 가깝게 데이터 모델을 만드는 과정.
데이터베이스를 구축할 때는 생각보다 훨씬 많은 결정들을 해야한다.
•
각 요소들의 이름은 어떻게 짓고, 컬럼들의 데이터 타입은 어떻게 정하고 이런 내용 뿐만 아니라,
•
어떤 DBMS를 사용할 건지, 보안은 어떻게 해결할 건지, 마스터 권한은 누구에게 있고, 데이터베이스를 몇 개로 나눠서 사용할 건지, 캐시(cache)는 어떻게 사용할 건지...테이블의 구조와 관계와는 동떨어져있다고 느낄만한 내용을 모두 계획.
이런 내용들은 데이터베이스뿐만 아니라, 데이터베이스와 소통하는 다른 여러 소프트웨어 요소들이 이루는 하나의 시스템을 어떻게 디자인할 건지와도 굉장히 밀접하게 연관이 있습니다.
물리적 모델링 중에서도 온전히 SQL 또는 ORM 같이 코드로 정할 수 있는 내용들, 시스템 디자인적인 요소들을 배제한 내용들 위주로 알아보겠습니다.
네이밍 (이름 짓기)
데이터 베이스의 네이밍은 일관된 규칙은 없지만 아래의 패턴을 따르곤 한다.
어떤 규칙을 정하는지보다 정해진 규칙을 잘 따르는 게 중요하다.
아래의 규칙들이 혼재되는 것을 지양해야 한다.
처음에 규칙을 최대한 명확하게 정하고, 이 규칙을 잘 따라야 한다.
•
단수/복수 정하기
◦
단수 : 일관성 존재
◦
복수형
◦
대문자/띄어쓰기 정하기
◦
줄임말 정하기
데이터 타입
•
각 칼럼이 “어떤” 데이터를 저장하는지에 대한 내용
•
데이터 베이스의 가장 기본적인 제약 사항(데이터 정확성을 지켜주는 역활을 한다.)
◦
제약한 타입 외의 타입이 저장되는 것을 방지 가능
◦
모든 타입을 일관되게 사용해버리면 다양한 연산, 함수들을 사용할 수 없다.
▪
데이터 베이스의 활용도가 떨어진다
◦
데이터 베이스의 용량이 클수록 느려진다
▪
데이터 타입을 잘 설정해야 저장 용량을 효율적으로 활용할 수 있고, 나중에 row 수가 많아졌을 때는 성능에 영향을 미치기도 하기 때문
▪
똑같은 데이터를 저장하되, 용량은 가장 작게 사용하는 것이 좋음
▪
Integer 타입은 아래와 같이 저장해 사용(저장 가능 범주, 용량)
▪
그렇다면 AGE 같은 경우는 0~255 사이의 자연수를 사용하길 권장
•
TINYINT를 사용하면 INTEGER을 사용할 때보다 1/4 용량을 사용
•
정리
◦
데이터 타입을 잘 정해야 하는 이유
▪
데이터 정확성을 잘 지키기 위해서
▪
데이터 베이스 연산/함수들을 제대로 활용
▪
데이터 베이스 용량을 최적화하기 위해서
MYSQL 데이터 타입 종류
•
Numeric types(숫자형 타입)
◦
숫자형 타입은 다시 정수형 타입과 실수형 타입
•
정수형 타입
◦
1) TINYINT
작은 범위의 정수들을 저장할 때 쓰는 데이터 타입.
TINYINT에서 INT는 Integer(정수)의 줄임말인데요.
최소 -128 ~ 최대 127 까지의 정수를 저장할 수 있는 타입입니다.
이 때 SINGED와 UNSIGNED라는 개념을 알아야하는데요. SIGNED는 ‘양수, 0, 음수’를 나타내고, UNSIGNED는 ‘0과 양수’를 나타냅니다.
TINYINT 뒤에 둘 중 무엇을 붙이느냐에 따라 아래와 같이 나타낼 수 있는 숫자의 범위가 달라집니다.
TINYINT SIGNED : -128 ~ 127
TINYINT UNSIGNED : 0 ~ 255
이런 원리는 다른 정수형 타입에도 똑같이 적용됩니다.
참고로, TINYINT라고만 썼을 때는 SIGNED가 붙은 것으로 자동 해석됩니다.
◦
2) SMALLINT
TINYINT 보다 좀더 큰 범위의 정수를 나타낼 때 쓰는 데이터 타입.
SINGED와 UNSIGNED에 따라 저장할 수 있는 수의 범위
SMALLINT SIGNED : -32768 ~ 32767
SMALLINT UNSIGNED : 0 ~ 65535
◦
3) MEDIUMINT
더 넓은 범위를 나타내는 데이터 타입.
MEDIUMINT SIGNED : -8388608 ~ 8388607
MEDIUMINT UNSIGNED : 0 ~ 16777215
◦
4) INT
더 넓은 범위를 나타내는 데이터 타입.
INT SIGNED : -2147483648 ~ 2147483647
INT UNSIGNED : 0 ~ 4294967295
◦
5) BIGINT
아주 큰 범위의 정수를 저장하는 데이터 타입.
BIGINT SIGNED : -9223372036854775808 ~ 9223372036854775807
BIGINT UNSIGNED : 0 ~ 18446744073709551615
BIGINT 데이터 타입을 사용한다면 아무리 큰 정수라도 잘 저장 가능!
•
실수형 타입
우리는 정수뿐만 아니라 소수점이 붙어있는 수를 사용하기도 합니다.
이런 수를 저장하기 위한 타입을 실수형 타입이라고 하는데요. 키(180.489cm)나 몸무게(73.45kg), 온도(36.76도)처럼 정밀한 값이 요구되는 컬럼에는 실수형 타입을 지정해야 합니다.
실수형 타입은 그 타입마다 얼마나 넓은 범위의 수를 나타낼 수 있는지 뿐만 아니라 소수점 뒤에 얼마나 많은 개수의 자리수가 존재할 수 있는지, 그러니까 하나의 값을 얼마나 정밀하게 표현할 수 있는지가 다른데요. 하나씩 살펴볼게요.
◦
1) DECIMAL
일반적으로 자주 쓰이는 실수형 타입 중 하나
보통 DECIMAL(M, D)의 형식 사용
여기서 M은 최대로 쓸 수 있는 전체 숫자의 자리수이고, D는 최대로 쓸 수 있는 소수점 뒤에 있는 자리의 수를 의미합니다.
DECIMAL (5, 2)라면 -999.99 부터 999.99 까지의 실수를 나타낼 수 있다
M은 최대 65, D는 30까지의 값을 가질 수 있습니다.
그리고 DECIMAL이라는 단어 대신 DEC, NUMERIC, FIXED 사용 가능
◦
2) FLOAT
3.402823466E+38 ~ -1.175494351E-38, 0, 1.175494351E-38 ~ 3.402823466E+38
범위의 실수들을 나타낼 수 있는 데이터 타입.
▪
3.402823466E+38 은 (-3.402823466) X (10의 38제곱) 을 의미
▪
1.175494351E-38 은 (-1.175494351) X (10의 38제곱 분의 1) 을 의미.
◦
3) DOUBLE
1.7976931348623157E+308 ~ -2.2250738585072014E-308, 0, 2.2250738585072014E-308 ~ 1.7976931348623157E+308
범위의 실수들을 나타낼 수 있는 데이터 타입.
FLOAT에 비해 더 넓은 범위의 수를 나타낼 수 있을 뿐만 아니라, 그 정밀도 또한 더 높은 타입.(소수점 뒤에 최대로 허용가능한 자리수가 더 많음)
•
Date and Time types(날짜 및 시간 타입)
◦
1) DATE
날짜를 저장하는 데이터 타입.
날짜는 ’2020-03-26’ 이런 형식의 연, 월, 일 순으로 값을 나타냅니다.
◦
(2) DATETIME
날짜와 시간을 저장하는 데이터 타입.
’2020-03-26 09:30:27’ 이런 식으로 연, 월, 일, 시, 분, 초를 나타냅니다.
◦
(3) TIMESTAMP
날짜와 시간을 저장하는 데이터 타입.
’2020-03-26 09:30:27’ 이런 식으로 연, 월, 일, 시, 분, 초를 나타냅니다.
그럼 DATETIME 타입과는 어떤 점이 다를까요?
TIMESTAMP 타입은 타임 존(time_zone) 정보도 함께 저장한다는 점이 다릅니다.
▪
타임 존(time_zone)
•
UTC라는 개념을 알아야 합니다. 전세계에 여러 시간대(타임존, time-zone)
가 존재한다는 사실은 알고 계시죠? 각각의 시간대는 UTC를 기준으로 나타낼 수 있는데요.
UTC(Coordinated Universal Time)는 국제 사회에서 통용되는 표준 시간 체계로 '국제 표준시'라고도 합니다. UTC는 영국 런던을 기준으로 하는데요. 우리나라는 런던을 기준으로 시간이 9시간 더 빠르기 때문에, 우리나라의 시간을 표현할 때는 UTC+9라고 표현합니다.
◦
(4) TIME
:시간을 나타내는 데이터 타입.
’09:27:31’ 형식으로 ‘시:분:초’를 나타냅니다.
String types(문자열 타입)
•
CHAR
문자열을 나타내는 기본 타입으로 Character의 줄임말.
CHAR(30), 이런 형식으로 나타냄
◦
괄호 안의 숫자는 문자를 최대 몇 자까지 저장할 수 있는지를 나타냅니다. 30이라고 써있으면 최대 30자의 문자열을 저장할 수 있다는 뜻입니다.
◦
CHAR 타입의 괄호 안에는 0부터 255까지의 숫자를 적을 수 있습니다.
•
VARCHAR
VARCHAR도 VARCHAR(30) 이런 식으로 문자열의 최대 길이를 지정할 수 있는 문자열 타입
괄호 안에 최소 0부터 최대 65,535 ( − 1)를 쓸 수 있습니다.
VARCHAR는 CHAR보다 허용되는 최대 저장 길이가 더 크다는 점 말고 다른 차이점도 있습니다.
그건 바로 CHAR는 고정 길이 타입이고, VARCHAR는 가변 길이 타입이라는 점입니다.
사실 VARCHAR라는 단어 자체가 Character Varing의 줄임말로 가변 문자열을 나타냅니다.
◦
예시 : CHAR(10), VARCHAR(10)이 있을 때
▪
CHAR(10)은 어떤 길이의 문자열이 저장되더라도 항상 그 값이 10만큼의 저장 용량을 차지합니다.
▪
VARCHAR(10)의 경우 만약 값이 ‘Hello’ 이런 5자라면 저장 용량도 5만큼 차지합니다.
▪
저장 용량이 설정된 최대 길이에 맞게 고정되는 게 아니라 실제 저장된 값에 맞게 최적화됨.
▪
대신 VARCHAR 타입으로 값이 저장될 때는 해당 값의 사이즈를 나타내는 부분(1byte 또는 2byte)이 저장 용량에 추가됩니다.
◦
따라서 값의 길이가 크게 변하지 않을 컬럼에는 CHAR 타입을 사용하고, 길이가 들쑥날쑥할 컬럼에는 VARCHAR 타입을 쓰는 게 좋습니다.
•
TEXT
◦
문자열을 저장하는 데이터 타입으로 최대 65535 자까지 저장 가능.
◦
이외에도 16,777,215 (224 − 1) 자까지 저장할 수 있는MEDIUMTEXT, 4,294,967,295(232 − 1) 자까지 저장할 수 있는 LONGTEXT 타입이 있습니다.
◦
VARCHAR 타입과 TEXT 계열의 타입은 내부 구현에서 일부 차이가 존재.
◦
일단은 정말 길이가 긴 문자열을 저장하려면 TEXT 계열의 타입을 써야하는구나 정도만 기억하자.