在编辑时保存所有版本的帖子很受欢迎(例如在 stackexchange 项目中),因为我们可以恢复旧版本。我想知道保存所有版本的最佳方法是什么。
方法1:将所有版本存储在同一张表中,并为订单或活动版本添加一列。这会使桌子太长。
方法二:创建存档表来存储旧版本。
在这两种方法中,我想知道如何处理作为文章主要标识符的行 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
需要快速搜索的行太多足够。
请注意,这postid
是一个外键posthistory
(和 的 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 Data Explorer中的数据转储。或者可能不是,我不知道。)
对于这种方式,postid
也是表中的外键,以及posthistory
表中的主键posts
。
在我看来,一个有趣的方法是
posts_archive
(它将包含表的所有列posts
+ 一个自动递增的主键 + 可选的日期......)posts
表。如果表的大小是一个问题,那么第二个选项将是更好的选择。这样,可以从较小的表中快速返回活动版本,并且可以接受从较大的存档表中恢复旧版本需要更长的时间。也就是说,表的大小不应该是合理的数据库和索引的问题。
无论哪种方式,您都需要一个由多个表列组成的主键,而不仅仅是行 ID。简单的答案是在密钥中包含一个包含每个修订版本创建时间的时间戳,以便 ID 继续标识特定文章,并且 ID 和修订时间一起标识文章的特定修订版本。
处理时间数据是一个已知问题。
方法 1 只是更改了您的表标识符:您最终会得到一个包含messageID, version, description, ...
主键的表messageID, version
。通过简单地添加具有递增版本的行来修改数据。查询稍微复杂一些。
方法 2 比较繁琐,你最终会得到一个表,其中一个表rowID
和第二个表与方法 1 中的完全相同。然后,在每次更新时,你必须记住将数据复制到“备份”中桌子”。
方法3:Matt给出的答案
在我看来,方法1和3更好。架构在 1 中更简单,但您可以使用方法 3 为您的帖子提供未版本化的数据。