gpt4 book ai didi

database-design - 数据库 : Insert new rows or update existing ones?

转载 作者:行者123 更新时间:2023-12-04 07:08:26 25 4
gpt4 key购买 nike

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

我是更新现有行还是插入新行作为替代行更好?

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

  • 选项 1 :每次员工更换公司时,插入一个新的 Employee[name, company] 行。应用程序被指示跳过较旧的行(随着时间的推移在后台线程中被修剪)。
    选项 2 :每次员工更换公司时,更新现有行。

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

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

    最佳答案

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

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

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

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

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

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

    关于database-design - 数据库 : Insert new rows or update existing ones?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4980963/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com