面向对象的设计鼓励使用不可变对象来提高线程安全性和性能.我想知道这是否会延续到关系数据库.
我最好更新现有的行,还是插入新的行作为覆盖?
选项1:每次员工更换公司时,请插入新的员工[姓名,公司]行.指示应用程序跳过较旧的行(随着时间的推移在后台线程中进行修剪). 选项2:每次员工更换公司时,都要更新现有行.
选项1让我想起了不可变对象,因为它是线程安全的(不需要锁).另一方面,每次员工更换公司时,我都必须克隆所有相关对象并将其指向新记录.此外,还不清楚如何防止重复的员工被错误地创建.
选项2可以很容易地防止重复的员工,但是在READ_COMMITTED事务隔离中返回可能不一致的关联的缺点.
我发布此信息是希望这能在未来对其他人有所帮助。我个人在这条(错误的)道路上浪费了无数天。
不可变对象适用于值类型(想想整数、时间戳、温度读数等)。它们是永远不会改变的类型。当您开始谈论修改不可变对象的值时,这是一个非常强烈的迹象,表明您走上了错误的道路。当您使用真正的不可变对象时,您永远不必更新关联对象的引用。
因此,无论是面向对象编程还是数据库设计,正确的答案是就地更新可变对象。
更新:marc_s 提到了一些系统需要不可变审计跟踪的事实。我建议将系统一分为二。主表在将副本插入单独的审计表时就地更新数据。这有两个好处:
这使您可以享受两全其美。