-3

私のブログタイプのウェブサイトにはポイントシステムがあり、ユーザーはさまざまな方法(コメント/投稿への投票/コメントへの投票など)で貢献することでポイントを獲得できます。ユーザーが獲得したすべてのポイントをMySQLデータベースに効率的に記録するにはどうすればよいですか。

現在、独自のテーブルに次のフィールドを含めることを考えています。

post_id,
giving_user_id,
receiving_user_id,
type,
date_added

さて、明らかに私のサイトが成長し、100万...5億...10億行ある場合、データ型が正しく設定されていれば、このアプローチと構造は実行に永遠にかかることなく持ちこたえることができますか?

ほとんどの場合、テーブルに挿入するだけですが、stackoverflowのユーザー統計ページと同様に、前の20(例)ポイントの授与/差し引きも表示できるようにしたいと考えています。

私にとってより良いかもしれないより効率的な構造はありますか?

更新された情報

はい、それは機能のスタックオーバーフローに非常によく似ています。1人のユーザーがpostidごとに1票を獲得します。@Paul Gregory考え直した後、削除receiving_user_idする方がはるかに良いアイデアかもしれません。ほとんどの場合、投稿に関連しているからです。

4

4 に答える 4

1

post_id を使用して特定のコメントを識別でき、type(他の ID と同様の数値として) 賢明に使用していると仮定すると、そのアプローチはログに広く最適です。

(私たちが知らないことを正確にreceiving_user_id教えてくれるものはわかりませんpost_id-投稿とコメントを区別することを期待していないことを願っています)。

ただし、そのテーブルを使用して必要なたびに合計ポイントを計算する場合は、あまり効率的ではありません。

したがって、各投稿/コメントに対して、現在の合計を個別に保存する必要があります。

最後の 20 ポイントだけを表示したいので、ログ データをエクスポートし、古いログ エントリを時々削除するものを作成する必要があります。

于 2013-03-01T13:36:44.617 に答える
0

POST テーブルからこれらのフィールドを削除し、非常によく似たテーブルを作成して、InnoDB 外部キー関係を作成します。

id (log id)
post_id, (add relation with your post table post.id)
giving_user_id, (user id relation)
receiving_user_id, (user id relation)
type, (type as you want);
date_added (datetime or whatever);

そのようにして、テーブルを正規化し、データとログをより細かく制御できます。

于 2013-03-01T13:37:33.030 に答える
0

私のウェブサイトではポイントログを保持しており、それを基に一定期間のサマリーを毎日再計算しています。常に最新の集計値を取得するために、新しいエントリが記録されたときに、現在の日/月/年の合計にも適切な値を追加します。

クエリについて - 日付による適切なデータベース インデックスを使用すると、大きなポイント ログでも適切なパフォーマンスを実現できます。

于 2013-03-01T13:40:28.080 に答える
0

私があなただったら、特定のアクションに対して与えられるポイントの量をリストした、ポイントと呼ばれる表を作成します。構造は次のようになります。

point_id INT PRIMARY_KEY
name VARCHAR
descriptions TEXT
number_of_points INT

次に、 user_pointsというテーブルを作成し、ユーザーがポイントを与えるアクションをいつ実行したかを記録できます。このテーブルは次のようになります

point_id INT
user_id INT
date DATE

もっと良い方法があるかもしれませんが、それはあなたが提供した情報に基づいて私が提案するものです。

それが役立つことを願っています

于 2013-03-01T13:41:06.110 に答える