2011-07-20 28 views
1

我總是有一個困境:對於記錄,我可以使用列圖像(tinyint),如果存在該記錄的圖像,則爲true;如果沒有,則爲false。最佳使用:mysql列或文件檢查來檢測圖像?

我也可以不把這些信息放在數據庫中,在我的代碼中我用磁盤文件系統「snoop」檢查圖像是否存在。

當然,兩者的結果都一樣。擁有數據庫意味着將圖像狀態與磁盤上的實際圖像分開保存,意味着難以編程並且更容易出錯(磁盤映像不再存在,數據庫中的記錄對列映像具有真實性)。

所以我通常使用磁盤檢查。但它發生在我身上,也許這對磁盤訪問有很大的損失。我知道數據庫檢查必須更快,無論如何我必須從數據庫中取得記錄。但是正在尋找使用文件系統的圖像與它發生的不一樣嗎?

回答

2

優點存儲在數據庫中:

  • 您可以創建回答諸如「給我,有沒有圖像中的所有對象」問題查詢
  • 它就像你沒有觸摸快磁盤

我可以看到沒有優點只存儲在磁盤上。在「單一責任地點」使用模式,這意味着代碼中只有一個地方可以保存,更新和刪除圖像。在這個地方你更新文件和數據庫。做到這一點,它不太容易出錯。

換句話說:如果這使得你的應用程序容易出錯,你應該檢查你的架構。

+0

Thanx。我同意。可能是在服務器上的一些問題,數據庫被刪除,圖像不是例如...但是,這是更好的方式。 – Jerry2

2

在我看來,檢查磁盤是浪費和一些不好的做法。數據庫應該持有這個,因爲:

  • 它快得多。
  • 在磁盤上查找不檢索 想要的記錄應該被看作是一個錯誤(當然也可以考慮優雅的照顧 )。

維護列不應該太大驚小怪,因爲您仍然維護文件的名稱,對吧?所以當文件名更新時,這個列也應該相應地更新。

+0

這不是維護數據庫中的列將是很多工作,但在數據庫記錄中查看標誌不能保證指示是否存在實際的圖像文件,同時查看文件系統是直接測試是否圖像在那裏或沒有。除非你因爲其他原因已經觸及數據庫,否則應該沒有很大的性能差異,因爲兩者都可能被緩存在內存中(至少在UNIX/Linux下) –

+0

@dj_segfault - 我假設他正在擊中DB無論如何獲得圖像名稱/路徑。我認爲在這種情況下,如果數據庫表示應該有圖像而沒有圖像,那麼你不希望系統忽略這一點並繼續 - 你會想知道和調查發生了什麼。 – Galz

+0

由於只有一個圖像,圖像名稱是id字段+「jpg」。我正在使用傳統的ASP /文件系統對象檢查文件,而不是使用HTML。 – Jerry2

1

圖像更可能存在或更可能不存在?如果你看到的文件是否存在,你會總是使用該文件?

如果兩者的答案都是「是」,那麼請務必使用磁盤。如果您有理由相信它將會在絕大多數時間裏出現,那麼請使用@file並處理FALSE返回(特別是因爲file_exists可能有跨平臺的實現問題)。我認爲這不僅僅是足夠的練習。

如果沒有,那麼你需要看看你的程序流程:

向數據庫 - 它文件中存在?

  • yes =獲取文件。
    • 如果文件不是真的需要做一些假設文件存在
    • else fetch file =>文件獲取成功嗎? (即使使用DB查詢,您也在執行此檢查)
      • yes =對文件做些什麼
      • no =更新db並執行無文件操作。
  • no =做一些沒有文件的事情。 (當將文件存在更新?cron的?)

如果你打算使用這個文件,你來檢查文件,如果DB說,它的存在,這意味着唯一的一次,你可以優化使用數據庫時不需要文件本身。