C.W.K.
Stream
Lesson 02 of 10 · published

중요한 데이터 타입

~14 min · schema, types

Level 0스키마 새싹
0 XP0/86 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

맞는 그릇 고르기

잘못된 타입 고르는 건 콜랜더에 수프 담는 거랑 같아. PostgreSQL 은 어느 DB 보다 풍부한 타입 시스템 보유 — 테이블 만들 때 타입 제대로 잡으면 미래의 버그 100 개가 일어나기도 전에 사라져.

90% 타입

  • TEXT 모든 문자열 컬럼에. VARCHAR(n) 은 진짜 hard length limit 필요할 때만.
  • INTEGER / BIGINT 정수에. ~21 억 넘을 가능성 있는 컬럼 (큰 테이블의 FK, ID, byte 카운트) 은 BIGINT.
  • NUMERIC(p, s) 돈, 반올림 중요한 모든 값에. 돈에 절대 FLOAT/REAL 금지 — float 산술이 조용히 망가뜨려.
  • BOOLEAN true/false 에. 0/1 INTEGER 로 쓰지 마, 강력한 이유 없으면.
  • TIMESTAMPTZ '언제 일어났나' 컬럼에. 항상 timezone 포함 — bare TIMESTAMP 절대 금지.
  • DATE 날짜만 있는 데이터 (생일, 마감일, 회계 기간).
  • UUID 공개 식별자에; PG 18+ 의 uuidv7() 가 시간 정렬 + 인덱스 친화.
  • JSONB 가변 모양 데이터; TEXT[] 태그 리스트; BYTEA 바이너리.

가장 흔한 실수

돈을 FLOAT 로. 타임스탬프를 TEXT 또는 timezone 없는 plain TIMESTAMP 로. 어떤 튜토리얼이 시켜서 반사적으로 VARCHAR(255). boolean 을 VARCHAR 로. 각각이 코드베이스 수명에 걸쳐 누적되는 디버깅 시간.

Code

일반 product 테이블의 sane default·sql
CREATE TABLE products (
    id          INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    public_id   UUID NOT NULL DEFAULT gen_random_uuid(),
    sku         TEXT UNIQUE NOT NULL,
    name        TEXT NOT NULL,
    description TEXT,
    price       NUMERIC(10,2) NOT NULL CHECK (price >= 0),
    weight_kg   NUMERIC(8,3),
    in_stock    BOOLEAN NOT NULL DEFAULT TRUE,
    tags        TEXT[] NOT NULL DEFAULT '{}',
    metadata    JSONB NOT NULL DEFAULT '{}'::jsonb,
    launched_at TIMESTAMPTZ,
    created_at  TIMESTAMPTZ NOT NULL DEFAULT now(),
    updated_at  TIMESTAMPTZ NOT NULL DEFAULT now()
);
돈: FLOAT 가 어떻게 거짓말하나·sql
SELECT 0.1::float8 + 0.2::float8;
--      ?column?
-- ----------------------
--   0.30000000000000004

SELECT 0.1::numeric + 0.2::numeric;
--  ?column?
-- ----------
--      0.3

External links

Exercise

접근 가능한 기존 스키마 감사. FLOAT/REAL (특히 돈), VARCHAR(n) (특히 임의 n), timezone 없는 TIMESTAMP, 타입 있어야 할 곳에 TEXT (boolean, JSON, date) 인 컬럼 다 적어. 각각 더 나은 타입 적기.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.