數據庫可以存儲二進制文件(BLOB),但生產環境強烈不建議這樣做。
| 維度 | 存入數據庫 | 存文件系統+路徑 |
|---|---|---|
| 查詢性能 | 大字段導致全表掃描緩慢 | 只查路徑,極快 |
| 備份恢復 | 備份文件巨大,恢復耗時 | 備份輕量,文件可增量同步 |
| 連接池壓力 | 傳輸大二進制佔用連接久 | 釋放快,併發能力強 |
| CDN 分發 | 無法直接走 CDN | 天然支持 CDN 加速 |
| 遷移擴展 | 困難 | 文件可獨立遷移到對象存儲 |
┌─────────────┐ ┌──────────────┐ ┌────────────────┐
│ 應用服務 │────▶│ 數據庫 │ │ 文件存儲系統 │
│ │ │ (元數據表) │ │ (本地/NAS/S3) │
└─────────────┘ └──────────────┘ └────────────────┘
│
┌──────┴──────┐
│ id | path | type | size | created_at |
│ 1 | /img/avatar/123.jpg | image | 45KB | ... |
└─────────────┘
CREATE TABLE media_files (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
biz_type VARCHAR(32) NOT NULL, -- 業務類型:avatar, video, document
biz_id BIGINT NOT NULL, -- 業務主鍵
storage_path VARCHAR(512) NOT NULL, -- 相對路徑或對象鍵
file_name VARCHAR(255) NOT NULL,
mime_type VARCHAR(64),
file_size BIGINT,
checksum CHAR(32), -- MD5/SHA256 去重校驗
storage_provider VARCHAR(32), -- local, oss, s3, cos
status TINYINT DEFAULT 1, -- 1正常 0刪除
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX idx_biz ON media_files(biz_type, biz_id);
「數據庫存元數據,文件系統存內容」是經過無數大型系統驗證的最佳實踐,符合關注點分離原則。