2011-08-15 6 views
0

私はこの質問が何度も尋ねられていることを知っていますが、私は複数のサイズを持つイメージを格納することについてです。1つのイメージ、ファイルシステムまたはデータベースのアプローチの複数のサイズを格納します

私のイメージはファイルシステムに保存されることに決めました。それで、チェックされました!

入力タイプ=「ファイル」はPHPでUNID機能を使用して一意のIDが与えられますを介してアップロードすべてのマスターイメージ:uniqid(「fc_」、true)の

は今、私のジレンマは異なるを格納する方法でありますマスターイメージのサイズ(または子)。

現在、マスタイメージにはデータベースのレコード(ID、タイトル、説明、タイプ、ファイル名)が含まれており、ファイルシステムに格納されています。異なるサイズのマスターイメージはファイルシステムに直接移動します(データベースにレコードはありません)。マスターイメージのuniqidといくつかの追加されたテキストを使用して名前を付けました。だから、:

Master: fc_345679849.89675849.jpg 
size (30px) : fc_345679849.89675849_tiny.jpg 
size (50px) : fc_345679849.89675849_small.jpg 
size (100px) : fc_345679849.89675849_medium.jpg 
size (500px) : fc_345679849.89675849_large.jpg 

私はこのシステムに多くを見て始めたときや他の人がそれを行う方法、それは正しいアプローチであった場合、私はより疑わしいとなりました。

私が考えていたもう1つのアプローチは、データベースにサイズの異なるものを含め、すべてのイメージ(実際のイメージではなくイメージへの参照)を格納する方法でした。彼らはすべてそのような、それが適用される場合は、マスターイメージへの参照を主キーを持っているとします:

id, ..., filename, master_imageid 
_____________________________ 
1, ... , 34.jpg, NULL 
2, ... , 23.jpg, 1 
3, ... , 45.jpg, 1 
4, ... , 12.jpg, 1 
5, ... , 8.jpg, 1 

ので画像がマスター、そして残りの(異なるサイズ)ではの子でありますマスターは...画像2、3、4、5

したがって、システム#1:マスターのレコード1つで、子供はデータベースレコードを持たず、それぞれのファイル名に便利なテキストがあり、マスター。

システム#2:マスターのための1レコードと、各子供のための1レコード。子供のファイル名に便利なテキストを追加する必要はありません。列にはmaster_imageidが自動的にそれらをマスターにリンクします。

最高の解決策は何ですか?

ありがとうございます。

+2

データベース内のファイルはめったに良い考えではありません。データベースにメタデータを格納し、そこにあるファイルシステムを使用してファイルを格納します。 –

+1

彼はファイルシステムを使ってデータを保存していると述べています。すでにデータをDBに保存しています。 – susmits

+0

JPEG画像を扱っているときにJPEG2000を使用したい場合は、[JPIP] /en.wikipedia.org/wiki/JPIP)、あなたが扱っているサイズでは大きなメリットはないかもしれません。おそらく、マスターが非常に大きなサイズだったとします。 – Joe

答えて

1

ファイルシステムに基づいたアプローチをお勧めします。このようにして、単純な文字列操作を使用してさまざまなサイズのファイル名を取得できます。データベースを中心としたアプローチでは優雅ですが間接的なレイヤーが追加されます - データベースキャッシングがない場合、ファイル名を取得するためにHDDを1回、実際のイメージデータを取得するためにHDDを1回、RAMの連結を1回実際の画像データを取得するために、ファイル名+ HDD読み取り値を取得する。これは、固有の潜在的なデータベースと相まって、導入する傾向があり、かなり絵を描くことはありません!

しかし、データベースにはいくつかの利点があります。ユーザがより小さなバージョンに手を加えるためにどんなファイルにも "_small"を巧みに貼り付けさせないようにするには、データベースを使用することは間違いありません。しかし、それでも、特にキャッシングがない場合には、より良い選択肢があります。

単純なURL操作でファイルにアクセスするユーザーが本当に問題になる場合、たとえば、固有のイメージIDと解像度指定子を連結し、ファイル名を十分に安価にファイル名を生成するために、小さな範囲のハッシュアルゴリズム(MD5が念頭に置いてあります)で衝突防御を行います。

これらのアプローチはすべて、キャッシングの度合いによって犠牲になった瞬間、パフォーマンスの面でほとんど犠牲になることに注意してください。理想的には、URLを操作可能にすることが望ましくない場合は、固有のファイル名を事前に計算してデータベースに格納し、実行時にmemcached/redis/whateverを使用してルックアップを実行します。

1

なぜuniqueidを作成するのはなぜですか?各データベースレコードにはすでに一意のIDフィールドがありますか?

image table 
id, created_by, etc 

したがって、レコードIDが234の場合、ファイル名は234.jpgなどになります。ファイル名にuniqueid()を使用する場合は、ファイル名が存在しないことを確認してください。同じマイクロ秒の間に2つのファイルが何らかの形で作成された場合、同じuniqueidを持つ可能性があります。

また、さまざまなサイズのテキストを添付すると何が問題になりますか?私にとって最善の方法のようです。

234_thumb.jpg 
234_small.jpg 
234_large.jpg