- ベストアンサー
ファイルへのリンクの作成手法について(BLOBなどの利用)
現在、OracleDBを利用してWebアプリケーションの開発を行っています。 作成予定のアプリは、 ある製品の一覧リストを作成して、そこからPDFファイルへのリンク、一覧に製品画像ファイルを表示、・・・ といったアプリケーションです。 そこで、PDF、画像ファイルの管理方法をどのようにしようかと悩んでおります。 方法としては、以下の2つの方法があるかと思います。 (1)ファイルはサーバにFTPでアップロードして、DB側でファイルパスを管理する。 (2)OracleDBにて、BLOBなどのデータ型を利用してDBのカラム内にファイルを格納する。 今社内にあるアプリは、(1)の方法が採用されているようですが、ファイルとパスを2重管理しなくてはいけない、という問題があります。 (2)については、たぶん技術的には可能だろうと思っていますが、今までにそのようなアプリを見たことが無いため、戸惑っております。 一般的にはどちらの手法が用いられるのでしょうか? また(2)の場合の問題点として、どのようなことが考えられますでしょうか? 以上、宜しくお願い致します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>一般的にはどちらの手法が用いられるのでしょうか? どちらもあると思いますよ。 (1)は、パス情報を管理すればよいだけのなので、プログラム的にはわりと楽です。ただしおっしゃるように2重管理のデメリットもあります。 (2)は、データベースのレコードに格納されるのはよいのですが、 レコード長が長くなり、レコードを検索するのに時間がかかる可能性があります。 (内部的なことですが、あるレコードから次のレコードに移動するのに、ディスクをたくさん移動しなければならなくなる) また、取得する場合には、わざわざ検索してバイナリデータを取得しなければなりません。 Webシステムなどで、ページ内にある、多数の画像ファイルをDBから取得しようとすることを考えると、ファイルで存在したほうが、効率がよいと思います。 一般的にはどうとは言えませんが、格納することだけでなく、取得する時の手間も考えて検討したらよいと思います。
その他の回答 (3)
- sasadora
- ベストアンサー率68% (59/86)
それぞれのメリット・デメリットを把握した上で、天秤にかけれて決めれば、どちらもアリだとは思うのですが。 例えば利用者を管理するテーブルなどで、顔写真をレコードに格納したことがあります。顔写真はあくまでもユーザの情報であり、レコードに格納したかったためです。 BLOBで画像を格納した時のメリットに感じたこと ・DBのバックアップ時に、ファイルシステムもバックアップしなくてよかった ・レコードの削除に連動してファイルを削除する必要はない ・Web(兼APサーバ)2台+DBサーバ1台でも可 ・DBだけにアクセスするC/Sアプリからでも画像が取得できた このようなメリットがあったため、取得する時のデメリットは受け入れた上でBLOBに格納することを選択しました。
- PED02744
- ベストアンサー率40% (157/390)
う~ん。。(1)と(2)の間を取るような手もあります(笑) ファイルサーバとDBサーバが同居するような場合ならば、 (1)ファイルをサーブレット経由で一時ファイル格納領域(サーブレットが勝手に決めた場所)に転送する (2)オラクルのPL/SQLプロシージャに(1)で転送したファイル名とファイルの基本情報をパラメータとして渡す (3)PL/SQLプロシージャ側では、(2)で受け取ったファイル情報を元にファイル格納パスを確定し、(1)で転送してきたファイルを正規のDBが管理している場所へコピーする (4)プロシージャが終了したら、テンポラリファイルをサーブレットが消す これなら、サーブレットは勝手に自分のテンポラリに置いて、プロシージャをたたいているだけですので、本当のパスはDB内部にしかないことになりますので、二重管理の必要はないのではないでしょうか。
- Bonjin
- ベストアンサー率43% (418/971)
技術的にはどちらも可能ですが、特に理由がない限り(1)を使うのが一般的です。 静的なPDFや画像にアクセスするたびにアプリサーバやデータベースサーバに負荷がかかるような効率の悪いことはすべきではありません。静的なコンテンツはなるべく負荷がかからないように配置するのが一般的です。 また、(1)も本当に必要でしょうか?URLを動的に作成するだけで済ませられませんか?不必要にデータベースを使うのも考え物です。 ということで、技術的な観点だけでなくサーバの負荷なども考えてみてください。
お礼
ご意見ありがとうございます やはり負荷が気になりますか。 考えてはいましたが、コメントを見る限り、私が想定していた以上に考慮しなくてはいけないように感じました。 また、それなりにリクエストが発生するアプリとなる事が予想されるため、無難に(1)の手法を採用したほうがよさそうです。 > また、(1)も本当に必要でしょうか?URLを動的に作成するだけで済ませられませんか? 不必要にデータベースを使うのも考え物です。 ですが、ファイル名が既に決まっており、しっかりとしたルールの下でファイル名が決まっていないため動的に生成という事は厳しい状況です。 (製品番号+ファイルのVerや製品シリーズものでファイルが共通化されていたり・・・など。) ということはBLOBのようなバイナリのデータ型は実際のところ利用されるケースは少ない、という状況ですかね? (考え方では便利な機能と感じますが、実用性が・・・ という認識でよいでしょうか?)