Mysql 动态更改记录的外键

Mysql 动态更改记录的外键,mysql,database,database-design,Mysql,Database,Database Design,比如说,我有一个表,其中有很多记录“employee\u hour”,另一个表的记录很少:“Revolutions\u export”员工工时有一个外键,用于营业额导出。但是,有时链接的营业额导出会过时,需要更新大量员工工时记录 当前的工作方式(这种方式变得太慢): 对于链接的营业额导出过期的每个员工工时记录,将插入一条新的、相同的员工工时记录,并插入到更新的营业额导出 我如何设计一个db/进程来尽可能有效地处理这个问题 值得注意的是: 不想使用新的营业额导出更新员工工时记录(因为这意味着为链接

比如说,我有一个表,其中有很多记录“employee\u hour”,另一个表的记录很少:“Revolutions\u export”<代码>员工工时有一个外键,用于
营业额
导出。但是,有时链接的
营业额导出
会过时,需要更新大量
员工工时
记录

当前的工作方式(这种方式变得太慢):

对于链接的
营业额导出
过期的每个
员工工时
记录,将插入一条新的、相同的
员工工时
记录,并插入到更新的
营业额导出

我如何设计一个db/进程来尽可能有效地处理这个问题

值得注意的是:

  • 不想使用新的
    营业额导出
    更新
    员工工时
    记录(因为这意味着为链接的
    营业额导出
    过期的
    每个
    员工工时
    记录插入新的
    员工工时
    记录,->此列表的第4点)
  • 不想使用触发器
  • 设计应尽可能少地与某个平台/db引擎绑定
  • 应该保留历史记录,不删除任何内容,更新意味着新的插入
  • 我想到的是:

  • 链接到不是插入id而是UUID的外键,然后在
    overflower\u export
    中跟踪另一个列是否应该使用它。无法工作,因为来自单个列的外键不能引用多个列
  • 我知道我没有想过或尝试过很多,但老实说,我想不出其他任何东西

    关于这些表的用途的一些上下文:


    我们要报告特定员工工作时间产生的营业额。我们通过获取员工工时记录,然后将此记录中的某一列与链接的营业额导出中的某一列相乘来实现此目的。

    但是,有时链接的营业额导出会过时,需要更新大量员工工时记录。考虑到您的“显著点”,我们可以考虑<代码> TunVelueExputs/COD>不能更改任何情况。您必须添加一列,该列定义导出行为实际行或过时行/存档行,并使用更新的值创建新行。在此之后,
    employee\u hour
    中需要更新的一些行可能会连接到新创建的行,而不是旧的行。@Akina更正,当链接的
    overship\u export
    过期时,将插入一个新的
    overship\u export
    ,其中包含更新的值。这意味着链接到
    员工工时
    营业额导出
    现在已过时,不能使用。那么,我如何将这些
    employee_hour
    记录链接到新更新的
    overship_export
    ,而不更新
    employee_hour
    本身呢?@Akina您知道您的解决方案对性能有什么影响吗?据我所知,db定义的外键不能在您的解决方案中使用。在不更新员工工作时间的情况下,如何将这些员工工作时间记录链接到新更新的营业额导出??常用更新查询:
    UPDATE employee\u hour SET overship\u export\u reference=new\u overship\u export\u id其中overship\u export\u reference=old\u overship\u export\u id{和其他条件}
    。据我所知,db定义的外键不能用于您的解决方案中。为什么???我看不出有什么理由。。您的解决方案对性能有什么影响?我认为导出中的
    行数太少,您看不到任何降级效果。@Akina很遗憾,这里不允许任何更新查询。因为在这种情况下,我们将丢失更新之前链接到
    员工工时
    记录的
    营业额导出
    记录。您的解决方案基本上是“值得注意的要点”中的第1点。