データベースで画像管理していますが、ユーザーからのファイルアップロードが増え、日々ディスクが少なくなっています。いずれディスク交換かサーバー増設はするにして、それ以外にこの問題に対処する有効な方法を教えて下さい。


特に、こういうサイトの場合、通常のウェブサイトはこうやって管理しているよ!的な回答がほしいです。

■サイト
コミュニティサイト

■概要
ミクシィみたいなもので、ユーザー同士が自由にメッセージをやり取りでき、そのメッセージに画像などのファイルが設置可能。上限は2Mバイト。

■作り
ユーザーからのアップロードファイルをbase64エンコードしてテキストとしてDBに格納。

■問題
DBに設置しようが、ファイルで置こうがHDDを日々食っている。

■こうしたい
もう少しディスクの減りを遅くしたい。増設前にすべきことがあるのではと思っている。

■こういう答えが欲しい
・ファイルアップロード上限を1Mにする
・一人当たりのファイルアップロード上限を設ける
・DB格納前にファイル圧縮して記録
・1ヶ月でデータを削除する

上記以外でお願いします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/03/03 21:00:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答4件)

id:pahoo No.1

回答回数5960ベストアンサー獲得回数633

ポイント22pt

ユーザーからのアップロードファイルをbase64エンコードしてテキストとしてDBに格納。

この部分に無駄があります。

BASE64にすると、元データ(バイナリ)よりデータサイズが2~3割大きくなります。


一般的に、画像データなどのバイナリデータはDBレコードに格納せず、単独のファイルとして保存します。DBに格納するのは、検索に必要なファイル名、登録日、登録者、タグなどとします。


その画像へのアクセス回数を記録しておき、アクセス頻度の少ない画像データは圧縮したり、削除対象とすることが考えられます。

id:cbic

そうですね。。base64で保存するデメリットですね。。コミュニティのため、アクセス管理が重要でして、また、ファイル管理の都合などを総合的に考えると、DBでの画像管理は外せそうにありません。

2009/02/24 22:14:05
id:level-2000 No.2

回答回数73ベストアンサー獲得回数0

ポイント23pt

ファイルの保存単位を制限して、且つ保存しきれなくなった分を圧縮して圧縮ファイルとして保管していくとかはいかかですか?

そうするとコミュニティのメンバーがその圧縮ファイルを観覧するには毎回ダウンロードして展開する羽目になるかもしれませんが。というか、なりますね^^;

ファイルの保管数的に考えるとこちらの方が効率がいいかなとか思いました。

id:cbic

おっしゃる通りですね。ありがとうございます。

2009/02/24 22:13:06
id:chuken_kenkou No.3

回答回数722ベストアンサー獲得回数54

ポイント23pt

DBMSで長大なデータを管理させようとした場合、行の管理情報、列の管理情報など付加情報が少なからず発生します。DBMSでは、同時実行性、I/O、空きサーチ等を効率化するため、4KBや8KBなどのページ(ブロックに相当)といった単位でデータを管理します。textやvarchar、blobなどの列データは、ページ長を超えて持つことが可能です。その実装方法は、1列のデータを、物理的には複数のレコードとして管理しています。各物理レコードには、それぞれDBMSが管理するための付加情報が存在します。

つまり、DBMSで長大データを管理させる場合、OSレベルのファイルで管理するより、付加情報が多くなるのです。しかし、DBMSで管理することで、セキュリティの一元化、同時実行性、障害回復などが容易になります。

データ量が膨大なシステムでは、DBMS上では格納先のパスのみ管理する方式を採用している例が少なくありません。しかし、そういった形態では、DBMSで管理している部分と、OSのファイルシステムで管理している部分で、上述のようなセキュリティ、同時実行性、障害回復などの問題点をクリアする必要があります。

id:cbic

なるほど、勉強になります。

2009/02/24 22:12:57
id:FJSK No.4

回答回数53ベストアンサー獲得回数4

ポイント22pt

自分のところでは、ユーザからアップされた画像の解像度やサイズの長辺が指定サイズよりも大きい場合は1024pxにするように、TIFFやPICT等の場合はjpgに圧縮するように等、ImageMagickで自動的に変換させています。

その変換後のイメージをファイルサーバーに保存し、パスをDBに登録して読み出す形にしています。

生成されたイメージには16桁の固有のIDが割り当てされ、格納されるフォルダ名が保存時に生成されますので、URL直打ちでデタラメにイメージにアクセスしようとしてもそうそう引っかからないですし、そもそも外部から引っかからない設定になってます。


それから、cbicさまがおっしゃる「コミュニティのため、アクセス管理が重要でして、また、ファイル管理の都合などを総合的に考えると、DBでの画像管理は外せそうにありません。」ということですが

自分ところは一応これで問題なく管理が出来ていますが、このような方法では問題ありますでしょうか?

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません