【问题标题】:How to save all versions of posts in mysql database如何将所有版本的帖子保存在mysql数据库中
【发布时间】:2012-02-09 12:59:43
【问题描述】:

在编辑时保存所有版本的帖子很流行(例如在 stackexchange 项目中),因为我们可以恢复旧版本。我想知道保存所有版本的最佳方法是什么。

方法1:将所有版本存储在同一张表中,并为订单或活动版本添加一列。这会使表格太长。

方法2:创建存档表来存储旧版本。

在这两种方法中,我想知道如何处理作为文章主要标识符的行 ID。

【问题讨论】:

  • 自引用外键字段。并且表分区也可以解决一些性能问题,因为只有一张大表但已分区。

标签: mysql sql database temporal


【解决方案1】:

保存修订历史的“最佳”方法取决于您的具体目标/限制是什么——而您没有提到这些。

但这里有一些关于您建议的两种方法的想法:

  • 为帖子创建一个表,为帖子历史创建一个表,例如:

    create table posts (
      id int primary key,
      userid int
    );
    
    create table posthistory (
      postid int,
      revisionid int,
      content varchar(1000),
      foreign key (postid) references posts(id),
      primary key (postid, revisionid)
    );
    

(显然会有更多的列、外键等)这很容易实现且易于理解(并且易于让 RDBMS 保持引用完整性),但正如您所提到的,可能会导致 posthistory 也有足够快地搜索许多行。

注意postidposthistory 中的外键(以及posts 的PK)。

  • 使用非规范化架构,其中所有最新版本都在一个表中,之前的版本在一个单独的表中。这需要程序的更多逻辑,即when I add a new version, replace the post with the same id in the post table, and also add this to the revision table

(这可能是 SE 网站使用的,基于 SE Data Explorer 中的数据转储。或者可能不是,我不知道。)

对于这种方法,postid 也是posthistory 表中的外键,也是posts 表中的主键。

【讨论】:

  • +1 我同意最好的方法是将“当前版本”存储在“发布表”中,将“修订版”存储在另一个仅在需要时才可以访问的表中。
【解决方案2】:

在我看来,一个有趣的方法是

  • 定义另一个表,例如posts_archive(它将包含posts表的所有列+一个自动递增的主键+可选的日期...)
  • 通过在posts 表上定义的插入后和更新后触发器提供此表。

【讨论】:

    【解决方案3】:

    如果表的大小是一个问题,那么第二个选项将是更好的选择。这样,可以从较小的表中快速返回活动版本,并且可以接受从较大的存档表中恢复旧版本需要更长的时间。也就是说,表的大小不应该是合理的数据库和索引的问题。

    无论哪种方式,您都需要一个由多个表列组成的主键,而不仅仅是行 ID。简单的答案是在密钥中包含一个包含每个修订版本创建时间的时间戳,以便 ID 继续标识特定文章,并且 ID 和修订时间一起标识文章的特定修订版本。

    【讨论】:

      【解决方案4】:

      处理时态数据是一个已知问题。

      方法 1 只是更改了您的表标识符:您最终会得到一个包含 messageID, version, description, ... 和主键 messageID, version 的表。 通过简单地添加具有递增版本的行来修改数据。查询有点复杂。

      方法 2 更繁琐,您最终会得到一个带有 rowID 的表和与方法 1 完全相同的第二个表。然后,在每次更新时,您必须记住复制将数据存入“备份表”。

      方法三:answser given by Matt

      在我看来,方法 1 和 3 更好。架构在 1 中更简单,但您可以使用方法 3 为您的帖子提供未版本化的数据。

      【讨论】:

        猜你喜欢
        • 2020-06-08
        • 2012-01-25
        • 2014-04-13
        • 1970-01-01
        • 2022-11-15
        • 1970-01-01
        • 1970-01-01
        • 2021-05-07
        • 2011-09-16
        相关资源
        最近更新 更多