【发布时间】:2014-08-03 07:26:39
【问题描述】:
我有一个表“user_plays_track”,用于记录用户“播放”曲目的次数。
我使用以下查询插入用户播放过的新曲目,或更新现有曲目的播放次数:
INSERT INTO user_plays_track
(user_id, track_id) VALUES (x,y)
ON duplicate key UPDATE play_count = play_count+1
这是我的表的结构:
user_id track_id play_count
1 5 2
4 2 1
3 5 7
根据这些信息,我可以通过查找所有曲目计数的总和来推断诸如曲目已播放的总次数或艺术家的总播放次数。
有大约一千条记录,这很快就会变得混乱,语义也不清楚。我想做的是使用触发器来产生可以被描述为缓存的东西。
例如,当一条记录被更新或插入到“user_plays_track”时,“tracks”表将增加其 play_count 列,指示该轨道的所有用户的总播放次数。
track_id artist_id track_name play_count
2 1 Hey 1
5 1 Test 9
除此之外,还应应用另一个触发器,以推断新知识,例如艺术家演奏的总数。这将在添加新曲目时再次触发,它会找到该曲目所属的艺术家 ID 并相应地更新“艺术家”表。
artist_id artist_name play_count
1 Bob 10
我将如何实施相关触发器,以便在用户“播放”曲目时提供递增的总数?
【问题讨论】:
-
是否必须是完全实时的,或者汇总统计可以延迟一定的时间(例如,几秒、几分钟等)?
-
@troy 我想,如果应用程序规模扩大,这将每隔一段时间完成,或者会有某种算法来定期更新受到很多关注的轨道。然而,就目前而言,我认为实时是合适的。我可以简单地更新所有相关表,但我认为触发器会更好。
-
对于实时更新,鉴于您可以控制应用程序,我建议按照原始插入执行这些更新。除了他们擅长的特定事情之外,我通常会尽量避免触发因素,尤其是在锁定会话涉及一些风险的情况下。
-
@troy 谢谢你,现在我相信你的话,并考虑改为定制我的查询。
-
你是什么意思,“这很快就会变得混乱,语义不清楚”?
标签: mysql sql database-design triggers foreign-keys