2009-11-16 26 views
1

我有一個處理文件管理的網站。用戶可以上傳文件,添加說明,編輯和刪除。這種情況的最佳做法是什麼?從數據庫中刪除文件和相應的條目

  1. 我將文件存儲在文件系統中。

  2. 我該如何處理文件的刪除?在這種情況下,我必須刪除實體:數據庫中的文件和條目。第一種情況是我刪除文件,如果沒有錯誤,我從數據庫中刪除條目。但是,如果數據庫中的條目無法刪除,我無法恢復我的文件。所以第二種情況是oposite:首先從數據庫入手,然後是文件。但是,再次,當文件不能被刪除,我不能恢復數據庫中的條目。哪種方法更好?或者還有其他嗎?

我認爲這個問題對於所有的Web編程語言和所有的數據庫引擎都是通用的。但是假設我有MySQL和PHP,所以從數據庫存儲過程級別刪除文件是不可能的。

回答

4

我通常會發現最好與soft deletes一起去,特別是對於數據庫中的數據。

這樣做,你可以簡單地把文件放在一個新的位置來表示它被刪除,並將數據庫中的條目標記爲被刪除。這樣,如果數據庫由於某種原因刪除失敗,您仍然可以使用該文件。

將文件置於新位置後,您可以將該位置備份到另一個位置,或設置一些內容以定期從該位置刪除項目。

1

我會親自確認數據庫的優先級,因爲它對系統來說更爲重要。所以我會確保db行被刪除,然後刪除文件。如果文件刪除失敗,我會讓它失敗。然後,我會有一個cronjob檢查所有文件,如果他們有他們的db對手,如果沒有,標記爲刪除,所以系統保持乾淨和連貫。

0

通常有一個垃圾收集階段,實際上你的數據庫有一些類似的東西,叫做「事務日誌」,它可以用來倒回或播放一個事務。

在文件刪除的情況下,您將有一個定期運行的清理過程(可能是在發生崩潰時手動運行,或者經常自動運行),以比較磁盤上的內容與數據庫並進行適當的更正。

爲了使任何操作成爲「原子」,必須有一種在發生崩潰時進行清理的方法。關鍵是找到一種清理方法,以便在「原子」操作中的任何一點發生故障都不會使系統無法恢復。

2

這是一種可能性。

您可以先將文件移動到「已刪除」文件夾,然後刪除數據庫中的條目。如果失敗,請從「已刪除」文件夾恢復文件。

要刪除「已刪除」文件夾中的文件,請在刪除數據庫中的條目後立即執行。如果失敗了,那麼你最終會將孤兒文件放在「已刪除」文件夾中......根據您的要求,這可能不是問題。

另一種方法是進行一個可以清理數據庫的調用(可能在SessionEnd或服務上)。

0

Vista引入了事務性NTFS,它允許您將文件系統操作和數據庫操作一起包裝到一個事務中,如果其中一個事務失敗,可以回滾事務。這不在.Net 3.5中,我不知道它是否會成爲.Net 4.0的一部分,但是有證據表明,它現在可以通過使用Win32調用(請參閱this article)進行一些工作。

我對PHP中的事務管理一無所知。