gpt4 book ai didi

mysql - 我应该使用触发器来连接两个相关但高度非规范化的表吗?

转载 作者:行者123 更新时间:2023-11-29 02:36:32 25 4
gpt4 key购买 nike

我以前从未使用过触发器,但这似乎是一个可靠的用例。我想知道触发器是否是我应该使用的,如果是的话,我可以稍微掌握一下如何去做。

基本上我有两个高度非规范化的表goalsusers_goals。两者都有复制 title 数据的 title 列 (VARCHAR)。因此,将有一个主要目标“学习如何使用触发器”,以及许多(嗯,在这种情况下可能不是很多)具有相同标题的用户目标。网站的架构要求如此。

我还不需要在这两个表之间建立关系。我将个人用户的目标链接到主要目标,但只是通过标题查询(在 title 列上使用 INDEX)来实现。 现在我需要第三个表来关联这两个表,但它只需要最终一致。将有两列,FOREIGN KEYgoal_idusers_goal_id

触发器是解决这个问题的方法吗?如果是这样,那会是什么样子?

最佳答案

是的,您可以使用触发器来执行此操作,但具体的实现取决于您的需求。

如果您想重建所有查询,使它们不使用连接的标题,而是使用 goal_id,您可以直接构建它。如果您还需要保持标题同步,那是额外的。

首先是加入。你说一个目标有很多用户目标。这是否意味着每个 user goal 只属于一个 goal?如果是这样,您不需要额外的表。您只需将一列 goal_id 添加到您的 user_goals 表中。确保有一个外键约束(我希望你使用的是 InnoDB 表),这样你就可以强制执行参照完整性。

然后是触发器。我不确定如何在 MySQL 上编写它们。我确实在 Oracle 上经常使用触发器,但在 MySQL 上很少使用。无论如何,我建议您构建三个触发器:

  1. goals 表的更新触发器。当标题被修改时,此触发器应更新相关的 user_goals 表。
  2. user_goals 表上的更新触发器。如果修改了 user_goals.title,此触发器应检查 goals 表中的标题是否与 user_goals 中的新标题不同。如果是这样,您有两个选择:
    1. 异常(exception):不允许在 user_goals 子表中修改标题。
    2. 更新:允许更改标题。更新目标中的父记录。目标触发器将为您更新其他相关的 user_goals。
    3. 您也可以通过在触发器中更改回值来默默地忽略更改,但这不是一个好主意。
  3. user_goals 上插入触发器。最简单的选择是查询指定 goal_id 的标题,并且不允许为标题插入其他值。如果给定标题,您可以选择更新目标
  4. 插入目标触发器。不需要这个。

关于mysql - 我应该使用触发器来连接两个相关但高度非规范化的表吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4240575/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com