2009-04-09 158 views
8

使用Rails,是否有一個原因,我應該在文件系統而不是數據庫中存儲附件(可能是任何時間的文件)?數據庫對我來說似乎更簡單,不需要擔心文件系統路徑,結構等問題,只需查看blob字段即可。但大多數人似乎使用文件系統,它讓我猜測,這樣做一定有一些好處,以致於我沒有得到,或者使用數據庫進行這種存儲的一些缺點。 (在這種情況下,我使用的是postgres)。Rails:在數據庫中存儲二進制文件

回答

26

這是一個非常標準的設計問題,並沒有真正的「一個真正的答案」。

我通常遵循的經驗法則是「數據進入數據庫,文件進入文件」。

的一些注意事項要牢記:

  1. 如果一個文件被存儲在數據庫中,你打算怎麼通過http服務於它呢?請記住,您需要設置內容類型,文件名等。如果它是文件系統上的文件,則Web服務器會爲您處理所有這些內容。非常快速和高效(甚至可能在內核空間中),不需要解釋代碼。

  2. 文件通常很大。大型數據庫當然是可行的,但是它們很慢並且不便於備份等。爲什麼在不需要時使數據庫變得龐大?

  3. 與2.非常相似,將文件複製到多臺機器上非常簡單。假設你正在運行一個集羣,你可以定期從你的主機到你的從機rsync文件系統,並使用標準的靜態http服務。顯然,數據庫也可以聚集在一起,但它不一定是直觀的。

  4. 另一方面,如果您已經對數據庫進行了集羣化,那麼除了處理集羣文件之外,還需要管理複雜性。這將是考慮將文件存儲在數據庫中的原因,我會說。

  5. 數據庫中的Blob數據通常是不透明的。你不能過濾它,按它排序或按它分組。這降低了將其存儲在數據庫中的價值。

  6. 另一方面,數據庫理解併發性。您可以使用標準的事務隔離模型來確保兩個客戶端不會同時嘗試編輯同一個文件。這可能很好。不是說你不能使用鎖定文件,但現在你有兩件事要理解,而不是一件。

  7. 輔助功能。文件系統中的文件可以使用常規工具打開。 Vi,Photoshop,Word,無論你需要什麼。這可能很方便。你怎麼打開blob字段中的word文檔?

  8. 權限。文件系統有權限,它們可能是後面的痛苦。相反,它們可能對您的應用程序有用。如果你利用7權限,權限將會真的讓你感到困擾,因爲它幾乎可以確保你的web服務器以不同於你的應用程序的權限運行。

  9. 緩存(來自下面的sarah mei)。這會在客戶端扮演上面的http問題(你會記得正確設置生命期嗎?)。在服務器端文件系統上的文件是一個非常好理解和優化的訪問模式。大數據塊字段可能會或可能不會被您的數據庫優化,並且您幾乎可以保證從數據庫到Web服務器也有額外的網絡訪問。

總之,人們往往使用的文件系統的文件,因爲它們支持類文件成語的最好。沒有理由你必須這樣做,而且文件系統變得越來越像數據庫,所以最終看到完全收斂並不會讓我感到意外。

+0

謝謝,Erik。這是一個非常有用和全面的答覆。 – 2009-04-10 17:00:48

+0

7.你的意思是直接在服務器上工作嗎?作爲一個文件,我也下載它之前打開它在Photoshop中。或者我的版本控制系統會爲我做到這一點。 – Luc 2013-01-24 01:30:05

+0

將事物存儲在未複製的本地文件系統中經常會破壞12個因子風格的應用程序,這使得縮放中等或更好的應用程序成爲問題。將附件存儲在S3/CloudFront或類似的克隆後端是大多數(但不是全部)用例的選擇。 CarrierWave,Paperclip等可以幫助抽象出這些差異。 – Barry 2014-12-18 07:10:45

2

Erik的回答非常好。我還補充說,如果你想做任何緩存,緩存靜態文件要比緩存數據庫內容容易和簡單。

0

如果您使用插件如Paperclip,則不必擔心任何事情。有一個叫做文件系統的東西,這是文件應該放在哪裏。僅僅因爲它有點困難並不意味着你應該把你的文件放在錯誤的地方。用回形針(或其他類似的插件)並不難。所以,gogo文件系統!

+1

如何確保只有合適的用戶才能看到/訪問這些文件 - 回形針是否處理此問題? – Greg 2009-09-24 06:51:53

6

關於使用文件系統的文件有一些很好的建議,但這裏還有其他值得思考的東西。如果您要存儲敏感或安全的文件/附件,使用數據庫確實是唯一的出路。我已經構建了無法將數據放在文件上的應用程序。出於安全原因,它必須放入數據庫。您無法將其保留在服務器/機器上的用戶的文件系統中,以便在沒有適當的安全措施的情況下查看或攜帶它們。使用像Oracle這樣的高級數據庫,您可以非常緊密地鎖定該數據,並確保只有合適的用戶才能訪問該數據。

但是提出的其他觀點非常有效。如果您只是在做像頭像或非敏感信息的事情,那麼對於大多數插件系統來說,文件系統通常更快,更方便。

數據庫很容易設置發回文件;這是多一點工作,但只要幾分鐘,如果你知道你在做什麼。所以是的,文件系統是最好的方法,海事組織,但數據庫是唯一可行的選擇,當安全或敏感數據是一個主要關切。

1

我沒有看到blobstores的問題是什麼。您可以隨時從中重建文件系統存儲,例如通過在系統正在使用時將東西緩存到本地Web服務器。 但權威商店應該始終是數據庫。這意味着您可以通過在數據庫中扔掉並從源代碼控制中導出代碼來部署應用程序。完成。 添加Web服務器完全沒有問題。

相關問題