셋은 경쟁자가 아니야
이 셋을 경쟁자처럼 나란히 놓고 얘기하는 경우가 많은데, 사실은 서로 다른 질문에 답하는 도구야.
| 속성 | SQLite | PostgreSQL | MySQL |
|---|---|---|---|
| 아키텍처 | In-process 라이브러리 | Client/server | Client/server |
| 배포 | 파일 한 개 | 데몬 + 설정 | 데몬 + 설정 |
| 동시 writer | 한 번에 한 명 (파일당) | 다수, MVCC | 다수, MVCC |
| 동시 reader | 무제한 (WAL) | 무제한 | 무제한 |
| Typing | Dynamic (또는 STRICT 3.37+) | Strict, rich | Strict |
| Replication | Add-on (Litestream/LiteFS/Turso) | Built-in streaming | Built-in (binlog) |
| JSON | JSON1 + JSONB (3.45+) | JSONB native | JSON native |
| Full-text search | FTS5 빌트인 | tsvector | FULLTEXT (InnoDB) |
| 인증 모델 | 파일시스템 | Roles + RLS | User accounts |
| Best fit | 앱 내 데이터 레이어 | Multi-tenant 시스템 | 웹앱 DB tier |
Principle: 기능 체크리스트로 고르지 말고 배포 모양으로 골라. 데이터에 여러 머신이 닿아야 하면 서버가 필요해. 데이터가 코드 도는 자리에 같이 살아도 된다면 SQLite가 운영 관심사 한 층을 통째로 없애줘.
앱 레벨 워크로드만 놓고 보면 요즘 SQLite는 Postgres와의 기능 격차를 거의 다 메웠어. JSON, FTS, window function, CTE, generated column, partial index, expression index, UPSERT, RETURNING이 다 있으니까. 못 메운 건 여러 머신에서 동시에 쓰는 격차 하나고, 거긴 메우는 척도 안 해.