首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 儲存圖像資料策略與方法:BLOB 最佳實踐指南

     編輯:關於SqlServer

傳統「資料表 + 實體檔案」模式雖常見,但維護困難、備份不同步、安全性難控。本文探討將圖像直接儲存於 SQL Server 關聯表的策略、資料型別選擇、設計原則,並提供 VB6 實作範例架構。

一、 儲存策略核心考量

1.1 BLOB 資料型別對照

型別適用內容最大長度備註
image二進位圖片、文件(.jpg, .pdf, .bmp)2 GBSQL 2000 主流選擇
varbinary(max)同 image,但支援大值型別語意2 GBSQL 2005+ 建議用此
text/ntext大量文字(已淘汰)2 GB新版改用 varchar(max)/nvarchar(max)

1.2 BLOB 物理儲存機制

  • 一般資料型別直接存在資料列(Data Row)
  • BLOB 另闢 LOB 頁面 (LOB Pages) 儲存,資料列僅存 16 Bytes 指標指向 LOB 頁面鏈結
  • 優點:資料列保持窄小,掃描/Join 效能不受大物件影響

二、 設計決策矩陣:資料庫 vs 檔案系統

✅ 建議存入資料庫的情境

  • 交易一致性:圖片與業務資料同一 Transaction 寫入/回滾
  • 備份/還原原子性:單一 .bak 即含所有影像,無「檔案遺失」風險
  • 權限集中管控:透過資料庫角色控管,免維護 NTFS ACL
  • 分散式複寫/Log Shipping:原生支援跨節點同步
  • 小檔案大量存取:檔案系統對大量小檔案效能差,資料庫可優化

⚠️ 建議存檔案系統的情境

  • 即時串流影音(需 FILESTREAM / FileTable 協助)
  • 超大檔(> 2 GB)或極高併發下載(需 CDN/物件存儲)
  • 舊系統相容、雲端成本考量(Blob 儲存較便宜)

三、 BLOB 表設計黃金法則

  1. 垂直分割:將 BLOB 欄位移至獨立表(DocumentBlob),主表僅存 PK + 中繼資料(檔名、MIME、大小、建立時間),避免掃描主表時讀入 LOB 頁面。
  2. 啟用 Filestream (SQL 2008+):大於 1 MB 物件自動分流至 NTFS,兼具資料庫一致性與檔案系統串流效能。
  3. 索引策略:主表建立覆蓋索引含查詢欄位;BLOB 表僅需 PK。
  4. 資料壓縮:ROW/PAGE 壓縮對 LOB 無效,但可壓縮主表中繼資料。

四、 VB6 / ADO 寫入/讀取範例架構

' 寫入
Dim cmd As New ADODB.Command
cmd.ActiveConnection = cn
cmd.CommandText = "INSERT INTO Docs(MetaId, FileName, Content) VALUES (?, ?, ?)"
cmd.Parameters.Append cmd.CreateParameter("@MetaId", adInteger, adParamInput, , metaId)
cmd.Parameters.Append cmd.CreateParameter("@FileName", adVarWChar, adParamInput, 255, fileName)
cmd.Parameters.Append cmd.CreateParameter("@Content", adLongVarBinary, adParamInput, , fileBytes)
cmd.Execute

' 讀取 (串流避免記憶體暴增)
Dim rs As New ADODB.Recordset
rs.Open "SELECT Content FROM Docs WHERE MetaId = " & metaId, cn, adOpenForwardOnly, adLockReadOnly
If Not rs.EOF Then
    Dim fs As New ADODB.Stream
    fs.Type = adTypeBinary
    fs.Open
    fs.Write rs("Content").GetChunk(rs("Content").ActualSize)
    fs.SaveToFile "C:\Temp\out.pdf", adSaveCreateOverWrite
End If

五、 總結建議

中小型系統、文件管理、醫療影像、合約存證等「資料完整性優先」場景,**直接存資料庫** 是最省維運、風險最低的選擇。配合垂直分割、Filestream、備份策略,可支撐 TB 級影像資料。唯有超大檔、高併發串流、雲原生架構才建議外部化儲存並僅存 URL/Token。

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