質問: 例えばなのですが、現在2つのファイルが存在します。 post.php(質問ページ) single.php(質問の閲覧ページ) これをteratailのサービスでいえば、 マークダウンで質問をユーザーが記載し、投稿するまでのページ(post.php)があり、実際に「質問する」のボタンをクリックすると自分が質問した内容の閲覧ページ(single.php)に飛ぶ仕組みになっているかと思います。 *そもそもphpで書かれていないと思うので、例えばということなります。 post.phpで質問した内容をサーバーサイドでチェックする必要があり、これを通過した場合にはRDBへ値が格納されるとともにsingle.phpで質問内容が表示される必要があると思うのですが、このRDBへの格納運用方法とサーバーサイドでのチェック方法について実務的なアドバイスを頂きたく投稿させていただきました。 ●RDBへの格納方法 求める仕様によっては一概には言えないと思うのですが、一般的にという点でアドバイスを頂ければと思います。 私の想像では投稿された質問RDBとその後の個別の閲覧ページ内の評価であったり、コメントは別のテーブルに格納されているかと思っております。 少ないテーブルで処理して(いたずらにテーブルを増やさない)運用する方法がある一方、例えば新しい質問が投稿されるたびにその閲覧ページで入力される情報を格納するためのテーブルをcreateしてそれぞれの目的別に数が多くてもテーブルを生み出していくことがどちらが適切であるのか指針はあるのでしょうか? 言い換えるのであれば、テーブルを切り分ける(上記の例でいえば、post.php内で入力される情報とsingle.php内で入力される情報を同じテーブルにするまたは異なるテーブルで処理する)境目はどのような基準で判断するのが一般的なのでしょうか?情報の持つ特性や秩序やクエリのスピード等いろいろな視点があると思うのですが、コメントをいただけると嬉しいです。 ●サーバーサイドのチェック方法 例えばこの質問がサーバーサイドチェックを通ればそのまま質問の閲覧ページに飛び、皆様もそれを閲覧できる状態になると思います。この質問ページをpost.phpで皆様も閲覧できるページがsingle.phpであるとしたら、サーバーサイドチェックのコードは一般的にどこに記載されているのでしょうか? 今、私はそれをsingle.phpのトップに記載して、通過しなければもとのpost.phpにリダイレクトし、通過すればRDBにその情報を登録して、single.php上で通過した内容を表示すれば良いと思いコードを書き始めました。 そこでふと、直接single.phpを見に来る閲覧ユーザに対しても、サーバーサイトのチェックからコードが始まるため自分がやろうとしていることに疑問を感じております。single.phpに入力チェックを書くことで以下の矛盾が生じております。 >投稿者 1.質問投稿ページ(post.php) → 2.閲覧ページ(single.php)でチェック → 3.閲覧ページ(single.php)で通過していればそのまま表示 >閲覧者 2.閲覧ページ(single.php)でチェック → 3.閲覧ページ(single.php)で通過していればそのまま表示 そもそも閲覧者に2.のプロセスは関係がない。。 実務的に 途中でpost.phpから例えばcheck.phpのようなチェック用のファイルを用意して、通過すればsingle.phpにさらにリダイレクトするように何か一つ挟むのでしょうか、または、single.php内で投稿者なのか閲覧者なのかを判断する術があり、閲覧者であれば入力チェックをスキップするような分岐を準備して処理されるのでしょうか、それとも全く別のアプローチなのでしょうか。 基本的な内容であったり、読みづらい文章であれば誠に申し訳ございません。質問内容等不明な点があればご指摘いただければ速やかに補足や修正をさせていただきます。 何卒、よろしくお願い申し上げます。
回答: > > ●RDBへの格納方法 > > > 通常、「いたずらにテーブルを増やさない」形で運用します。データに応じて動的にテーブルを増やすのは、よほど特殊な場合(たとえば、インデックスのないBigQueryを使う場合など)に限られます。