2017-07-17 23 views
-3

私はupvotes/downvoteを持つブログ/フォーラムシステムを持っており、各コメントはreddit/stackoverflowシステムのようにupvote/downvoteを持つこともできます。PHP/MYSQLユーザブログ/フォーラムの投票システム

すでにアップフォートしているユーザーがもう一度アップフォートできないようにするには、どの方法が最適ですか?

私は別々のupvoteテーブルを使って新しい行を作成する可能性を考えました。しかし、投稿に30のコメントがあれば、スクリプトは30のデータベースクエリを実行してしまい、サーバに多大な負荷をかけることになります。もう一つの可能​​性は、ユーザーのアップアップごとに行を作成し、それらを一緒に照会し、再び実行不可能なpost_idでチェックすることです。

これはupvote/downvoteシステムのための最良の方法で、stumbleupon/redditのようなサイトは何をしますか?彼がログインしている瞬間と同じように、彼は既に彼がすでにアップした投稿に赤い色を見せるかもしれません

+0

私は、別々のデータベーステーブルを作成し、各投稿に行があり、各行には投票したユーザーの配列を格納する列があります。つまり、基本的にユーザ1,2,5と8がすべて投票した場合、それを[1,2,5,8]として保存することができます(jsonとして保存されるので、後で使用するために 'json_decode'を使用できます。)1データベースコール – GrumpyCrouton

+0

"スクリプトは30のデータベースクエリを実行することになります」なぜ、ユーザーが特定のコメントをアップボードした場合、その1つのコメントをチェックして前に投票したかどうかを確認するだけで済みます。コメントテーブルのcommentIDに参加し、UserIDとそれが上/下の投票権を持っているかどうかを示す投票テーブルを作成して、commentID/UserIDコンボのクエリを実行します。その可能性があると思うなら、十分に拡張できるようにシステムを設計するか、または十分なハードウェアを使用する必要があります。 – ADyson

+0

* "もう一つの可能​​性は、ユーザーのアップベクトルごとに行を作成し、 post_idはやはり実行不可能です。 "* ...なぜそれは実行不可能なのですか?単純な結合のような感じです質問ID(おそらく複合PRIMARY KEYとして)と投票記録(+1または-1を署名されたTINYINT(2)として) – CD001

答えて

0

私はそれを行う最良の方法は上/下の票のための別のテーブルを作ることですユーザのIDを保存し、それを上または下の票とし、コメント/投稿/任意のテーブルに対する評判を含む。

ユーザーがアップ/ダウン投票をしようとすると、1つのコメントのみをチェックする必要があります(なぜ30?)。次に、ユーザーがすでにそのコメント/投稿に投票したかどうかを別の表にチェックインします。そうであれば、投票を削除することができます(例えば、SOのように - 投票を2回押すとアップヴォートが削除されます)、または人が別のボタンを押した場合(upvoteの後にdownvote)、投票を変更することができます。私があなたの投稿/コメントテーブルに評判の列を追加し、それをすべて更新した後に更新するように提案した理由は、別のテーブルから評判のcount(*)を取得する必要はなく、あなたのコメント/投稿の評判は簡単になります特に、データベースに多数の行がある場合は、高速に受信する必要があります。

+0

ありがとう、しかし、彼はすでに彼が前にそれをupvotedているかどうかを確認します....彼はログインしている瞬間のように、彼はすでに彼がupvoted投稿を、私はそのタイプについて話していたかもしれない – user2990955

+0

@ user2990955よく、私はあなたが** LEFT JOIN **を使用して、 'posts.post_id = YourPostIDとreputation_giver = loggedUsersId'という票を得てコメントを取得すると信じています。ユーザーがまだ投票していない場合はnullを返します。 [this](https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_join_left)が表示され、nullが返されます。顧客にはodersはありません。 – Danielius

関連する問題