1

私は投票システムを作成し、次のような行として投票テーブルに投票を記録しました。

post_id | user_id | votes | date

次に、この投票を次のような構造を持つuser-metaテーブルに追加します。

user_id | meta_key | meta_value

このテーブルでは、「votes」のmeta_keyを持つuser_idを指定して、post_idの配列をmeta_valueとして保存または取得できます。

私が2つのテーブルに1票を保存する理由は、

1.なぜ投票テーブルを使用するのですか?

すべての投稿でvote_totalとvote_popularityを計算する必要があります。これは、ユーザーのメタテーブルの配列の要素としてのみ保存する場合は簡単ではありません。

2.なぜユーザーメタテーブルを使用するのですか?

ユーザーがすでに投稿に投票したかどうかを確認する必要があります。ユーザーメタは、設定されるとキャッシュされます。したがって、in_array($ post_id、$ my_voted_posts)のチェックを行うだけで済みます。user-metaテーブルがない場合、ユーザーがアクセスする投稿ごとに、投票テーブルを確認する必要があります。

もっと良い方法はありますか?

私の投票システムはうまく機能していますが。しかし、どういうわけか、これはこれを行うための効率的な方法ではないと感じています。パフォーマンスを向上させるためにどのように改善できるかについて、専門家に相談したいと思います。ありがとう!

4

1 に答える 1

3

まず、効率的なインデックスがあれば、投票テーブルをチェックするのは問題ないと思います。複合インデックスを使用してインデックスpost_idとにインデックスを付けることができます。これにより、かなりパフォーマンスuser_idの高いクエリが作成されます。select * from votes where post_id = X and vote_id = Y

速度を上げるためにデータを非正規化する必要がある時期が来るでしょうが、正規化されたデータと同じレイヤーにあるべきではないと思います。おそらく、ユーザーメタデータにredis / memcacheを使用できますか?

于 2012-08-12T12:15:32.467 に答える