1. ID 컬럼
- bigint 를 쓰는 것이 좋다.
- postgresql에서는 bigserial을 사용한다(bigint + auto increment)
- tinyint 는 1byte 로 2^8을 나타낸다. Boolean 타입과 동일하다. 하지만 DB에서는 Boolean 타입이 다시 1 또는 0으로 사용되므로 컬럼은 tinyint로 정의하고 1 또는 0을 사용하는 것이 더 좋다. 뿐만 아니라 boolean 타입 컬럼은 가능하면 사용하지 않은 것이 좋다.
- 이외에 smallint(2 byte), int(4 byte), bigint(8byte)이다. int는 4 byte 이니 2^(8*4) 약 21억까지 표현할 수 있다. ID를 표현하는 것이니 unsigned로 42억까지 표현하는 것도 가능하다. 하지만 bigint를 직접 사용하는 것이 더 좋은 선택이다.
https://medium.com/daangn/mysql-boolean-%EC%BB%AC%EB%9F%BC-7abd9b35c664
2. Datetime 컬럼
- MySQL에서 날짜시간 컬럼의 타입으로는 timestamp와 datetime 두 가지 종류가 있는데, timestamp는 4byte 숫자형이며 UTC를 저장하며 timezone을 반영한다. 반면 localtime은 타임존을 반영하지 않는 1000~9999년 까지 표현 가능한 8byte의 문자형 타입이다.
timestmap가 4byte이다보니 1970~2038년까지만 표현 가능한 문제가 있었다. 이를 패치한 5.8버전 이후로 8byte가 되어 Y2K38이슈를 해결했다.
3. 문자형
text 와 varchar 두 가지 타입 사용이 가능하다. varchar는 text에 비해 인덱스로 사용할 수 있는 장점이 있다. 예전에 mysql 톡방에서 varcahr(49000)자와 text중에 뭘 선택하는 것이 더 좋은 지에 대한 질문이 나왔는데, 길지 않은 문자열이고 자주 조회되는 컬럼이라면 varchar를 사용하는 것이 좋다. varchar도 어느 크기 이상 넘어가면 text처럼 따로 보관하고 주소값을 보관하는 형태가 되므로 효율적이지 않다.
varchar(1) 이 한글 몇 글자에 대응되는 지에 대해서도 헷갈렸는데, 이는 잘못된 질문이었다. varchar(1)이라는 것 자체가 한 글자를 나타낸다. collation을 각 언어, 사용되는 글자 특성에 맞춰 설정을 해주면 varchar(1)은 항상 한 글자에 대응된다. 이모지를 사용하려면 utf8mb4(4byte)로 설정해야한다.
https://medium.com/daangn/varchar-vs-text-230a718a22a1
4. JSONB 타입을 사용할 때에는 항상 JSON Parsing을 할 때에 연산 부하가 따르는 것을 기억해야한다.
https://medium.com/daangn/json-vs-text-c2c1448b8b1f
5. ENUM값
- 서버(application)레벨에서 관리하는 것이 더 좋다.
- 정책에 따라 ENUM 타입이 추가 삭제되는 경우들이 있는데 이를 서버에 저장하면 삭제 작업이 번거로워 진다.
- 뿐만 아니라 정책이 서버, DB로 나뉘게 된다.
6. FK
- FK는 index와 unique 의 조합으로 unique constraint가 적용되기 때문에 이후 DB를 이동시키거나 삭제 작업을 할 때 번거로워질 수 있다.
7. nullable
null 한 값을 입력하면 null 자체가 하나의 의미있는 값이 된다. 가능하면 지양한다. 컬럼을 추가할 때 nullable 한 컬럼을 추가하게 되는 경우들이 있는데 mysql은 기존 테이블에 컬럼을 추가할 때 기본 값을 설정할 수 있다.
8.
UUID -> distribution system 이 있거나 외부에 노출하는 정보일 때
PK -> 내부적으로 쓰이거나 centralized system일 때
'백엔드 개발 > 백엔드 일기' 카테고리의 다른 글
#063. 단건 쿼리를 복수형 쿼리로 바꾸기 + map 생성방법 (0) | 2023.09.12 |
---|---|
#025. 리팩터링: 트랜젝션 범위를 최소해 안전한 쿼리 만들기 ⛑ (2) | 2023.01.27 |
#024. TS 선언문(:타입)과 단언문(as 타입) 구분해 사용하기 (0) | 2023.01.26 |
#023. 무중단 배포: Readiness 와 Liveness 설정하기 (1) | 2022.12.30 |
#022. github의 graphql explorer로 private repository 접근하기 (0) | 2022.11.09 |