티스토리 뷰
나는 베이킹 레시피를 알려주는 홈페이지를 만들고 있다.
아직은 피그마와 mysql를 통해 필요한 db들과 디자인을 구성하고 있다. 일사천리로 구현을 하기 위한 밑작업에 시간을 들이는 중이다.
사용자가 회원가입을 할 때 맞춤형 정보를 추천해주기 위해 `난이도`라는 필드를 구성했는데,
0~5단계로 나누어볼 생각이어서 글자 하나만 저장하는 char 타입을 택할지, 해당 값만 저장이 가능하도록 enum을 택할건지 고민이 되었다. 그러다 tinyint라는 타입도 있다는 것을 알고 세 개 중에 어떤 것을 고르는 게 좋을지 고민이 깊어졌다.
선택 기준
명확한 옵션을 제공해야 하고 잘못된 값이 저장되면 안 되는 경우에는 enum가 적합하다.
사용자가 자유롭게 입력해야 하는 필드를 구성하고 싶을 경우에는 char가 적합하다.
데이터 분석이나 통계 처리를 할 예정이 있다면 tinyint가 적합하다.
| ✅ tinyint | enum | char | |
| 타입 | 숫자 | 문자 | 문자 |
| 공간 | 1바이트 | 내부적으로는 숫자로 저장 | 고정된 길이의 문자열 |
| 사용 | - 문자열보다 데이터 데이터 저장 공간을 적게 사용할 수 있다. - 데이터 분석이나 통계 처리를 할 때 계산이 간편하다. 예) 난이도의 평균값을 구하거나 최고 난이도를 찾기 쉽다. - 숫자로 저장이 되기 때문에 정렬이 간편하다. 단점 - 데이터를 보고 바로 알아듣기 어렵다. 예) 난이도 3이 어느 정도의 난이도를 의미하는지 쉽게 알기 어렵다. |
- 데이터를 바로 봤을 때 의미를 쉽게 이해할 수 있다. - 미리 정의된 값 이외에는 입력할 수 없도록 강제할 수 있어 데이터 무결성을 쉽게 유지할 수 있다. - 0~5와 같이 숫자로 저장할 경우에는, 내부적으로도 숫자로 저장되기 때문에 실제로는 tinyint와 유사한 크기의 저장 공간을 차지한다. 단점 - 만일 숫자로 저장할 경우 각 값의 의미를 기억해야 한다. - 선택지가 고정되어 있어 유연성이 떨어진다. 새로운 값이 추가될 경우 테이블을 변경해야 한다. - 문자열로 정의된 `숫자` 값이라도 실제로는 숫자와 연관되어 처리되므로, 문자열이 아닌 숫자 기반의 작업에서는 비효율적일 수 있다. |
- 고정된 길이로 저장되므로 길이가 변하지 않는 데이터를 일관되게 저장할 수 있다. - 간단한 텍스트 데이터를 저장할 때 유용하다. 단점 - 길이가 짧은 데이터를 저장할 때에도 고정된 공간을 사용하므로, 길이가 일정하지 않은 데이터에는 비효율적일 수 있다. 예) 공간 비효율성: CHAR(5)로 정의된 필드에 "A"라는 값이 들어가면, 나머지 4바이트도 차지하게 된다. - 문자 기반이기 때문에 숫자 연산이 필요한 경우에는 적합하지 않다. |
| 난이도처럼 범위가 0~5로 고정된 경우라면 `tinyint`가 가장 적합하며, 문자열로 의미를 직접 제공하고 싶다면 `enum`이 적합하다. - 숫자 값을 저장하고 효율적인 연산을 원한다면 TINYINT. - 미리 정해진 선택지에서 사용자가 선택할 수 있게 하려면 ENUM. - 고정 길이의 문자를 일관되게 저장해야 한다면 CHAR. |
|||
| 결론 | 숫자를 저장하고 숫자 범위가 작을 때 적합함. - 숫자 데이터를 저장하고 연산이 필요할 때 - 0~5같이 고정된 숫자 범위를 저장할 때 - 공간 효율성을 중요시할 때 |
데이터를 보고 직관적으로 받아드릴 때 적합함. - 미리 정의된 고정된 값을 강제해야 할 때 예) 난이도가 `쉬움` `보통` `어려움`으로 고정하고 싶을 때 - 값의 의미를 직관적으로 파악할 수 있게 하고 싶을 때 |
- 고정된 길이의 `문자` 데이터를 저장할 때 - 길이의 일관성이 중요할 때 |
처음에는 enum과 char만 고려했었는데, 난이도를 평균내거나 정렬할 때의 이점도 괜찮다고 생각드는 tinyint로 꾸려보려 한다.
'리액트로 웹 개발 A to Z' 카테고리의 다른 글
| 데이터베이스 명명 규칙? (0) | 2024.10.24 |
|---|---|
| 협업할 때 데이터를 어떻게 저장하는 게 좋은 방법일까 (0) | 2024.10.23 |
| crreunt_timestamp와 now() (0) | 2024.10.23 |
| datetime와 timestamp 뭐가 다르냐 (0) | 2024.10.23 |
| 고유 pk id는 bigint냐 int냐 (0) | 2024.10.22 |