我的問題是關於非規範化。在數據庫中,何時應該將派生數據存儲在自己的列中,而不是每次需要時計算它?在數據庫中,當你要存儲導出的數據?
例如,假設你有誰得到Upvotes提出的問題的用戶。您在其個人資料中顯示用戶的信譽。當用戶Upvoted,你應該增加自己的信譽,否則你應該計算它,當你找回自己的個人資料:
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的權重取決於投射它的用戶有多少Upvotes(沒有多少聲望)。查詢其信譽突然爆炸:
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
這與增量式解決方案的難度大不相稱。正常化時將是值得的,和標準化的好處時,就失去了非規範化的利益(在這種情況下,查詢的難度和/或性能)?