【问题标题】:Versioning in relational database关系数据库中的版本控制
【发布时间】:2017-12-10 02:24:29
【问题描述】:

我无法在我的数据库设计中引入一个好的版本控制。

让我们举一个简单的例子。一点出租服务。

您有一张桌子Person (P_ID, Name)、一张桌子Computer (C_ID, Type) 和一张桌子Rent (R_ID, P_ID, C_ID, FromData, ToData)

我希望能够更改用户名,创建一个新版本,并且如果我需要它仍然可以使用旧的东西。

我的目标是在我的网站上安装某种系统,以便轻松对表格中的某些记录进行版本控制。

更多信息:

我的业务逻辑要求我可以发布一个版本的记录。我还必须能够回滚到旧的。原因是我想要导出不同版本的数据。

【问题讨论】:

    标签: sql sql-server database-design


    【解决方案1】:

    在进入解决方案之前,最好先问一下您想要实现什么行为?您是否需要为某些审计目的进行版本控制,是否需要版本控制以便用户可以回滚更改,您是否需要为某些业务规则进行版本控制,还是有其他原因?

    一旦你知道了这一点,答案应该会立刻浮出水面。即,如果审核是您的目的,您可以添加数据库触发器并将旧值和新值存储在单独的 [Audit] 表中。

    【讨论】:

    • 说得好。在提出解决方案之前始终定义问题。
    • 是的......但我们都做到了,猜猜这就是编码如此有趣的原因
    【解决方案2】:

    您已发表声明(您想要版本控制),但没有提出问题(您的问题究竟是什么)。没有问题,很难提供答案。

    通常,您可以通过以下方式提供版本控制:

    1. 确定需要版本控制的实体。在这种情况下,您可能希望对“交易”或“租赁协议”进行版本控制。

    2. 在该实体的模型顶部的表格中添加 PK 列、版本号列和“originalID”列。

    3. 要进行版本控制,请将顶级记录复制到新的 PK,将原始 PK 放在“originalID”列中并增加版本号列。复制相关表,更改这些表中的 FK 以匹配新记录的 PK。然后允许用户修改与记录的新PK版本有关的记录。

    【讨论】:

    • 这是我的第一次尝试,但假设有人更改了名称(在上面的示例中。然后您将在主实体中创建一个新版本,但名称表中的更改会破坏旧版本. 你当然可以在你的应用程序中建模,但是对于每个表,它需要更多的应用程序代码。需要一个更通用的系统。
    • 在这种情况下,被版本化的实体是“用户注册记录”。该记录将具有 PK、OriginalPK 和 VersionID 字段。当名称更改时,您将创建一个带有新 PK 的新记录,OriginalPK 在“父”记录上设置为 OriginalPK,并且 VersionID 递增 1。您不会在任何事务上将 FK 复制甚至更新回 People 表(因为您希望保留与交易相关联的用户注册的原始“版本”,但您的 UI 可能会显示该用户的更新信息。
    【解决方案3】:
    【解决方案4】:

    您可以创建一个存档表,通过存储过程或触发器进行更新,每次更新或插入后,该表填充主表中数据行中所有字段的副本。存档表将有自己的 PK 和更改时间的时间戳。

    【讨论】:

      猜你喜欢
      • 2018-06-19
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      • 1970-01-01
      • 2016-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多