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

SQLite vs PostgreSQL: 언제 옮기나

~12 min · foundations, comparison

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

주머니 노트 vs 서류 사무실

SQLite 는 앱에 link 하는 단일 라이브러리. DB 전체가 디스크 위 파일 한 개. 열기 = 파일 열기. PostgreSQL 은 socket 으로 말 거는 별도 서버 프로세스. 둘 다 자기 자리에선 우수해. 질문은 절대 '뭐가 더 나으냐' 가 아니라 '이 워크로드에 뭐가 맞냐'.

SQLite 가 정답인 때

  • 한 번에 한 프로세스가 write (모바일 앱, CLI, single-user 데스크톱 앱).
  • 데이터가 앱이랑 같은 머신에 있음.
  • 운영 footprint 0 원함 — 서버 시작/보안/백업/업그레이드 없음.
  • 서버 안 띄우고 진짜 DB 필요한 테스트 스위트.

PostgreSQL 로 졸업하는 때

  • 여러 앱 서버가 동시에 write 필요.
  • 복제, point-in-time recovery, hot standby 필요.
  • JSONB, full-text search, pgvector, PostGIS, row-level security 가 그림에 들어옴.
  • 데이터셋이 몇 GB 넘어가거나 write rate 가 한 대 한계 초과.

마이그레이션은 대부분 무통

SQL 은 거의 portable. 알아둘 차이: SQLite 타입은 dynamic, Postgres 는 strict. SQLite 의 AUTOINCREMENTGENERATED ALWAYS AS IDENTITY. 날짜 함수 다름. 거의 다 일대일 변환.

Code

SQLite zero-config·bash
sqlite3 myapp.db "CREATE TABLE notes (id INTEGER PRIMARY KEY, body TEXT);"
sqlite3 myapp.db "INSERT INTO notes (body) VALUES ('Hello world');"
# DB 전체가 myapp.db 파일. 복사하고 메일 보내도 동작.
SQLite 엔 없는 PostgreSQL 기능들·sql
-- MVCC 로 동시 multi-user write (전역 writer lock 없음)
-- 엔진에 박힌 실시간 pub/sub
LISTEN order_events;
NOTIFY order_events, '{"order_id":42,"status":"paid"}';

-- Row-level security
ALTER TABLE patient_records ENABLE ROW LEVEL SECURITY;
CREATE POLICY doctor_sees_own ON patient_records
  USING (doctor_id = current_setting('app.current_doctor')::int);

-- 선택된 테이블의 logical replication
CREATE PUBLICATION orders_pub FOR TABLE orders, line_items;

External links

Exercise

다음 시나리오마다 SQLite/PostgreSQL 결정 + 한 줄 이유: (1) iPhone 메모 앱, (2) 200 명 직원 사무실 Slack 봇, (3) 일 5 명 보는 개인 블로그, (4) 일 1만 주문 e-commerce, (5) 일회성 데이터 분석 Jupyter notebook.

Progress

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

댓글 0

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

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