【问题标题】:best way to keep track of myql changes跟踪mysql更改的最佳方法
【发布时间】:2017-10-21 05:46:42
【问题描述】:

我正在使用 MySQL Workbench 的 EER 工具为我正在开发的应用程序进行数据库设计。跟踪数据库上的数据更改非常重要,所以我关注了this 的帖子,这对接受的答案很有意义。我遇到的问题是我不太了解主键,所以我对这应该如何工作有点困惑,因为每次进行更改时都会插入具有相同 ID 的另一行,因此数据库不允许我是对的吗?由于外键,我需要使用主键。

【问题讨论】:

  • 您引用的答案使用复合PK,只要valid_from和/或valid_until不同,客户ID就可以重复;这样的 PK 使用其所有字段的组合来表示身份。 (我看到的答案细节的一个问题是它指的是使用触发器,但触发器不能修改它们“打开”的表)。我赞成一种涉及“历史”表的解决方案,该表由“当前”表上的触发器更新和填充。
  • @Uueerdo 哦,我明白了,但是将 valid_until 作为主键是错误的,因为这可能是空的?我观察到的另一件事是 EER 正在将主键作为引用外键的列,这是最佳做法吗?
  • NULL 值可以是主键和唯一索引的一部分;但行为略有不同(任何两个 NULL 彼此“唯一”。)这个答案可能只需要一个 (id, from) PK; (id, from, to) 不会阻止像 (0,1,4) 和 (0,2,5) 这样的数据同时存在,当您在寻找“when 3 between from and to”时会导致问题。
  • @Uueerdo "PRIMARY KEY - 一个唯一索引,其中所有键列都必须定义为 NOT NULL。" dev.mysql.com/doc/refman/5.7/en/create-table.html
  • 啊,是的,很好。我忘记了主键和唯一键之间的区别;因为除非特别合适,否则我会避免在唯一键中使用空值,因此我将它们混为一谈。

标签: mysql sql foreign-keys primary-key


【解决方案1】:

我在(非常)伪代码中的正常“模式”:

  • 表 A:a_id (PK)、a_stuff
  • 表 A_history:a_history_id (PK)、a_id(FK 引用 A.a_id)、valid_from、valid_to、a_stuff

A 上的触发器:

  • 插入时:将值插入 A_history,valid_from = now,valid_to = null。
  • 更新时:设置 valid_to = now 获取 a_id 的最后历史记录;并使用更新后的行值从“on insert”触发器执行相同的插入操作。
  • 删除时:将 valid_to = now 设置为 a_id 的最后历史记录。

在这种情况下,您将使用“x >= from and x not BETWEEN,因为上一条记录的“from”值应该与下一条记录的“value”匹配)。

【讨论】:

  • a_id 反映的是最后状态还是开始状态?
  • a_id 引用表 A 中的单行;它表明表 A_history 中的行是 A 中该行的状态(如果 valid_to 不为空,则为先前状态);表 A 永远只有当前状态。
  • 谢谢,我明白为什么最好有一个单独的表,这可能有助于查询的性能,对吧?
  • 它对性能的帮助程度取决于使用情况。它主要标准化跟踪数据的变化。如果您在它支持的系统中提供“回到昨天并修复应该完成的事情”的功能,那么您最终可能会更多地使用历史表而不是“当前”表;并且当前表只是用于您的配置管理。但是,如果您只允许“当前”操作,则这些操作永远不必担心过滤掉旧数据。
猜你喜欢
  • 2010-09-19
  • 1970-01-01
  • 1970-01-01
  • 2022-11-23
  • 2010-09-16
  • 2016-06-14
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多