mysql:如何避免两次保存相同的数据?

时间:2012-08-12 11:25:19

标签: mysql database-design data-modeling

我制作了一个投票系统并在投票表中记录了这样一行:

post_id | user_id | votes | date

然后,我将此投票添加到user-meta表,其结构如下:

user_id | meta_key | meta_value

在此表中,为user_id提供meta_key为“votes”,我可以保存或获取post_id数组作为meta_value。

我在两张桌子中保存一票的原因是 -

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

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

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

我需要检查用户是否已经投票支持。用户元一旦被设置就被缓存。所以,我只需要检查in_array($ post_id,$ my_voted_posts)。如果没有user-meta表,对于用户访问的每个帖子,我将必须检查投票表。

有更好的方法吗?

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

1 个答案:

答案 0 :(得分:3)

首先,如果你有一个有效的索引,我认为检查投票表是好的。您可以使用composite indexespost_iduser_id进行索引,这样可以使select * from votes where post_id = X and vote_id = Y这样的查询具有良好的效果。

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