如何在mysql数据库中保存所有版本的帖子

Goo*_*bot 4 mysql sql database temporal

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

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

方法2:创建存档表以存储旧版本.

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

Mat*_*ick 9

保存修订历史记录的"最佳"方式取决于您的具体目标/约束条件 - 您还没有提到这些.

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

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

    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)
    );
    
    Run Code Online (Sandbox Code Playgroud)

(显然会有更多的列,外键等)这很容易实现并且易于理解(并且很容易让RDBMS保持参照完整性),但正如您所提到的那样可能导致posthistory有太多行要快速搜索足够.

注意,它postidposthistory(以及PK posts)中的外键.

  • 使用非规范化模式,其中所有最新修订都在一个表中,并且先前的修订在单独的表中.这需要程序更多的逻辑,即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数据资源管理器中的数据转储.或者可能不是,我无法分辨.)

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

  • +1我同意这样做的最佳方法是将"当前版本"存储在另一个"post tables"和"revisions"中,只有在需要时才能访问. (2认同)