数据库:插入新行还是更新现有行?

Gil*_*ili 5 database-design

面向对象的设计鼓励使用不可变对象来提高线程安全性和性能.我想知道这是否会延续到关系数据库.

我最好更新现有的行,还是插入新的行作为覆盖?

  • 用例
    • 每个员工只与一家公司相关联
    • 员工随着时间的推移改变他们的公司.
    • 员工姓名应该是唯一的.
  • 架构
    • 员工[姓名,公司]

选项1:每次员工更换公司时,请插入新的员工[姓名,公司]行.指示应用程序跳过较旧的行(随着时间的推移在后台线程中进行修剪). 选项2:每次员工更换公司时,都要更新现有行.

选项1让我想起了不可变对象,因为它是线程安全的(不需要锁).另一方面,每次员工更换公司时,我都必须克隆所有相关对象并将其指向新记录.此外,还不清楚如何防止重复的员工被错误地创建.

选项2可以很容易地防止重复的员工,但是在READ_COMMITTED事务隔离中返回可能不一致的关联的缺点.

Gil*_*ili 6

我发布此信息是希望这能在未来对其他人有所帮助。我个人在这条(错误的)道路上浪费了无数天。

不可变对象适用于值类型(想想整数、时间戳、温度读数等)。它们是永远不会改变的类型。当您开始谈论修改不可变对象的值时,这是一个非常强烈的迹象,表明您走上了错误的道路。当您使用真正的不可变对象时,您永远不必更新关联对象的引用。

因此,无论是面向对象编程还是数据库设计,正确的答案是就地更新可变对象。

更新:marc_s 提到了一些系统需要不可变审计跟踪的事实。我建议将系统一分为二。主表在将副本插入单独的审计表时就地更新数据。这有两个好处:

  1. 主表可以利用完整性检查(即“员工姓名必须唯一”)。
  2. 主表的读取速度仍然非常快,随着时间的推移,可以修剪更大/更慢的审计表。

这使您可以享受两全其美。