2017-10-20 172 views
0

我正在使用MySQL Workbench的EER工具为我正在开发的应用程序进行数据库设计。跟踪数据库中的数据更改非常重要,所以我遵循this后,这使得很多意义上被接受的答案。我的问题是,我不太了解主键,所以我有点困惑这应该如何工作,因为每次进行更改都会有另一行插入相同的ID,因此数据库不会允许这是我的权利?我需要使用外键的主键。跟踪myql更改的最佳方式

+0

您引用的答案使用复合PK,只要valid_from和/或valid_until不同,客户ID就可以重复;这样的PK使用组合的所有字段来表示身份。 (我看到的答案细节中的一个问题是,它指的是使用触发器,但触发器无法修改它们“ON”的表)。我喜欢一个涉及“历史”表的解决方案,该表由“当前”表上的触发器更新和填充。 – Uueerdo

+0

@Uueerdo ohh,我明白了,但是后来将valid_until作为主键是错误的,因为这可能是无效的吗?我观察到的另一件事是EER正在使用主键来引用外键,这是最佳实践吗? –

+0

NULL值可以是主键和唯一索引的一部分;但行为有点不同(任何两个NULL是彼此“唯一”的。)这个答案可能已经离开只有一个(ID,从)PK; (id,from,to)不会阻止(0,1,4)和(0,2,5)等数据同时存在,当您在查找“when between between between to”时,会出现问题。 – Uueerdo

回答

0

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

  • 表A:A_ID(PK),a_stuff
  • 表A_history:a_history_id(PK),A_ID(FK引用A.a_id) ,VALID_FROM日期,失效日期a_stuff

触发器上的一个:

  • 上的插入:用VALID_FROM =现在,和VA将值插入A_history lid_to = null。
  • 更新时:将valid_to = now设为a_id的最后历史记录;并使用该行的更新值从“插入时”触发器执行相同的插入操作。
  • 删除时:为a_id的最后历史记录设置valid_to = now。

在这种情况下,你会查询历史记录为“x> =从和X <为”( BETWEEN作为先前记录的“从”值应与下一对“价值”)。

+0

a_id反映了最后一个状态或起始状态? –

+0

a_id引用表A中的单个行;它显示表A_history中的行是A中该行的状态(如果valid_to不为空,则为前一状态);表A只会有当前状态。 – Uueerdo

+0

谢谢,我明白为什么有一个单独的表可能会更好,可能有助于提高查询性能? –