【问题标题】:Using update and insert triggers to provide a count column in other relations使用更新和插入触发器在其他关系中提供计数列
【发布时间】: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


【解决方案1】:

您想在查询时计算的越多,您需要的视图、计算列和存储或用户例程就越多。您想在标准化基本更新时间计算的越多,您需要的级联和触发器就越多。您想在其他(计划的或临时的)时间计算的越多,您使用快照(即物化视图)和更新的非规范化基础的次数就越多。你可以结合这些。任何时候访问数据库都可以通过存储的例程或其他 api 启用和限制。

在您可以证明它们足够多之前,视图和计算列是最简单的。

DBMS 的整个想法是将应用程序状态的表示存储为数据库(规范化减少了冗余),然后查询并让 DBMS 实现和优化答案的计算。您没有以最直接的方式提出不这样做的理由。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 2015-11-06
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    相关资源
    最近更新 更多