質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

5回答

4862閲覧

データベースに画像を保存するメリット・デメリットと必要性について

neroS2eng

総合スコア16

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/10/07 09:20

編集2020/10/07 12:43

学習中にホームページのレイアウトを作成していたとき、
「HTMLで画像を表示させるよりも、DBに登録しておいて追加削除した方が
ホームページのビジュアル変更時に楽なのではないか?」
と考え調べていたところ、

過去の似たような質問の回答では「DBに画像の保存は推奨しない」との意見が多いように感じました。
https://teratail.com/questions/81233

推奨しない理由はどれも納得のいくものだったのですが、

それではホームページ作成時に
・"定期的に画像の差し替えが起こりうる場合"
・"ユーザー側が画像をアップロードし自由に非表示・表示・削除できる場合"
など画像の変更が頻繁に起こる場合も
JavaScliptやHTMLなどで実現(修正)するのがいいということでしょうか?

正直、個人的にはDBで纏めて操作できる方が楽だよなあ…と考えてしまいます。

よく調べれば出てくる内容かもしれませんが、
画像の操作が頻繁に発生する場合について
皆様のご意見をお聞かせいただけると嬉しいです。

よろしくお願いいたします。

【ちなみに】 この質問をするに至った作成物は ネコの人気投票を行うもので、 一般ユーザーが投票できるWEBページと 管理ユーザーがネコの情報などを操作するための 2つのWebページを作成中です。(脆弱回避のため別ドメイン) 生まれたり里親が見つかったりなどの理由で 管理ユーザー側からアップロード・削除したネコの写真が 一般ユーザー側のページに情報追加される、という仕組みです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

それではホームページ作成時に
・"定期的に画像の差し替えが起こりうる場合"
・"ユーザー側が画像をアップロードし自由に非表示・表示・削除できる場合"
など画像の変更が頻繁に起こる場合も
JavaScliptやHTMLなどで実現(修正)するのがいいということでしょうか?

  • データそのものの保存先
  • データの管理情報の保存先

は別の問題です。
質問中にある同様の質問への回答でも、画像データの管理情報についてはDBに格納するという前提で皆さん回答されている様に思います。

例えば、データのアクセス制御を行う必要がある場合は

  • 画像データ自体はドキュメントルート以外のところに置く
  • 画像データの管理情報はDBに置く
  • HTML上では管理情報で管理されているパスを表示する
  • その画像の外部から見た場合のファイルパスにアクセスしたらアクセス制御用のPHPにアクセスさせる(特定のパス以下は全部そのPHPにアクセスさせるようなmod_rewriteを書く)
  • アクセスが可能な状態かどうかをDBデータから判断し、アクセス可能な状態であればfread()で画像のバイナリを出力する(ブラウザから見たら普通に画像にアクセス出来たように見える)

という感じの実装をすることが多いです。
PHP 画像 アクセス制限等で調べてみてください。

一方で、パスさえ分かれば誰がアクセス出来ても良いという要件であれば

  • 画像データ自体はドキュメントルート配下に置く
  • 画像データの管理情報はDBに置く
  • HTML上では管理情報で管理されているパス=実際のファイルパスを表示する
  • アクセスは普通のファイルとしてアクセスする

とすればいいので簡単です。
どちらの場合も、削除時には画像データそのものを削除しつつ、管理情報を変更したり削除したりします。

投稿2020/10/07 09:41

編集2020/10/08 04:23
tanat

総合スコア18709

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

neroS2eng

2020/10/07 12:53

なるほどめちゃくちゃ納得出来ました! 無知でしたのでそれぞれの保存先が別の問題だと考えもしませんでした。 検索ワードもありがとうございます。 詳しく調べてみます。
tanat

2020/10/07 15:40

単純にアクセス制限をかけるとPHP自体の負荷が高くなる(DBに画像データそのものを置いた場合に比べれば軽いですが)、 高負荷環境(例えばpixivとか)では色々な方法(例えばキャッシュや画像アクセス管理専用の仕組みを用意する等)で負荷を下げる工夫がされているはずです。
guest

0

過去の似たような質問の回答では「DBに画像の保存は推奨しない」と結論付けられていました。

私も回答してますが、今も当該質問と回答を見て思うのは「要件次第」です。
データをどのように扱うか、参照されるか、その頻度
など総合的に判断したうえで設計します。

必ずどちらかで統一しなければならないわけではないです。
なので一方向で「結論付ける」のではなく要件を整理して柔軟に対応してください。

結局はその容量をサーバー上に持たなければならないのは同じです。

投稿2020/10/07 09:53

m.ts10806

総合スコア80765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

neroS2eng

2020/10/07 12:50

言い方が悪く申し訳ありません。 ベストアンサーと意見数と質問者様の納得度合いを見ると推奨しないが多くの方の中では結論のようだ、という意図です。 ケースバイケースでどちらも学習しておけば困ることは無さそうですね。 ただ現場ではどちらがメジャーなのかな…と疑問です。
m.ts10806

2020/10/07 21:46 編集

>ただ現場ではどちらがメジャーなのかな 回答に書いたことを繰り返すことになります。要件次第。 プロジェクトによって、要件によって決まります。 同じ会社同じ人が設計したからと同じようになるわけではないです。 私が設計する際も決めてやってません。
neroS2eng

2020/10/08 03:05

ありがとうございます。 現場経験がないもので一般的にメジャーな方法でほぼ統一されているものだろうと決めつけていました。 場数を踏んでどちらがより適切か判断する力が必要そうですね。 そのあたりも学習に取り入れつつ成果物を作成するように意識してみます。
guest

0

過去の似たような質問の回答では「DBに画像の保存は推奨しない」と結論付けられていました。

そんな結論にはなっていないので、再度読み直してみるのが良いかと。

追記

リンク先の回答の oracle の記事が消滅してるんですね^^;
テイストは違いますが、新しい参考資料を提示します。

データベースに画像を格納したいとき

また、今どきの IaaS や FaaS を利用しようとした場合、永続的データの持ち方としてファイルシステムは採用できないケースがあるので、DB は十分検討に値する保存先です。
ただ、この議論にオブジェクトストレージが入っていないことが質問の質を下げています。検討してみては?

投稿2020/10/07 10:02

編集2020/10/07 18:57
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

neroS2eng

2020/10/07 12:47 編集

言い方が悪く申し訳ありません。 ベストアンサーと意見数と質問者様の納得度合いを見ると推奨しないが多くの方の中では結論のようだ、という意図です。
退会済みユーザー

退会済みユーザー

2020/10/07 18:55

oracle の記事のリンクが消滅していたんですね。先ほど気が付きました。 良い資料だったんですけどねぇ。。。 改めて別の記事を回答に追記しました。
neroS2eng

2020/10/08 02:56

ありがとうございます! 大変助かります。
guest

0

ベストアンサー

個人的な考慮となりますが

  • 画像ファイルを画像ファイルとして保存できるならファイルとして保存

なにをいっているかわからないと思いますがDB上登録する為には一度文字列等に変換しなければならない場合があります。そのような変換は処理に対して負担をかけますので、「なにも変換されないでアップロードされたデータならそのままファイル形式が良い」という事です。

  • 画像ファイルの大きさを考慮する

画像ファイルの内容自体を検索することはまずありません。そうするとDBに収める意味は?となります。
このような場合大量の領域を使ってまでDB上に保存する必要はありません。

  • セキュリティを考慮する

セキュリティの観点からだとDB登録は有効になる場合があります。
例えば「個人のアイコン」。画像ファイルサイズ的にも小さい。ただむやみに他人へ公開はしたくない。
そのような場合はDBで管理したほうが有利となるでしょう。

今回質問者様の例ですと

・"定期的に画像の差し替えが起こりうる場合"

HP上のデザイン的修正であればファイル管理が適していると思います。
切り替え時にパスを変更すればよいだけですから

・"ユーザー側が画像をアップロードし自由に非表示・表示・削除できる場合"

今回の「ネコの画像」の場合は微妙ですね。
利用ユーザ数と1ユーザ辺りの平均アップ数およびファイルサイズから大体の使用容量が判ると思います。
そこから使っているDBの性能およびPC上の容量と比較して余裕が十分あればDBで良いかと思います。
(この場合ファイル管理にしたほうが処理、セキュリティおよびメンテナンスが面倒になります。)

結局は適材適所という答えになってしまいますね

投稿2020/10/07 13:12

kuma_kuma_

総合スコア2506

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

画像そのものではなく、画像のパスだけDBに保存する方法も結構メジャーですよね。

投稿2020/10/07 09:33

firegrape

総合スコア902

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

neroS2eng

2020/10/07 12:51

なるほど、画像パスの保存ですね。 確かにそれなら容量も少なくて済むのでしょうか? 後で調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問