0

あなたが提供できる助けをいただければ幸いです-私は現在、PHP / MySQLで構築している投票アプリのスキーマを決定しようとしていますが、それを最適化する方法に完全に行き詰まっています. 重要な要素は、アイテムごとにユーザーごとに 1 つの投票のみを許可し、その月に受け取った投票に基づいて、その月のトップ アイテムの詳細を示すグラフを作成できるようにすることです。

これまでのところ、初期スキーマは次のとおりです。

Items_table
 item_id
 total_points
 (lots of other fields unrelated to voting)

Voting_table
 voting_id
 item_id
 user_id
 vote (1 = up; 0 = down)
 month_cast
 year_cast

したがって、月=現在の月と年=現在の年である投票テーブルからすべての情報を選択し、何らかの方法でカウントを実行し、item_id; でグループ化する場合になるかどうか疑問に思っています。もしそうなら、どうすればそうすることができますか?または、投票ごとに更新される月次チャート用に別のテーブルを作成する方がよいでしょうか?しかし、投票ごとに 3 つのデータベース テーブルを更新する必要があることに注意する必要がありますか?

私は特に有能ではないので、誰かが提供できるヘルプ/ガイダンスが本当に大好きです.

ありがとう、

_私だけ

4

2 に答える 2

0

月次チャート用に別のテーブルを追加するつもりはありません。ユーザーがアイテムごとに複数の投票を行うのを防ぐために、voting_table(item_id, user_id) で一意のキーを使用できます。要約に関しては、次のような単純なクエリを使用できるはずです

select item_id, vote, count(*), month, year 
from voting_table 
group by item_id, vote, month, year
于 2011-04-01T08:55:51.333 に答える
0

次のような投票テーブルを使用します。

create table votes(
  item_id
 ,user_id
 ,vote_dtm
 ,vote
 ,primary key(item_id, user_id)
 ,foreign key(item_id) references item(item_id)
 ,foreign key(user_id) references users(user_id)
)Engine=InnoDB;

innodb テーブルで複合キーを使用すると、アイテムに関連するデータがクラスター化され、アイテムに関連する投票をより迅速に見つけることができます。vote_dtmユーザーが投票したときのタイムスタンプを保持する列を追加しました。

次に、レポート目的で使用する 1 つまたは複数のビューを作成します。

create view votes_monthly as
select item_id
      ,year(vote_dtm)  as year
      ,month(vote_dtm) as month
      ,sum(vote) as score
      ,count(*)  as num_votes
  from votes
 group
    by item_id
      ,year(vote_dtm)
      ,month(vote_dtm);

パフォーマンスの問題が発生し始めた場合は、レポート コードに手を加えることなく、事前に計算された値を含むテーブルにビューを置き換えることができます。

count(*)と の両方を使用したことに注意してくださいsum(vote)。count(*) は投票数を返し、合計は賛成票の数を返します。ただし、vote列を変更して、賛成票に +1 を使用し、反対票に -1 を使用すると、sum(vote) は、stackoverflow での投票が計算されるのと同じようにスコアを返します。

于 2011-04-01T19:14:54.610 に答える