2011-04-01 45 views
0

我會很感激你可以提供的任何幫助 - 我目前正在試圖決定我正在使用PHP/MySQL構建投票應用程序的模式,但我完全停留在如何優化它。關鍵要素是每個用戶只允許每個用戶投一票,並能夠根據當月收到的選票建立一張詳細列出當月最優先項目的圖表。如何優化我的投票應用程序以生成月度圖表?

到目前爲止,初始模式爲:

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 

所以我不知道它是否將是投票選擇表中所有信息的情況下本月= currentMonth &年= currentYear,莫名其妙地運行數並按item_id分組;如果是這樣,我會怎麼做呢?或者我會更好地爲每月投票更新的月度圖表創建一個單獨的表格,但是我應該關注每個投票更新3個數據庫表格的要求嗎?

我不是特別勝任 - 如果它表明 - 所以會真的愛任何人可以提供的幫助/指導。

感謝,

_just_me

回答

0

我不會增加每月的圖表單獨的表;爲了防止用戶爲每個項目投出多個投票,您可以在voting_table(item_id,user_id)上使用唯一鍵。 至於總結,你應該能夠使用一個簡單的查詢像

select item_id, vote, count(*), month, year 
from voting_table 
group by item_id, vote, month, year 
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,它將保存用戶投票時的時間戳。

然後我會創建一個或多個視圖,用於報告目的。

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)。伯爵(*)將返回投票數量,而總數將返回最高票數。無論如何,如果您將vote列更改爲使用+1進行upvotes,使用-1進行downvotes,則總和(投票)將返回一個非常類似於計算出的計算結果的分數。

相關問題