DB 설계 가이드

테이블·컬럼 네이밍, 타입 기준, 공통 컬럼, 인덱스 전략

마지막 수정: 2026-05

DB 설계 가이드


1. 테이블 네이밍 규칙

항목규칙예시
접두사T_ 필수T_USER, T_ORDER
표기법UPPER_SNAKE_CASET_ORDER_DETAIL
언어영문 약어 사용T_RESVE (예약), T_NTCE (공지)
연결 테이블두 테이블명 조합T_USER_ROLE

2. 컬럼 네이밍 규칙

항목규칙예시
표기법UPPER_SNAKE_CASEUSER_NM, ORDER_DT
PK 컬럼테이블명_SNUSER_SN, ORDER_SN
이름_NM 접미사USER_NM, ITEM_NM
코드_CD 접미사STATUS_CD, TYPE_CD
여부_YN 접미사 (CHAR 1, Y/N)USE_YN, DEL_YN
일시_DT 접미사REGIST_DT, UPDT_DT
내용_CN 접미사BOARD_CN, MEMO_CN
순번_SN 접미사ATTACH_SN, LOG_SN
금액_AMT 접미사PRICE_AMT, TAX_AMT
수량_CNT 접미사ORDER_CNT, STOCK_CNT

3. 공통 컬럼 (모든 테이블 필수)

GeneralVO 필드에 대응하는 공통 컬럼으로, 모든 테이블에 반드시 포함한다.

FRST_REGIST_ID        VARCHAR2(100)                    -- 최초 등록자 ID
FRST_REGIST_IP        VARCHAR2(50)                     -- 최초 등록 IP
FRST_REGIST_DT        TIMESTAMP WITH TIME ZONE         -- 최초 등록 일시
LAST_UPDT_ID          VARCHAR2(100)                    -- 최종 수정자 ID
LAST_UPDT_IP          VARCHAR2(50)                     -- 최종 수정 IP
LAST_UPDT_DT          TIMESTAMP WITH TIME ZONE         -- 최종 수정 일시

시간 컬럼은 반드시 TIMESTAMP WITH TIME ZONE 사용. DATE 타입 및 SYSDATE 금지.


4. 데이터 타입 기준

용도타입비고
일련번호 (PK)NUMBER시퀀스 또는 자동증가
짧은 문자열VARCHAR2(n)길이 명시 필수
긴 텍스트CLOB본문, JSON 저장 등
날짜+시간TIMESTAMP WITH TIME ZONEDATE 사용 금지
여부 플래그CHAR(1)Y / N
정수NUMBER(n)자릿수 명시
금액/소수NUMBER(15, 2)소수점 자릿수 명시

5. PK 설계

  • PK는 단일 컬럼 _SN (NUMBER) 으로 통일
  • 복합 PK 지양 — 필요 시 유니크 인덱스로 대체
  • 시퀀스 네이밍: SEQ_테이블명 (예: SEQ_T_USER)
CREATE SEQUENCE SEQ_T_USER
    START WITH 1
    INCREMENT BY 1
    NOCACHE
    NOCYCLE;

6. 인덱스 전략

상황적용
PK자동 생성 (PRIMARY KEY 선언)
자주 조회하는 단일 컬럼단일 인덱스
복합 조건 조회복합 인덱스 (선택도 높은 컬럼 앞에)
외래키 컬럼인덱스 필수
LIKE '%keyword'인덱스 효과 없음 — 전문 검색 고려

인덱스 네이밍: IDX_테이블명_컬럼명

CREATE INDEX IDX_T_ORDER_USER_SN ON T_ORDER (USER_SN);
CREATE INDEX IDX_T_ORDER_STATUS  ON T_ORDER (STATUS_CD, FRST_REGIST_DT);

7. DDL 예시

CREATE TABLE T_ORDER (
    ORDER_SN              NUMBER                           NOT NULL,  -- 주문 일련번호 (PK)
    USER_SN               NUMBER                           NOT NULL,  -- 사용자 일련번호 (FK)
    PRODUCT_NM            VARCHAR2(200)                    NOT NULL,  -- 상품명
    ORDER_CNT             NUMBER(5)                        NOT NULL,  -- 주문 수량
    PRICE_AMT             NUMBER(15, 2)                    NOT NULL,  -- 주문 금액
    STATUS_CD             VARCHAR2(20)                     NOT NULL,  -- 주문 상태 코드
    MEMO_CN               VARCHAR2(1000),                             -- 메모
    USE_YN                CHAR(1)          DEFAULT 'Y'     NOT NULL,  -- 사용 여부
    FRST_REGIST_ID        VARCHAR2(100)                    NOT NULL,
    FRST_REGIST_IP        VARCHAR2(50)                     NOT NULL,
    FRST_REGIST_DT        TIMESTAMP WITH TIME ZONE         NOT NULL,
    LAST_UPDT_ID          VARCHAR2(100)                    NOT NULL,
    LAST_UPDT_IP          VARCHAR2(50)                     NOT NULL,
    LAST_UPDT_DT          TIMESTAMP WITH TIME ZONE         NOT NULL,
    CONSTRAINT PK_T_ORDER PRIMARY KEY (ORDER_SN)
);

CREATE INDEX IDX_T_ORDER_USER_SN ON T_ORDER (USER_SN);
CREATE INDEX IDX_T_ORDER_STATUS  ON T_ORDER (STATUS_CD, FRST_REGIST_DT);

8. 체크리스트

  • [ ] 테이블명 T_ 접두사 및 UPPER_SNAKE_CASE
  • [ ] PK 컬럼명 _SN, NUMBER 타입
  • [ ] 시간 컬럼 TIMESTAMP WITH TIME ZONE 사용 (DATE 금지)
  • [ ] 공통 컬럼 6개 포함 (등록자/IP/일시, 수정자/IP/일시)
  • [ ] _YN 컬럼 DEFAULT 값 설정
  • [ ] 자주 조회되는 컬럼 인덱스 생성
  • [ ] 시퀀스 생성 및 네이밍 규칙 준수