(以前、同アプリの質問をさせて頂きましたが、それとは別の質問です。)
質問形式のWebアプリで、ユーザは次々と質問に答えていきます。
質問のリスト1つは数十〜数百個の質問で構成されます。
1ページにつき1つ、質問リストからランダムで表示され、
質問に1つ答える毎に次のページ(次の質問)に進んでいきます。
(ユーザは一度にリストの全ての質問に答える必要はありませんが、
一度に数十〜最大で百個以上も答えることを想定しています。)
このようなサイトの場合、質問を1個表示するタイミングで
質問内容を逐一データベースから読み出して表示するしかないのでしょうか?
それとも、最初に多くの質問をまとめて読み出しておいて、
そこから表示するような事は技術的に可能なのでしょうか?
他にも良い方法がありましたら、そのやり方も教えて頂けますと幸いです。
PHPとMySQLとJavascriptで開発する予定です。
初心者ですが、助言をよろしくお願い致します。
DBを使う方式で問題ないです。
ロックに関しても今回の件に関しては意識する必要がないはずです。
データは、追加(INSERT)しか発生しませんので。
>このようなサイトの場合、質問を1個表示するタイミングで
>質問内容を逐一データベースから読み出して表示するしかないのでしょうか?
>それとも、最初に多くの質問をまとめて読み出しておいて、
>そこから表示するような事は技術的に可能なのでしょうか
逐一読むで問題ないです。
アンケートサイトやモニターサイトで、多くの質問を答えさすサイトも
逐一読み込んでるようですから。
普通にDBサーバーのほうで、同じレコードばかり読みますからキャッシュが聞きます。
>それとも、最初に多くの質問をまとめて読み出しておいて、
>そこから表示するような事は技術的に可能なのでしょうか?
可能です。
Javaとかだと、サーバーコンテキストに読み込んでおくと
違うセッションからも読みにいけます。
サーバーコンテキストとかない言語だと、
セッション変数に読み込んでおくというのが可能です。
PHPやJavaあたりは簡単に実装できます。
そんなに負荷が高くないのなら、毎回DBを読みにいって問題ないと思います。
DBを読み出すよりも、質問に答えた後にDBに書き込みに行くほうが負荷が高いはずで、
たくさんのアクセスがあって多くの人が一度に同時に答えだしたときに問題になるのは
書き込み(更新)のほうです。
WordPres(ブログ)とかでも、毎回DBに読みに言って、画面(HTML)を生成してますが
多くのサイトは問題ないことから考えて、毎回DBに読みにいくのは普通では問題ないと思います。
DBに読みに行くのが負荷が高く、セッションとかに抱え込むのが無理な場合は、
DBの内容をテキストファイルに出力して、サーバー側でキャッシュのような感じで
使うと負荷が下がります。
テキストファイルを読むほうが、DBを読むよりもかなり負荷が小さいです。
そういうこともあって、昔はDBよりテキストファイルとかいわれてましたが
今は、DBを使うほうが普通です。
お返事ありがとうございます。
テキストファイルを使用するとのことですが、
ユーザが質問リストを自由に作成および編集して
公開できるサイトにする予定なので、
データベースを使わざるを得ないと考えています。
(ユーザごとの質問の解答結果も保存します。)
説明足らずで申し訳ございませんでした。
もし他に方法がございましたら、よろしくお願い致します。
ユーザが質問リストを自由に作成および編集して
公開できるサイトにする予定なので、
データベースを使わざるを得ないと考えています。
「データベースを使わざるを得ない」必然性はあるでしょうか?
むしろ、複数ユーザーが同時に同じ質問リストを編集することが想定され、そのためのDBロックのメカニズムを考えると、質問1つについて1つのファイルにした方が管理が易しいと思います。
現時点の計画では、ユーザが作った質問リストを
他のユーザが勝手に編集する事は出来ないようにする予定です。
また、公開された質問リストに他のユーザがコメントを付けたり、
お気に入りリストに登録したり、画像を用いた質問等も考えているのですが、
データベースを使用せずに実装することができるのでしょうか?
(将来的にiPhoneから見るためのアプリ開発も視野に入れていました。)
私の知識不足で恐縮ですが、テキストファイルを使用した場合に
そういった機能を実現する方法が想像できません・・・。
私が読んだPHPの書籍や記事は全てDB を使う事が前提でした。
もしよろしければ、おっしゃってる方法について
書かれているようなサイトや書籍があれば、ご紹介頂けませんか?
ご迷惑をおかけしてどうもすみません。
DBを使う方式で問題ないです。
ロックに関しても今回の件に関しては意識する必要がないはずです。
データは、追加(INSERT)しか発生しませんので。
>このようなサイトの場合、質問を1個表示するタイミングで
>質問内容を逐一データベースから読み出して表示するしかないのでしょうか?
>それとも、最初に多くの質問をまとめて読み出しておいて、
>そこから表示するような事は技術的に可能なのでしょうか
逐一読むで問題ないです。
アンケートサイトやモニターサイトで、多くの質問を答えさすサイトも
逐一読み込んでるようですから。
普通にDBサーバーのほうで、同じレコードばかり読みますからキャッシュが聞きます。
>それとも、最初に多くの質問をまとめて読み出しておいて、
>そこから表示するような事は技術的に可能なのでしょうか?
可能です。
Javaとかだと、サーバーコンテキストに読み込んでおくと
違うセッションからも読みにいけます。
サーバーコンテキストとかない言語だと、
セッション変数に読み込んでおくというのが可能です。
PHPやJavaあたりは簡単に実装できます。
そんなに負荷が高くないのなら、毎回DBを読みにいって問題ないと思います。
DBを読み出すよりも、質問に答えた後にDBに書き込みに行くほうが負荷が高いはずで、
たくさんのアクセスがあって多くの人が一度に同時に答えだしたときに問題になるのは
書き込み(更新)のほうです。
WordPres(ブログ)とかでも、毎回DBに読みに言って、画面(HTML)を生成してますが
多くのサイトは問題ないことから考えて、毎回DBに読みにいくのは普通では問題ないと思います。
DBに読みに行くのが負荷が高く、セッションとかに抱え込むのが無理な場合は、
DBの内容をテキストファイルに出力して、サーバー側でキャッシュのような感じで
使うと負荷が下がります。
テキストファイルを読むほうが、DBを読むよりもかなり負荷が小さいです。
そういうこともあって、昔はDBよりテキストファイルとかいわれてましたが
今は、DBを使うほうが普通です。
大変詳しいご説明、有り難うございます。
とりあえずは、DBにその都度読みにいく実装にして、
負荷がかかり過ぎるようなら、PHPのセッション変数を
利用する事を検討したいと思います。
書き込みに関しては、セッション変数またはクッキーを利用して、
複数の質問への回答を一度に書き込む実装を考えています。
そうすることで、負荷を最少限に抑えられるのでは・・・、
と期待しています。
質問リストの編集には、追加の他に削除と更新を考えていますが、
現状の仕様では編集は一人しか行えない予定なので
特に問題ないのではないかと思っています。
(ゆくゆくは複数人での編集も検討しますが、
MySQLの排他制御を勉強しながら決める予定です。)
ご説明、大変参考になりました!
>(ゆくゆくは複数人での編集も検討しますが、
>MySQLの排他制御を勉強しながら決める予定です。)
WEB系プログラムでDBの排他制御を使うことはまずないです。
WEBは1リクエスト単位にDBとの接続(セッション)が切れるのでロックをかけられないのと
下手にロックをかけると、ロックを解除できない自体になりかねないからです。
だから、それ以外の方法で、
ある程度、妥協した仕様で実装する場合がほとんどです。
なるほど、質問の追加はともかく更新を複数人でやるのは困難なのですね。
Togetterのように、複数人による更新を可能にする機能も実現したかったのですが、
どこかで妥協した仕様にしないと実現は難しいのでしょうね。
どのような仕様にするか、よく考えたいと思います。
お返事有り難うございました。
大変詳しいご説明、有り難うございます。
とりあえずは、DBにその都度読みにいく実装にして、
負荷がかかり過ぎるようなら、PHPのセッション変数を
利用する事を検討したいと思います。
書き込みに関しては、セッション変数またはクッキーを利用して、
複数の質問への回答を一度に書き込む実装を考えています。
そうすることで、負荷を最少限に抑えられるのでは・・・、
と期待しています。
質問リストの編集には、追加の他に削除と更新を考えていますが、
現状の仕様では編集は一人しか行えない予定なので
特に問題ないのではないかと思っています。
(ゆくゆくは複数人での編集も検討しますが、
MySQLの排他制御を勉強しながら決める予定です。)
ご説明、大変参考になりました!