Предположим, у меня есть следующая таблица
CREATE TABLE `entities` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`timestamp` TIMESTAMP NOT NULL
DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`data` VARCHAR(255),
PRIMARY KEY (`id`,`timestamp`)
);
На каждый объект обычно ссылается только id
, за исключением того, что для каждого объекта существует несколько версий, неоднозначность которых устраняется timestamp
. В большинстве моих запросов будет выбрана самая последняя версия, лишь немногие вставят новые версии и еще меньше выберут все прошлые версии. Я ожидаю в среднем около дюжины ревизий на id
.
Каков наиболее эффективный (с точки зрения производительности и места для хранения) метод выбора самой последней версии? Существует ли общепринятая практика решения этой проблемы?
Насколько я понимаю, есть два метода: (1) Создать представления вокруг GROUP BY
CREATE VIEW groupedEntities AS
SELECT id, max(timestamp) AS maxt FROM entities GROUP BY id;
CREATE VIEW currentEntities AS
SELECT a.id, data, timestamp FROM groupedEntities AS a
INNER JOIN entities AS b ON b.id=a.id AND b.timestamp=a.maxt
WHERE timestamp <= CURRENT_TIMESTAMP;
SELECT * FROM currentEntities WHERE id=?;
Обратите внимание, что <=CURRENT_TIMESTAMP
позволяет «удалить» объект, установив метку времени на отдаленное будущее. И (2) Создайте отдельную таблицу для хранения текущих версий.
CREATE TABLE currentEntities (
`id` INT(10) UNSIGNED PRIMARY KEY,
`timestamp` TIMESTAMP,
CONSTRAINT FOREIGN KEY (`id`, `timestamp`)
REFERENCES `entities` (`id`,`timestamp`)
);
SELECT * FROM currentEntites INNER JOIN groupedEntities WHERE id=?;
Или какой-то другой вариант (3)?