哪种方法更适合用于获取喜欢的数量?
假设我有桌子喜欢:
所以like_type是确定id_liked的类型。因此,如果like_type为“question”且id_liked为10,那么like就属于这一行:
SELECT * FROM questions where question_id = 10;
如果like_type为“answer”,则带答案的行将为
SELECT * FROM answers where answer_id = 10;
所以主要的问题是:哪种方法最适合用id 10喜欢的所有问题?
SELECT COUNT() as like_numbers from likes where like_type = `question` AND id_liked = 10;
OR
每当有人喜欢问题时,问题表中的问题都会增加,所以没有必要每次都计算。
答案 0 :(得分:2)
这取决于几个因素。以下是一些优点和缺点,您可以自己决定。
我的网站使用的论坛软件我相信两者都有。每个帖子都有一个竖起大拇指按钮,它存储每行的计数,但也记录每个单独的投票。作为管理员,我可以将计数编辑为另一个仅调整计数的数字,但我可以将该数字悬停在帖子上,看看谁投票了。管理面板中还有一个“重新计算所有帖子分数”选项,该选项将重新调整,并将数字重新调整为实际投票数。
答案 1 :(得分:1)
这实际上取决于您的特定需求,预期的并发性和应用程序的复杂性。
如果您已经在阅读该表格以生成问题列表,那么使用questions
表格上的当前计数对列进行缓存可能会更有效。
表不会从缓存计数中删除它们。即使您有这样的条件,也必须确定性能优势是否值得在您的方案中添加其他逻辑。
另一种选择是通过cronjob或其他机制在计划上生成缓存计数。这可以最大限度地减少您对应用程序逻辑和MySQL查询缓存的影响,但也会增加一些复杂程度,在您的情况下似乎影响很小(添加类似内容时添加计数的成本很低)。 / p>
如果您向likes
列添加索引,它会提高从该表计算喜欢的效果 - 但您仍然会有id_liked
或每个单独查询的开销将此问题与您的问题联系起来。
注意:如果您要添加某种类型的count列,请确保在MySQL中以原子方式执行此操作,这样您就不会消除在查询当前计数和更新值之间发生的喜欢:
JOIN
答案 2 :(得分:0)
我相信你最好的选择是使用这个查询:
var starvalue = $('.rating', $(this)).text();
但是在id_liked上添加一个索引,like_type。
使用第二个选项,您可能会在对问题和答案非常喜欢的情况下获得稍快的查询响应,但是当您的计数以某种方式不同步时,您还需要开发更多工作以及潜在的维护问题。