2008-09-30 78 views
47

我想將大量的聲音文件存儲在數據庫中,但我不知道這是否是一種好的做法。我想知道這樣做的利弊。將媒體文件存儲在數據庫上的最佳方式是什麼?

我也認爲有可能與這些文件有「鏈接」,但也許這會帶來比解決方案更多的問題。任何在這方面的經驗都會受到歡迎:)

注意:數據庫將是MySQL。

回答

78

每個系統我知道的,存儲大量的大文件並將它們存儲在數據庫外部。您將文件的所有可查詢數據(標題,藝術家,長度等)以及文件的部分路徑一起存儲在數據庫中。當需要檢索文件時,可以提取文件的路徑,在文件根目錄(或URL)前面添加文件,然後返回該文件。

所以,你有一個 「位置」 一欄,裏面有部分路徑,如 「A/B/C/1000」,然後您可以映射到: 「http://myserver/files/a/b/c/1000.mp3

確保您可以輕鬆地將媒體數據庫指向不同的服務器/目錄,以防您需要進行數據恢復。另外,您可能需要一個例程來重新同步數據庫與文件存檔的內容。另外,如果您要擁有數千個媒體文件,請不要將它們全部存儲在一個巨大的目錄中 - 這是某些文件系統的性能瓶頸。相反,將它們分解成多個平衡的子樹。

+0

好帖子!我沒有複製你,我正在輸入我的答案,而你張貼:-) – CMPalmer 2008-09-30 20:13:03

+1

這個實現有可擴展性的問題,當你得到2+ webservers你的烤。 – DreamWerx 2008-09-30 20:16:11

1

一個簡單的解決方案是將文件的相對位置存儲爲字符串,並讓文件系統處理它。我已經在一個項目上試了一下(我們在一份調查中存儲了辦公文件附件),並且它運行良好。

+0

你是如何對待文件命名的? – 2008-09-30 20:04:25

3

您可以將它們存儲爲BLOB(或LONGBLOB),然後在想要實際訪問媒體文件時檢索數據。

你可以簡單地將媒體文件存儲在硬盤上,並存儲在數據庫中的元數據。

我傾向於後一種方法。我不知道這是如何在全球範圍內完成的,但我懷疑其他許多人也會這樣做。

您可以存儲鏈接(數據的部分路徑),然後檢索此信息。使移動硬盤上的東西變得很容易,並且仍然可以訪問它。

我存儲DB中每個文件的相對路徑以及有關這些文件的其他元數據。如果我需要將實際數據重新定位到另一個驅動器(本地或通過UNC路徑),則可以隨時更改基本路徑。

這就是我如何做到的。我相信別人也會有想法。

7

優點使用數據庫:

  • 容易加入聲音文件與其他 數據位。
  • 避免文件I/O操作, 繞過數據庫安全。
  • 不需要分離操作到 當刪除數據庫 記錄時刪除聲音文件。使用數據庫的

缺點:

  • 數據庫膨脹
  • 數據庫可以比文件系統更加昂貴
15

我想將它們存儲在數據庫中是好的,只要你使用一個很好的實現。您可以閱讀這篇較早但很好的文章,瞭解如何讓數據庫中的大量數據不會影響性能。

http://www.dreamwerx.net/phpforum/?id=1

我已經從字面上100在MySQL數據庫加載沒有任何問題的違規記錄。設計和實施是關鍵,做錯了,你會受苦。

更多DB優勢(尚未提及): - 適用於負載更平衡的環境 - 您可以在多個後端存儲的可擴展性建立

+0

我想用這個..我希望這個東西仍然很好,還是有更好的解決方案嗎? – Manu 2014-01-23 06:42:01

8

我已經在不同的項目中做過兩種嘗試,最終我們決定使用文件系統也更容易。畢竟,文件系統已經被優化用於存儲,檢索和索引文件。

我會想到的一個提示是隻存儲數據庫中文件的「根相對」路徑,然後讓程序或查詢/存儲過程/中間件使用安裝特定的根參數檢索文件。

例如,如果您存儲XYZ.Wav在C:\ MyProgram \ DATA \聲音\ X \的完整路徑將是

C:\MyProgram\Data\Sounds\X\XYZ.Wav 

但你將存儲在數據庫中的路徑和文件名或:

X\XYZ.Wav 

在其他地方,在數據庫中或在你的程序的配置文件,存儲像SoundFilePath等於

下的根路徑:\ MyProgram \ DATA \聲音\

當然,從數據庫路徑拆分根部的位置取決於您。這樣,如果您移動程序安裝,則不必更新數據庫。

此外,如果將要有批次的文件,找到一些散列路徑的方法,所以你不會結束一個包含數百或數千文件的目錄(在我的小例子中,有子目錄基於文件名的第一個字符,但可以更深入或使用隨機哈希)。這使得搜索索引者也很高興。

3

使用斑點來存儲文件

  • 降低管理開銷的一些優點 - 使用單個工具來備份/恢復等
  • 沒有可能性的數據庫和文件系統不同步
  • 事務能力(如果需要)

一些缺點

  • 炸燬你的數據庫服務器的內存無用的垃圾它可以被用來存儲行,索引等
  • 讓你的數據庫備份非常大,因此難以管理
  • 不是很方便的文件系統,以服務客戶(例如與Web服務器)

性能如何呢?你的旅費可能會改變。文件系統非常多樣化,數據庫的性能也是如此。在某些情況下,文件系統會獲勝(可能只有更少的大文件)。在某些情況下,數據庫可能會更好(可能有很多小文件)。

在任何情況下,不要擔心,做什麼似乎當時最好的。

一些數據庫提供了一個內置的web服務器來提供blob。在撰寫本文時,MySQL並沒有。

2

將它們存儲爲外部文件。然後將路徑保存在varchar字段中。將大型二進制blob放入關係數據庫通常效率非常低 - 它們只會佔用空間並且在緩存填滿時會使速度變慢而無法使用。沒有什麼可以獲得的 - 斑點本身不能被搜索。您可能想要將媒體元數據保存到數據庫中。

相關問題