Ba hướng, mỗi hướng hợp một bối cảnh:
- Object storage (S3/GCS/R2): lưu byte trên storage, chỉ giữ metadata + key/URL trong DB. Ưu: scale gần như vô hạn, rẻ, phục vụ qua CDN dễ, không gánh app server. Nhược: cần dịch vụ ngoài, nhất quán "eventual" ở vài thao tác. Mặc định nên chọn cho web hiện đại.
- Trong DB (BLOB): lưu byte thẳng vào cột blob. Ưu: giao dịch nguyên tử (file + record cùng commit/rollback), backup/permission chung một chỗ. Nhược: DB tăng dung lượng nhanh, backup nặng, chậm khi phục vụ file lớn, khó cache/CDN. Chỉ hợp file nhỏ, ít, cần tính nhất quán chặt (vd chữ ký số).
- Filesystem (đĩa server): đơn giản, nhanh cục bộ. Nhược: khó scale nhiều instance (đĩa không chia sẻ), phải tự lo backup/replication, mất máy là mất file. Hợp app đơn lẻ hoặc file tạm.
Cách chọn: web nhiều file/ảnh, cần scale + CDN → object storage (mặc định). Cần nhất quán giao dịch tuyệt đối, file nhỏ → cân nhắc DB. App nhỏ/tạm → filesystem. Bẫy: lưu file lớn vào DB làm backup và query chậm dần.