解決済みの質問
簡単なアプリケーションを作ろうとしています。内容は、レストランのデータベースです。画面には、単純にレストラン名、住所、電話番号、営業時間、評価を表示させたいです。この「評価」は、このアプリケーションを使用する3人のユーザが入力する1~5の値の平均値としたいです(ユーザはメンテナンス画面から1レストランにつき1回まで評価値入力可能)。つまりユーザAが4、ユーザBが5、ユーザCが1を入力した場合、4+5+1/3=3.3を表示します。テーブルを設計した経験がないので教えてほしいのですが、この場合、どのようなテーブルを作れば最もシンプルできれいに出来るのでしょうか。まずレストランテーブルを作成する必要があると思いますが、「評価」があるために1テーブルでは不足だと思います。評価カラムの値はユーザが値を入力すれば変動することになるので、別テーブルを参照させるようにすべきなのでしょうか?評価テーブルというものを考えてみましたが、ユーザ名とレストランIDの複合をプライマリキーとし、評価値カラムをもたせるとしても、どこに平均値を持たせればいいのかわかりません。テーブル設計の模範例を教えて頂けると助かります。宜しくお願いします。
投稿日時 - 2011-06-21 21:54:53
基本は次のとおりです。
レストランテーブル
(レストランID,レストラン名,住所,電話番号,営業時間)
ユーザテーブル
(ユーザID,ユーザ名)
評価テーブル
(レストランID,ユーザID,評価)
平均値はDBに格納せず,SELECT検索のたびに AVG(評価) 集約関数で計算させて出力します。ユーザは特定の3人に限定せず,多数のユーザが投票してもその評価の平均を出力することができます。
この設計で運用を進めてみて,「使用しているサーバの性能があまり高くなく,テーブルを結合したり AVG(評価) 計算していると時間がかかることが分かった」ということが判明したのであれば,この基本の正規形をあえて崩すことは検討するかもしれません。
投稿日時 - 2011-06-22 08:35:45
お礼
jjon-com様、とてもクリアなご回答大変有難うございました。よくわかりました。念のため一点だけ確認ですが、ユーザはメンテナンス画面からデータベースに存在するレストラン1つあたり1回まで(0回 or 1回)評価出来るようにしたいのですが、この場合、評価テーブルのレストランID、ユーザIDの複合をプライマリキーにすればよいですよね?
投稿日時 - 2011-06-22 09:17:53
0人が「このQ&Aが役に立った」と投票しています
OKWaveのオススメ
おすすめリンク