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

标签 mysql triggers denormalization

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

基本上我有两个高度非规范化的表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/

相关文章:

mysql - 编写 SQL 查询以打印表中不包含 '%' 符号的单词

Postgresql:仅当数据更改时,才在更新每个语句后运行触发器

MYSQL : Error in Tigger

database - 非常宽的非规范化数据(大约 40000 列)。使用哪个数据库?

mysql - 数据库(反)规范化 - 包含不同实体图像的表

sql - 何时对数据库设计进行非规范化

mysql - Adonis js 如何重新排序表模式的创建以迁移到 mysql

php - 使用 Codeigniter 在 MySQL 中安全地转义动态表名

php - 如何在单击单选按钮时插入数据 - jquery/php/mysql?

php - php中根据文件夹状态监控文件夹和事件触发