我以前从未使用过触发器,但这似乎是一个可靠的用例。我想知道触发器是否是我应该使用的,如果是的话,我可以稍微掌握一下如何去做。
基本上我有两个高度非规范化的表,goals
和users_goals
。两者都有复制 title
数据的 title
列 (VARCHAR
)。因此,将有一个主要目标“学习如何使用触发器”,以及许多(嗯,在这种情况下可能不是很多)具有相同标题的用户目标。网站的架构要求如此。
我还不需要在这两个表之间建立关系。我将个人用户的目标链接到主要目标,但只是通过标题查询(在 title
列上使用 INDEX
)来实现。 现在我需要第三个表来关联这两个表,但它只需要最终一致。将有两列,FOREIGN KEY
,goal_id
和 users_goal_id
。
触发器是解决这个问题的方法吗?如果是这样,那会是什么样子?
最佳答案
是的,您可以使用触发器来执行此操作,但具体的实现取决于您的需求。
如果您想重建所有查询,使它们不使用连接的标题,而是使用 goal_id,您可以直接构建它。如果您还需要保持标题同步,那是额外的。
首先是加入。你说一个目标
有很多用户目标
。这是否意味着每个 user goal
只属于一个 goal
?如果是这样,您不需要额外的表。您只需将一列 goal_id
添加到您的 user_goals
表中。确保有一个外键约束(我希望你使用的是 InnoDB 表),这样你就可以强制执行参照完整性。
然后是触发器。我不确定如何在 MySQL 上编写它们。我确实在 Oracle 上经常使用触发器,但在 MySQL 上很少使用。无论如何,我建议您构建三个触发器:
goals
表的更新触发器。当标题被修改时,此触发器应更新相关的user_goals
表。user_goals
表上的更新触发器。如果修改了user_goals.title
,此触发器应检查goals
表中的标题是否与user_goals
中的新标题不同。如果是这样,您有两个选择:- 异常(exception):不允许在 user_goals 子表中修改标题。
- 更新:允许更改标题。更新目标中的父记录。目标触发器将为您更新其他相关的 user_goals。
- 您也可以通过在触发器中更改回值来默默地忽略更改,但这不是一个好主意。
- 在
user_goals
上插入触发器。最简单的选择是查询指定goal_id
的标题,并且不允许为标题插入其他值。如果给定标题,您可以选择更新目标
。 - 插入目标触发器。不需要这个。
关于mysql - 我应该使用触发器来连接两个相关但高度非规范化的表吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4240575/