2017-07-17 68 views
-3

我有一個博客/論壇系統upvotes/downvote和每個評論也可以有upvote/downvote像reddit/stackoverflow系統。PHP/MYSQL用戶博客/論壇投票系統

哪種方法可以確保已經投入使用的用戶無法再次提供投票?

我確實考慮過創建一個帶有單獨upvote表的新行的可能性。但是如果一篇文章有​​30條評論,那麼腳本最終會做30條數據庫查詢,這也會給我的服務器帶來巨大的負擔。另一種可能性是爲用戶的每個upvote做一行,一起查詢它們並檢查post_id,這又是不可行的。

那麼哪個是upvote/downvote系統的最佳方式,以及像stumbleupon/reddit這樣的網站做什麼?就在他登錄的那一刻,他可以看到一個紅色的顏色,可能是他已經投了票的帖子

+0

我會做的是做一個單獨的數據庫表,每個職位有一個行,每行有一列存儲已投票的用戶數組。所以基本上如果用戶1,2,5和8都投了票,你可以將它存儲爲[1,2,5,8](作爲json存儲,所以你可以'json_decode'它稍後使用它。1數據庫調用 – GrumpyCrouton

+0

「該腳本最終會做30個數據庫查詢「爲什麼?如果用戶提出了特定的評論,那麼您只需要檢查一個評論,看看他們是否投票過它。這是一個非常簡單的SQL查詢來做到這一點。在評論表中加入評論ID的投票表,並且包含用戶ID以及它是否是向上/向下投票,然後你對評論ID /用戶ID組合進行查詢,他們不太可能嘗試並投票全部30個,如果你認爲這是一種可能性,那麼你需要設計你的系統足夠的規模,和/或使用足夠強大的硬件。 – ADyson

+0

*「另一種可能性是爲每個用戶upvote做一排,查詢它們並檢查post_id又是不可行的。「* ...爲什麼這是不可行的?聽起來像一個簡單的連接用戶ID,問題ID(作爲複合PRIMARY KEY可能)和投票記錄(+1或-1作爲簽名TINYINT(2)) – CD001

回答

0

我相信最好的方法是製作一個單獨的表格,用於上/下選票,保存用戶的ID,是投票,還是在評論/帖子/任何表中包含信譽。

如果用戶試圖做up/down投票,你只需要檢查一個評論(爲什麼是30?)。然後,如果用戶已經投票支持該評論/帖子,則只需在單獨的表格中籤入即可。如果是這樣,你可以刪除投票(例如像在SO - 如果你按兩次投票,你的投票將被刪除),或者如果人按下不同的按鈕(f.e. downvote後upvote),你可以改變他的投票。之所以我提供給您的信譽列添加到您的信息/評論表,並在所有投票結果都是最新的信息後進行更新,是因爲您不需要從該單獨的表獲得count(*)的聲望,並且您的評論/帖子信譽將很容易並快速接收,特別是,如果您的數據庫有很多行。

+0

謝謝,但是用戶怎麼看他是否已經在之前投入了它......在他登錄進來的那一刻,他可以看到一個紅色,可能是他已經投票的帖子,我在談論那種類型的系統 – user2990955

+0

@ user2990955好吧,我相信然後當得到的評論,你可以使用**左加入**,並得到票'WHERE posts.post_id = YourPostID和reputation_giver = loggedUsersId',然後你要麼登錄用戶上/如果用戶還沒有投票,那麼可以減少投票或獲得空。您可以看到[this](https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_join_left),其中返回null - 客戶沒有oders。 – Danielius