使用Rails,是否有一個原因,我應該在文件系統而不是數據庫中存儲附件(可能是任何時間的文件)?數據庫對我來說似乎更簡單,不需要擔心文件系統路徑,結構等問題,只需查看blob字段即可。但大多數人似乎使用文件系統,它讓我猜測,這樣做一定有一些好處,以致於我沒有得到,或者使用數據庫進行這種存儲的一些缺點。 (在這種情況下,我使用的是postgres)。Rails:在數據庫中存儲二進制文件
回答
這是一個非常標準的設計問題,並沒有真正的「一個真正的答案」。
我通常遵循的經驗法則是「數據進入數據庫,文件進入文件」。
的一些注意事項要牢記:
如果一個文件被存儲在數據庫中,你打算怎麼通過http服務於它呢?請記住,您需要設置內容類型,文件名等。如果它是文件系統上的文件,則Web服務器會爲您處理所有這些內容。非常快速和高效(甚至可能在內核空間中),不需要解釋代碼。
文件通常很大。大型數據庫當然是可行的,但是它們很慢並且不便於備份等。爲什麼在不需要時使數據庫變得龐大?
與2.非常相似,將文件複製到多臺機器上非常簡單。假設你正在運行一個集羣,你可以定期從你的主機到你的從機rsync文件系統,並使用標準的靜態http服務。顯然,數據庫也可以聚集在一起,但它不一定是直觀的。
另一方面,如果您已經對數據庫進行了集羣化,那麼除了處理集羣文件之外,還需要管理複雜性。這將是考慮將文件存儲在數據庫中的原因,我會說。
數據庫中的Blob數據通常是不透明的。你不能過濾它,按它排序或按它分組。這降低了將其存儲在數據庫中的價值。
另一方面,數據庫理解併發性。您可以使用標準的事務隔離模型來確保兩個客戶端不會同時嘗試編輯同一個文件。這可能很好。不是說你不能使用鎖定文件,但現在你有兩件事要理解,而不是一件。
輔助功能。文件系統中的文件可以使用常規工具打開。 Vi,Photoshop,Word,無論你需要什麼。這可能很方便。你怎麼打開blob字段中的word文檔?
權限。文件系統有權限,它們可能是後面的痛苦。相反,它們可能對您的應用程序有用。如果你利用7權限,權限將會真的讓你感到困擾,因爲它幾乎可以確保你的web服務器以不同於你的應用程序的權限運行。
緩存(來自下面的sarah mei)。這會在客戶端扮演上面的http問題(你會記得正確設置生命期嗎?)。在服務器端文件系統上的文件是一個非常好理解和優化的訪問模式。大數據塊字段可能會或可能不會被您的數據庫優化,並且您幾乎可以保證從數據庫到Web服務器也有額外的網絡訪問。
總之,人們往往使用的文件系統的文件,因爲它們支持類文件成語的最好。沒有理由你必須這樣做,而且文件系統變得越來越像數據庫,所以最終看到完全收斂並不會讓我感到意外。
Erik的回答非常好。我還補充說,如果你想做任何緩存,緩存靜態文件要比緩存數據庫內容容易和簡單。
關於使用文件系統的文件有一些很好的建議,但這裏還有其他值得思考的東西。如果您要存儲敏感或安全的文件/附件,使用數據庫確實是唯一的出路。我已經構建了無法將數據放在文件上的應用程序。出於安全原因,它必須放入數據庫。您無法將其保留在服務器/機器上的用戶的文件系統中,以便在沒有適當的安全措施的情況下查看或攜帶它們。使用像Oracle這樣的高級數據庫,您可以非常緊密地鎖定該數據,並確保只有合適的用戶才能訪問該數據。
但是提出的其他觀點非常有效。如果您只是在做像頭像或非敏感信息的事情,那麼對於大多數插件系統來說,文件系統通常更快,更方便。
數據庫很容易設置發回文件;這是多一點工作,但只要幾分鐘,如果你知道你在做什麼。所以是的,文件系統是最好的方法,海事組織,但數據庫是唯一可行的選擇,當安全或敏感數據是一個主要關切。
我沒有看到blobstores的問題是什麼。您可以隨時從中重建文件系統存儲,例如通過在系統正在使用時將東西緩存到本地Web服務器。 但權威商店應該始終是數據庫。這意味着您可以通過在數據庫中扔掉並從源代碼控制中導出代碼來部署應用程序。完成。 添加Web服務器完全沒有問題。
- 1. 存儲和檢索數據庫中的二進制文件(fpt)
- 2. 在mysql中存儲二進制數據
- 3. 如何將文本和二進制文件存儲在hsqldb數據庫中?
- 4. 將文件內容(二進制數據)存儲在plone.app.registry中
- 5. 如何在結構中存儲二進制文件數據?
- 6. 在git倉庫中有效存儲二進制文件
- 7. 用於存儲二進制數據的鍵/值數據庫
- 8. 如何使用LibGit2Sharp從Git存儲庫中獲取文件二進制數據?
- 9. Rails + CouchDb二進制文件上傳到數據庫
- 10. 在MySQL中存儲二進制數組
- 11. 如何導入數據庫的轉儲二進制文件
- 12. 可以將二進制文件放在nexus存儲庫上嗎?
- 13. 在iPhone上的核心數據中存儲二進制數據
- 14. 無法在二進制文件中存儲動態數組
- 15. 如何在二進制文件中存儲有序整數集?
- 16. 在二進制文件中存儲數字
- 17. SQL Server的二進制文件存儲
- 18. 將「結構」數據存儲到二進制文件
- 19. 從數據存儲導出blob屬性爲二進制文件
- 20. 將二進制數據作爲字符串存儲在Web Sql數據庫中
- 21. 將數值從二進制文件存儲到數組中 - C++
- 22. 如何二進制文件保存到數據庫
- 23. 在RStudio構建二進制文件之後將二進制文件移動到本地存儲庫
- 24. 解析二進制文件數據和存儲在數據庫中的設計模式
- 25. 在數據庫中存儲XML文件
- 26. 在數據庫中存儲autocad文件
- 27. 一個版本化的二進制文件存儲庫
- 28. 如何從私人Github存儲庫下載二進制文件?
- 29. Mac OS X二進制存儲庫
- 30. 在數據庫中存儲秒 - Rails
謝謝,Erik。這是一個非常有用和全面的答覆。 – 2009-04-10 17:00:48
7.你的意思是直接在服務器上工作嗎?作爲一個文件,我也下載它之前打開它在Photoshop中。或者我的版本控制系統會爲我做到這一點。 – Luc 2013-01-24 01:30:05
將事物存儲在未複製的本地文件系統中經常會破壞12個因子風格的應用程序,這使得縮放中等或更好的應用程序成爲問題。將附件存儲在S3/CloudFront或類似的克隆後端是大多數(但不是全部)用例的選擇。 CarrierWave,Paperclip等可以幫助抽象出這些差異。 – Barry 2014-12-18 07:10:45