mysql派生数据,在数据库中,应该何时存储派生数据?
我的問題是非規范化。在數據庫中,什么時候應該將派生數據存儲在它自己的列中,而不是每次需要時計算它?
例如,假設您的用戶對他們的問題獲得了贊成票。在用戶的個人資料中顯示用戶的聲譽。當用戶被否決時,您應該增加他們的聲譽,還是在檢索他們的配置文件時計算聲譽:
SELECT User.id, COUNT(*) AS reputation FROM User
LEFT JOIN Question
ON Question.User_id = User.id
LEFT JOIN Upvote
ON Upvote.Question_id = Question.id
GROUP BY User.id
為了獲得用戶的聲譽,查詢需要占用多大的處理器資源,才能用自己的列增量地跟蹤它?
為了繼續我們的示例,假設一個upvote具有一個權重,該權重取決于投出它的用戶擁有多少upvot(而不是多少聲譽)。檢索他們聲譽的查詢突然爆發:
SELECT
User.id AS User_id,
SUM(UpvoteWeight.weight) AS reputation
FROM User
LEFT JOIN Question
ON User.id = Question.User_id
LEFT JOIN (
SELECT
Upvote.Question_id,
COUNT(Upvote2.id)+1 AS weight
FROM Upvote
LEFT JOIN User
ON Upvote.User_id = User.id
LEFT JOIN Question
ON User.id = Question.User_id
LEFT JOIN Upvote AS Upvote2
ON
Question.id = Upvote2.Question_id
AND Upvote2.date < Upvote.date
GROUP BY Upvote.id
) AS UpvoteWeight ON Question.id = UpvoteWeight.Question_id
GROUP BY User.id
這與增量解決方案的難度相差甚遠。什么時候規范化才值得呢?什么時候規范化的好處會失去非規范化的好處(在本例中是查詢困難和/或性能)?
總結
以上是生活随笔為你收集整理的mysql派生数据,在数据库中,应该何时存储派生数据?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: larvel mysql count,p
- 下一篇: centos7 安装mysql php,