【问题标题】:Keeping records revisions保存记录修订
【发布时间】:2015-03-12 17:34:20
【问题描述】:

我有一个文章列表及其修订版。在这种情况下,只有两条规则很重要:

(i) 当有人要求对文章进行特定修订时,应将其交付。

(ii) 当有人请求仅告知文章标识符的文章时,应发送文章的最新版本。

要获得最新修订的文章列表,我们使用以下视图:

CREATE  OR REPLACE VIEW `only_articles` AS
  SELECT *
    FROM article AS a
    WHERE a.revision = (
        SELECT MAX(ma.revision) AS max_revision
        FROM article AS ma
        WHERE ma.id = a.id
    );

有没有办法优化这个查询?有什么办法可以避免子查询?有没有更好的方法来存储这些修订?

这是表结构(简化):

CREATE TABLE `article` (
  `ai_id` int(11) NOT NULL AUTO_INCREMENT,
  `id` int(11) NOT NULL,
  `revision` int(11) NOT NULL,
  `title` varchar(45) NOT NULL,
  PRIMARY KEY (`ai_id`),
  UNIQUE KEY `ID_VERSION` (`id`,`revision`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;

一些数据:

ai_id   id      revision  title
1       1       1         'Text one'
2       1       2         'Text two'
3       1       3         'Text three'
4       2       1         'Another Article'
5       2       2         '2nd revision of another article'

预期输出:

ai_id   id      revision  title
3       1       3         'Text three'
5       2       2         '2nd revision of another article'

我不认为该项目只需要一个时态数据库来解决这个问题。这是唯一需要版本控制的表,而且存储的内容太小(每条记录大约 2KB)。

似乎许多优秀的 CMS 和 Wiki(例如 MediaWiki 或 Wordpress)都面临过这种情况。关于他们如何解决的任何提示以及这些项目中使用的方法的优缺点?

【问题讨论】:

  • 使用单独的 article_history 表来存储修订。参见 Hibernate Envers

标签: mysql database mediawiki


【解决方案1】:

Mediawiki 为pagerevision 提供了单独的表,并且页表在page_latest 字段中存储了最新版本的rev_id

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多