1

我制作了一个投票系统并将投票记录在投票表中,如下所示:

post_id | user_id | votes | date

然后,我将此投票添加到具有如下结构的用户元表中:

user_id | meta_key | meta_value

在这个表中,给一个 user_id 的 meta_key 为“votes”,我可以保存或获取一个 post_ids 数组作为 meta_value。

我在两张桌子上保存一票的原因是——

1. 为什么要使用投票表?

我需要计算所有帖子的 vote_total 和 vote_popularity,如果我只将它保存为用户元表中的数组元素,这并不容易。

2. 为什么要使用用户元表?

我需要检查用户是否已经为帖子投票。用户元数据一旦设置就会被缓存。所以,我只需要检查 in_array($post_id, $my_voted_posts)。如果没有用户元表,对于用户访问的每个帖子,我将不得不检查投票表。

有没有更好的办法?

虽然我的投票系统运行良好。但不知何故,我觉得这不是有效的方法。我想咨询您的专业人士,了解如何改进它以获得更好的性能。谢谢!

4

1 回答 1

3

首先,如果您有一个有效的索引,我认为检查投票表就可以了。您可以使用复合索引来索引post_iduser_id,这将使查询具有select * from votes where post_id = X and vote_id = Y相当的性能。

会有一点需要对数据进行非规范化以提高速度,但我认为它不应该与规范化数据位于同一层。也许您可以将 redis / memcache 用于用户元数据?

于 2012-08-12T12:15:32.467 回答