首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

數據庫存儲圖片視頻:最佳實踐是存路徑而非二進制數據

     編輯:程式設計綜合問答

核心結論

數據庫可以存儲二進制文件(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);

視頻大文件特殊處理

  1. 分片上傳:前端分片,後端合併,支持斷點續傳
  2. 轉碼處理:上傳完成觸發異步轉碼(FFmpeg),生成多清晰度
  3. 流式播放:使用 HLS/DASH 協議,按需加載分片
  4. 對象存儲:直接上傳至 OSS/S3,應用服務只存元數據

何時可以考慮存入數據庫?

  • 極小文件(<100KB),如縮略圖、圖標
  • 嚴格事務一致性要求(文件與業務數據原子性)
  • 極簡部署環境(單機、無獨立存儲)
  • 數據量極小、訪問極低的內部工具

總結

「數據庫存元數據,文件系統存內容」是經過無數大型系統驗證的最佳實踐,符合關注點分離原則。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved