例如,一个网站,用户可以使用此模型对问题(上下)进行投票:
users(id)
questions(id)
votes(id,userId,questionid,vote)
-- vote can be +1 or -1, or probably better bit 0 and 1
我在想,当有很多questions
投票时,会出现性能问题,尤其是在显示问题列表时,所以
为这样的问题添加一列是否有意义:
questions(id, votessum)
每次有人投票除了insert into the votes questions also to update the questions
并将其设为votessum column
答案 0 :(得分:4)
我会说,不,在门外我不会在问题表上有这样一栏。我将通过实际或估计的使用情况以及性能测试确定聚合此数据所需的查询是否会成为性能瓶颈。
如果查询确实产生了瓶颈,我首先会看一下其他优化,比如在进行这种非规范化之前改进索引和物化视图。
非规范化有时是有用的(有时是必要的),但它有其自身的问题和陷阱,使得充分探索其他有价值的选择。
答案 1 :(得分:1)
在担心性能之前,我会更加担心准确性并首先捕获所有数据。
我会创建一个名为QuestionVotes的单独表格,其列为QuestionId, UserId, VoteType, TimeStamp
,以捕获所有相关活动。
这有助于追踪所有投票,投票类型,投票,防止双重投票等。
现在我可以考虑更新问题表中的计数,如果性能下降,但我会首先选择索引和查询调优的路径。