繁体   English   中英

使用更新和插入触发器提供其他关系中的计数列

[英]Using update and insert triggers to provide a count column in other relations

我有一个表“ 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

进一步地,应该应用另一个触发器来推断新知识,例如艺术家演奏的总数。 添加新轨道时,将再次触发此操作,它将找到该轨道所属的artist_id并相应地更新“艺术家”表。

artist_id  artist_name play_count
1          Bob         10

当用户“播放”曲目时,我将如何实现相关的触发器,以提供总计的增量?

您想在查询时计算的越多,就越需要视图,计算出的列以及存储或用户例程。 您想要在标准化基准更新时计算的次数越多,则需要级联和触发器的次数就越多。 您希望在其他(计划的或临时的)时间计算的内容越多,则使用快照(又称为物化视图)和更新的非规范化基础的数量就越多。 您可以将它们结合起来。 每次访问数据库时,都可以通过存储的例程或其他api启用它并受其限制。

在显示足够的数据之前,视图和计算的列是最简单的。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM