小编典典

如何管理同一记录的多个版本

sql

我正在为一家试图为其数据库记录实施工作流程签入/签出类型的公司进行短期合同工作。

这是应该如何工作的…

  1. 用户在应用程序内创建一个新实体。除主要实体表外,还将填充约20个相关表。
  2. 创建实体后,用户会将其标记为主实体。
  3. 另一个用户只能通过“签出”实体来对母版进行更改。多个用户可以同时签出实体。
  4. 用户对实体进行所有必要的更改后,他们会将其置于“需要批准”状态。
  5. 授权用户查看实体后,他们可以将其提升为母版,从而将原始记录置于已墓碑状态。

他们当前完成“签出”的方式是通过在所有表中复制实体记录。主键包括EntityID +
EntityDate,因此它们在所有相关表中使用相同的EntityID和更新的EntityDate复制实体记录,并将其状态设置为“已签出”。当记录进入下一个状态(需要批准)时,重复将再次发生。最终它将被提升为母版,此时最终记录被标记为母版,而原始母版被标记为失效。

这种设计对我来说似乎很丑陋,但我知道他们为什么这样做。当某人从应用程序中查找实体时,他们需要查看该实体的所有当前版本。这是实现这一目标的非常简单的方法。但是,它们在同一张表中多次表示同一实体的事实与我相处并不愉快,而且它们在复制每条数据而不是仅存储增量数据也不是一件好事。

我想听听您对设计的反应,无论是正面的还是负面的。

对于您可以指出的任何资源,我也将不胜感激,这对于了解其他人如何实现这种机制可能很有用。

谢谢!
达维斯


阅读 163

收藏
2021-04-22

共1个答案

小编典典

我已经在这样的系统上工作,该系统支持在大型银行进行交易的静态数据。在这种情况下,静态数据是诸如交易对手的详细信息,标准的结算指令,货币(不是FX汇率)之类的东西。数据库中的每个实体都进行了版本控制,更改实体涉及创建新版本,更改该版本并获取该版本。版本已批准。但是,他们不允许多个人同时创建版本。

这导致了一个极其复杂的数据库,每个联接都必须考虑版本和批准状态。实际上,我为他们编写的软件是中间件,可以将这种复杂的版本化数据抽象为最终用户应用程序可以实际使用的东西。

可能会使情况更糟的唯一事情是存储增量而不是完整的版本化对象。因此,此答案的重点是-不要尝试实现增量!

2021-04-22