У меня есть список статей и их исправлений. В этом случае важны только два правила:Ведение учетных записей
(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'
Я не верю, что проект нуждается в Временная база данных только для решения этой проблемы. Это единственная таблица, которая нуждается в управлении версиями, и сохраненный контент слишком мал (около 2 КБ на запись).
Кажется, что эта ситуация столкнулась со многими хорошими CMS и Wikis (такими как MediaWiki или Wordpress). Любые советы о том, как они решаются, а также преимущества и недостатки методов, используемых в этих проектах?
используйте отдельную таблицу_истории статьи для хранения изменений. См. Hibernate Envers –