2

我知道alot has been said on SO on how a file should be represented in a database,但我找不到任何Stackoverflow的問題,其中更深入到如何存儲多個相關的文件。將每個AWS S3文件作爲單獨的行存儲在數據庫中?

我正在使用Amazon S3並將圖像分組到單個S3存儲桶內的相冊(即「文件夾」)中。我讀過,至少將文件路徑存儲在數據庫中是一個好習慣。

我的問題是怎麼用多個文件都具有相同的「文件夾」路徑。這裏是我的S3結構:

my-bucket/folder1/img1a.jpg 
my-bucket/folder1/img1b.jpg 

my-bucket/folder2/img2a.jpg 
my-bucket/folder2/img2b.jpg 

一些問題:

  1. 我應該代表這與我的數據庫2個或4行?
  2. 如果每幅圖像實際上都是作爲不同尺寸(40x40,480x320)的多個圖像存儲在S3中,那麼如何將這些信息保存在我的數據庫中的最好?
  3. 看着AWS S3 SDK,我無法弄清楚如何獲取特定「文件夾」中的所有文件URL。我錯過了什麼嗎?

回答

3

首先,從早先的答案和交談,我會說,不擔心數十億行,直到你遇到問題爲止。如果你只是在設計一些全新的服務,那麼很可能不用擔心你將如何管理數十億的圖像。試圖處理可提供數十億文件的高可用性,低延遲服務是世界上一些最優秀的工程師可能需要數年才能設計和實施的設計挑戰。

也許把重點放在低幾個數量級來考慮你將如何處理數百萬甚至上千萬的記錄,或者是什麼是你需要在未來一兩年內處理的實際水平的對象。在這種情況下,確實沒有理由,例如,具有設計良好的索引的MySQL安裝無法處理具有數百萬行並具有良好響應時間的表的查詢,特別是如果您瞭解訪問模式並且能夠經常緩存請求文件元數據。

至於關係數據庫是否是存儲文件元數據的最佳方式,實際上取決於您將要存儲的數據的層次結構以及訪問模式將會是什麼(例如,您將如何查看數據)。你給出了一個非常簡單的例子,說明你的文件將如何組織,並建議可能存在一些組織結構,其中每個圖像都以多種分辨率存儲。

是否你的應用程序需要了解所有的分辨率選項的圖像,並決定最好的一個基於某些標準來服務,否則你將永遠知道你會得到完全相同的形象?

在第一種情況下,你可能要爲你的元數據的NoSQL類型的存儲,這樣就可以查找圖像組,並使用應用程序邏輯來選擇從組最佳的圖像文件。在後一種情況下,可能會更好地使用關係數據庫或者甚至像SimpleDB或類似的高度可用的鍵值存儲來獲取文件元數據。此外,關於實際投放了圖像

,你可能要考慮實際使用的Cloudfront以滿足您的S3文件,因爲這會給你一些延遲優勢。

至於你關於S3「文件夾」的問題,是要明白,有沒有真正的S3文件夾中是很重要的。人們通常稱爲他們與類似文件夾的命名方案的文件或許暗示剷鬥內文件的一些層次分組,但實在是沒有物理目錄結構,也不做通常與目錄結構相關的東西(如列表中的所有文件的能力目錄)。所有文件只存在於存儲桶級別。

這裏有一個files表(如果使用SQL或變體):

file_id folder_id  file_path 
    1   1  http://s3.aws.amazon.com/my-bucket/folder1/img1a.jpg 
    2   1  http://s3.aws.amazon.com/my-bucket/folder1/img1b.jpg 
    3   2  http://s3.aws.amazon.com/my-bucket/folder2/img2a.jpg 
    4   2  http://s3.aws.amazon.com/my-bucket/folder2/img2b.jpg 

這裏的file_id將與自動增量場和folder_id主鍵將與指數提供一個簡單的方法來查找所有int列文件在某個文件夾中。

+0

謝謝@Mike,那是一個很好的答案! –

+0

- @邁克,我沒有索引表之前,我的'CREATE INDEX ...'代碼是否正確? –

+0

對於所有這四個記錄,'file_id'都不是'1',然後是'files_id'來給出'autoinc'索引? – jcolebrand

1

從你問的問題看,你應該有一個「filepaths」表,它有兩個項目:一個文件ID和一個文件路徑。

然後,您的數據庫中有4行爲路徑,1行爲文件本身,即您正在跟蹤的元數據。


你在混淆關於亞馬遜服務和數據庫設計的問題。爲此,當涉及到:

如果每個圖像實際存儲在S3不同尺寸(40×40,分辨率480x320)的多張圖片,怎麼可能它是最好保留這些信息在我的數據庫,在我桶?

看着AWS S3 SDK,我無法弄清楚如何獲取特定「文件夾」中的所有文件。我錯過了什麼嗎?

我對亞馬遜web服務的編程一無所知。我可以說,你可能無法將它們全部放在特定的文件夾中,因爲它們可能在內部專門分割以避免通過在數據庫中複製一條記錄最多四次而獲得的問題。

至於如何存儲你的數據庫的信息和你的水桶,我只能說「滿足您的業務需求。」

+0

感謝,但這樣的Instagram/Facebook的具有數十億行的在自己的形象表?這聽起來在計算上勢不可擋... –

+0

爲什麼?他們實際上做了所謂的「分片」,因此每個表可能有數十億的_indexed_行,但數據分佈在很多表中,因此索引使它非常快速地找到數據。如果你不知道什麼是有效的B-Tree,那麼你可能需要學習很多關於數據庫設計的知識。 – jcolebrand

+0

我確實知道分片,但是對於一般數據庫我不太瞭解。這對我來說是新聞,他們將每個文件作爲一行存儲在數據庫中。所以我需要一個由'file_id'索引的表格,並且你會介意在你的答案中包含一些關於B-Tree的內容嗎? –

相關問題