2008-08-12 126 views
76

一般來說,性能命中有多糟糕是將文件存儲在數據庫(特別是mssql)中而不是文件系統?我無法想出除了應用程序可移植性之外的原因,我想將我的文件作爲varbinaries存儲在SQL Server中。將文件存儲在數據庫中而不是文件系統?

回答

70

看一看這個答案:

Storing Images in DB - Yea or Nay?

從本質上講,空間和性能損失可以說是相當大的,這取決於用戶的數量。另外,請記住,Web服務器很便宜,您可以輕鬆添加更多來平衡負載,而數據庫通常是最昂貴和最難擴展Web體系結構的一部分的。

有一些相反的例子(如微軟的Sharepoint),但通常情況下,在數據庫中存儲的文件是不是一個好主意。除非可能你編寫桌面應用程序和/或大概知道你將擁有多少用戶,但是對於像公共網站那樣的隨機和不可預知的東西,你可能會爲在數據庫中存儲文件付出高昂的代價。

3

在我自己的經驗,它始終是更好地存儲文件的文件。原因是文件系統針對文件存儲進行了優化,而數據庫則沒有。當然,也有一些例外(例如,預計下一代MS文件系統應該建立在SQL服務器之上),但通常這是我的規則。

1

我@ZombieSheep同意。 還有一件事 - 我通常不認爲數據庫實際上需要可移植性,因爲您錯過了您的DBMS供應商提供的所有功能。我認爲遷移到另一個數據庫將是人們考慮的最後一件事。只是我的$ .02

1

必須將blob(圖像)解析爲字節數組,然後以正確的文件名將其寫入磁盤然後讀取它的開銷足以阻止您進行操作這太經常了,特別是如果文件相當大。

+1

我沒有看到任何地方提到這個「文件」需要寫入磁盤並再次讀取。 – 2009-09-28 07:35:08

+0

這是一個隱含的任務,當圖像必須隨後顯示時,特別是以不同格式存儲時,或者由於尺寸太大而無法在內存中保存很長時間的情況下。 – 2009-09-28 07:50:51

36

如果您可以遷移到SQL Server 2008,您可以利用FILESTREAM支持,它可以提供兩者中最好的一種 - 文件存儲在文件系統中,但數據庫集成比僅存儲文件路徑要好得多一個varchar字段。你的查詢可以返回一個標準的.NET文件流,這使得集成更簡單。

Getting Started with FILESTREAM Storage

+1

我在這裏有一些保留。特別是事物的可伸縮性和可用性方面:如何控制這些「斑點」的存儲位置? – 2009-09-28 07:37:45

22

我會說,這取決於你的情況。例如,我在當地政府工作,我們有很多圖像,如照片等。我們沒有大量的用戶,但我們需要對數據有很好的安全性和審計。數據庫對我們來說是一個更好的解決方案,因爲它使這更容易,我們不會遇到擴展問題。

0

不要模糊或任何東西,但我認爲你將要存儲的'文件'的類型是最重要的決定因素之一。如果你基本上談論一個可以存儲爲文件的大型文本字段,那麼我的首選項將用於數據庫存儲。

3

雖然性能是一個問題,但我認爲現代數據庫設計使其對小文件的問題少得多。

除了性能外,還取決於數據的緊密耦合程度。如果文件包含與數據庫字段密切相關的數據,則它在概念上屬於接近它的數據,並可能存儲在一個blob中。如果它包含可能與多個記錄相關的信息,或者可能在數據庫的上下文之外使用某些信息,則它屬於外部。例如,網頁上的圖像是通過鏈接到該網頁的頁面的單獨請求獲取的,因此它可能屬於外部(取決於具體的設計和安全考慮因素)。

我們的妥協,我不承諾它是最好的,一直存儲在數據庫中的小XML文件,但它的圖像和其他文件。

相關問題