データベーステーブル設計

解決済みの質問

データベーステーブル設計

簡単なアプリケーションを作ろうとしています。内容は、レストランのデータベースです。画面には、単純にレストラン名、住所、電話番号、営業時間、評価を表示させたいです。この「評価」は、このアプリケーションを使用する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

QNo.6826389

困ってます

質問者が選んだベストアンサー

基本は次のとおりです。

レストランテーブル
(レストラン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

ANo.1

0人が「このQ&Aが役に立った」と投票しています

[  前へ  |  次へ ]

ベストアンサー以外の回答(1件中 1~1件目)

ANo.2

> レストランID、ユーザIDの複合を
> プライマリキーにすればよいですよね?

はい,そのとおりです。

投稿日時 - 2011-06-22 09:39:37

お礼

有難うございました!

投稿日時 - 2011-06-22 09:45:56

あわせてチェックしたい
  • プライマリキー ...
  • テーブル設計について ...
  • プライマリキーとは ...
PR

OKWaveのオススメ

教えて弁護士さん!

お金の悩みQ&A特集はこちら