Database 为CMS等版本控制系统创建数据库的最佳实践

Database 为CMS等版本控制系统创建数据库的最佳实践,database,versioning,Database,Versioning,我正在使用CMS等需要对文档进行版本控制的系统。 用how-its表为it创建数据库的最佳实践和方法是什么?我首先要看看运行Wikipedia的开源项目中是如何创建的。它们都是关于版本控制的。当我做这件事时,我发现有一个如下的表结构非常有效: tbl.posts postid(PK) | title | category tbl.revisions revisionid(PK) | postid(FK) | authorid(FK) | content | date 可以更改的字段应进

我正在使用CMS等需要对文档进行版本控制的系统。

用how-its表为it创建数据库的最佳实践和方法是什么?

我首先要看看运行Wikipedia的开源项目中是如何创建的。它们都是关于版本控制的。

当我做这件事时,我发现有一个如下的表结构非常有效:

tbl.posts
  postid(PK) | title | category
tbl.revisions
  revisionid(PK) | postid(FK) | authorid(FK) | content | date
可以更改的字段应进入修订表(如内容),而不会进入帖子表(postid、类别等)

根据我在上一个播客上听到的,StackOverflow做了类似的事情

我更喜欢以与第一次添加帖子时相同的方式存储新的(新修订版),但我有一个名为“childOf”的列,该列存储父帖子的ID,查询如下所示:

SELECT * FROM posts WHERE condition=value ORDER BY childOf DESC;

根据我的经验,最好有两个不同的表,一个表包含不需要版本控制的数据,另一个表包含需要版本控制的数据(正如Spikolynn在他/她之前的回答中所说)


当只使用一个表时,我发现的问题是,如果另一个表有一个外键指向该版本表,那么每次更新记录时主键都会更改,引用就会丢失。这会导致非常复杂和低效的查询,以便恢复de数据

Chukc,您可以通过添加一个额外字段并将其用作外键来解决该问题

假设你有帖子:

id, revision, name, content 
修订如下:

id-publish or id-draft or id-revision-N

然后将其他表链接到修订版id publish,而不是id。请记住对其编制索引:)

如果只需要最新的结果,请添加“限制1”。链接已断开:MediaWiki的最新数据库架构如下: