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

标签 mysql sql database temporal

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

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

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

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

最佳答案

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

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

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

    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)。

  • 使用非规范化模式,其中所有最新修订都在一个表中,而以前的修订在一个单独的表中。这需要程序部分有更多逻辑,即 当我添加新版本时,替换帖子表中具有相同 id 的帖子,并将其添加到修订表中

(这可能是 SE 网站使用的,基于 SE Data Explorer 中的数据转储。也可能不是,我无法判断。)

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

关于mysql - 如何在mysql数据库中保存所有版本的帖子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9211292/

相关文章:

php - 使用外部 css 显示获取的 mysql 数据

mysql - 如何在 MySql 中选择不存在的行?

mysql - 从连接表中提取信息的 SQL 查询

mysql - 当存储过程迭代 15M 行的大表时,MySQL 的性能非常糟糕

mysql - 我正在尝试执行 mysql 查询以获取只供应红色部分的供应商?

database - postgresql 在数据库之间快速传输表

php - 聚合数据组作为 Yii2 关系

mysql - 如何在 Groovy 中收集 sql 行

mysql - 使用 group_concat mysql

php - 适合mysql查询中的where子句