데이터베이스 컨벤션
1. 테이블
1-1. 네이밍
- 모든 글자를 소문자로 한다.
- 명사 또는 명사구를 사용한다.
- 단수를 사용한다.
- 언더스코어(
_)로 단어를 구분한다(snake_case). - 상세 테이블에는 추상적인
_detail이나_extend대신 명확한 의미의 단어를 사용한다.
예시
- (o)
user_personal_info - (x)
user_detail - (x)
user_extend
1-2. 접두사(Prefix)
서비스, 솔루션
- 커스터마이징이 필요할 수 있기 때문에 사용한다.
- 서비스 이름이나 회사의 이름을 사용한다(
foo_,bar_, …). - 5글자 이상인 경우 축약어를 사용한다.
아웃소싱
- 요구사항에 따라 결정한다.
1-3. 접미사(Suffix)
| 접미사 | 설명 |
|---|---|
_log | 히스토리성 |
2. 컬럼
2-1. 네이밍
- 사용여부, 삭제여부와 같은 경우
_yn대신에 동사의 과거분사형을 사용한다. - 축약어를 가능한 배제하며 단어가 길어지는 합성어의 경우에 대한 축약 패턴 정의에 따른다.
2-2. 타입
날짜
프로젝트는 시각을 UTC 로 고정 저장합니다. 따라서 타임존을 붙이지 않는 타입을 쓰고, 컬럼에는 UTC 값을 그대로 담습니다. 정밀도는 millisecond 6자리입니다.
시간 포함 (_dt) | 시간 제외 (_date) | |
|---|---|---|
| MySQL / MariaDB | DATETIME(6) | DATE |
| Oracle | TIMESTAMP | DATE |
| PostgreSQL | TIMESTAMP | DATE |
| SQL Server | DATETIME2(6) | DATE |
MySQL 에서 TIMESTAMP 를 쓰지 마세요
MySQL 의 TIMESTAMP 는 저장·조회 시 세션 타임존으로 자동 변환합니다. 서버 세션 타임존이 바뀌면 같은 행이 다른 시각으로 읽힙니다.
DATETIME 은 넣은 값을 그대로 보관하므로, "UTC 값을 그대로 저장한다" 는 프로젝트 규약과 맞습니다.
금액
- 19자리 정수부와 2자리 소수부를 포함하는 고정소수점 타입.
- MySQL:
DECIMAL(19, 2) - Oracle:
NUMBER(19, 2)
- MySQL:
2-3. 접두사(Prefix)
- 서비스, 솔루션: 사용하지 않는다.
- 아웃소싱: 요구사항에 따라 결정한다.
2-4. 접미사(Suffix)
| 접미사 | MySQL 타입 | Oracle 타입 | 설명 | 비고 |
|---|---|---|---|---|
_id | BIGINT(20) | - | PK | - |
{target_table}_key | BIGINT(20) | - | FK | 대상 테이블의 prefix를 제외한 이름 |
_name | VARCHAR(n) | VARCHAR2(n) | 이름 | - |
_title | VARCHAR(n) | VARCHAR2(n) | 제목 | - |
_code | VARCHAR(20) | VARCHAR2(20) | 코드 | - |
_date | DATE | DATE | 날짜(시간 제외) | 자바 LocalDate |
_dt | DATETIME(6) | TIMESTAMP | 날짜(시간 포함) | 타임존 없는 타입 + UTC 값. 자바 Instant |
_from | variable | variable | 시작일(시) | - |
_to | variable | variable | 종료일(시) | - |
_count | variable | variable | count | - |
_amount | DECIMAL(19, 2) | NUMBER(19, 2) | 금액 | - |
_fee | DECIMAL(19, 2) | NUMBER(19, 2) | 비용 | - |
_rate | - | - | 율 | - |
2-5. 공통 컬럼
| 컬럼명 | MySQL 타입 | Oracle 타입 | 설명 |
|---|---|---|---|
enabled | TINYINT(1) | - | 사용여부 |
deleted | TINYINT(1) | - | 삭제여부 |
created_by | BIGINT(20) | - | 등록자 |
created_dt | DATETIME(6) | TIMESTAMP | 등록일시 (UTC) |
modified_by | BIGINT(20) | - | 수정자 |
modified_dt | DATETIME(6) | TIMESTAMP | 수정일시 (UTC) |
감사 컬럼은 자동으로 채워집니다
엔터티가 AbstractAuditingEntity 를 구현하면 등록·수정 시 created_by / created_dt / modified_by / modified_dt 가 자동 세팅됩니다. 서비스에서 직접 넣지 마세요.