16981


php +
mysqlなどで掲示板を作るとして、投稿フォームで入力された本文からURLを検出してaタグのリンクをつけるとします。もちろん、改行コードはbrタグやpタグに変換して表示します。

この場合、データベースにはhtml化した本文を保存すべきでしょうか。  
それとも、フォームで入力されたtextを保存すべきでしょうか。

htmlを保存する場合、本文を表示する際にサーバーでの処理負荷が少ないですが、データベースの容量は膨れ上がってしまいます（検索機能を考えるとtextも同時に保存すべきであることも考えると2倍以上です）。

逆に、textを保存する場合、データベースの容量は抑えられますが、本文を表示する際に毎回URLを検出してaタグリンクをつけるという処理が発生し、サーバーへの負荷は（比較すると）大きいはずです。

このように、容量をとるか、処理負荷をとるかのジレンマに陥っています。


CC BY-SA 3.0
2015-09-26T17:39:53.693
16974
2015-09-27T06:56:53.187
2015-09-26T18:19:36.717
10698
10698
question
database データベース設計
データベースにhtmlを保存すべきか


今風のWebシステムの場合、Webサーバー側でHTMLを完成させてからブラウザーに送り付けるのではなく、ブラウザー側でAjaxを使用して必要なデータを取得しHTMLを構築するものもあります。  
その場合、

>
> textを保存する場合、データベースの容量は抑えられますが、本文を表示する際に毎回URLを検出してaタグリンクをつけるという処理が発生し、サーバーへの負荷は（比較すると）大きいはずです。

こういった負荷はブラウザー側に分散できるため、textで保存するのが適切かと思われます。（通信時間やUIのレンダリングコストに比べれば、文字列操作は微々たるものです。）

* * *

そうではなく、旧来のWebサーバー側でHTMLを完成させる実装の場合、Webサーバーの出力キャッシュを適切に構成し、整形回数を減らす方法もあります。

いずれにしても、phpとデータベースだけで完結させるという縛りを入れてしまうと視野が狭くなってしまいます。


CC BY-SA 3.0
2015-09-26T23:41:46.177
16981
2015-09-26T23:41:46.177
4236
16974
answer


フォームの入力内容にhtmlを許可しないのであればテキストでの保存を選択すべきです。

  * テキスト処理にかかる負荷は本当に微々たるものです。
  * 入力内容への検索を行うのであれば、DBに保存されたhtmlタグはノイズでしかありません。
  * XSS対策などのセキュリティ上の観点からも、テキストで保存されたものを、画面への出力時にタグ変換＋エスケープ処理を行う方が安全です。

セキュリティ関連については [安全なウェブサイトの作り方：IPA 独立行政法人
情報処理推進機構](http://www.ipa.go.jp/security/vuln/websecurity.html)
からダウンロードできるPDF「安全なウェブサイトの作り方」をご覧になることをお勧めします。


CC BY-SA 3.0
2015-09-27T01:58:05.560
16983
2015-09-27T01:58:05.560
10492
16974
answer


もとのソース(たとえばMarkdownフォーマット等)を保存しておき、変換負荷が問題になる場合は変換後のデータをキャッシュしておく、というのが一般的な手法です。

オリジナルのフォーマットを保存する大きな理由は、再編集を行わせるにはソースが(ほぼ)必ず必要だからです。

逆に言うと、再編集が必要でない場合、HTMLを保存しておくのも選択肢となり得ます。この場合、

  * キャッシュの管理が不要
  * 変換ロジックを変更したら過去データの出力が壊れた、ということが起きない

というメリットがあります。後者は非常に気付きにくいタイプの問題なので、案外大きなメリットです。

検索については、検索対象としてHTMLのタグと同一のキーワードを精度良く検索しなければならない、という状況で無い限り、どちらでもさほど差はないでしょう。

テキストベースのデータであれば容量はほぼ問題にならないのですが、極端にデータが多いもしくはリソースが制限されているなど特別な事情があるのであればそれに合わせた検討が必要です。


CC BY-SA 3.0
2015-09-27T06:56:53.187
16989
2015-09-27T06:56:53.187
5793
16974
answer