Каков наилучший способ создания простой системы ревизий с использованием MySQL? - PullRequest
8 голосов
/ 12 марта 2009

В настоящее время я работаю над простой системой ревизий, которая позволяет мне хранить несколько версий одного файла, которая до сих пор работала нормально.

Структура таблицы следующая (устаревшие столбцы удалены для краткости):

file_id     file_revision     file_parent      file_name
--------------------------------------------------------
1           1                 0                foo.jpg
2           2                 1                foorevised.jpg                 
3           3                 1                anotherrevision.jpg

Где:

  • file_id - это первичный ключ, который автоматически увеличивается
  • file_revision хранит номер редакции, по умолчанию 1, когда это первый
  • file_parent является родителем верхнего уровня ревизии, по умолчанию 0, когда первый.
  • file_name имя файла.

Проблема:

  • Желательно использовать один запрос, чтобы получить все файлы ...
  • Но только самая последняя версия каждого файла ...
  • ... когда хранится только одна ревизия (оригинальная), ее следует извлечь.

Любые указатели очень ценятся. Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 12 марта 2009

Самый эффективный способ поиска - добавить столбец наподобие is_latest, который необходимо заполнить заранее, а затем select * from table where file_id=1 and is_latest=true, если вы хотите получить последнюю версию файла 1. Очевидно, это приведет к обновлению этой таблицы. более сложный, однако.

Другим способом сделать это было бы сохранение последних версий файлов в одной таблице и исторических версий в другой таблице. Если вы преимущественно хотите выбрать все файлы, которые являются самой последней версией, select * from table where is_latest=true может составить полное сканирование таблицы, даже если is_latest проиндексирован. Если все последние строки были в одной таблице, база данных может считывать их все в последовательном вводе-выводе, и им не нужно: 1) выполнять большой поиск в таблице, чтобы найти только те записи, которые ей нужны, или 2) сканировать всю таблицу, отбрасывая большие количество данных по пути для старых записей.

Если вы не хотите изменять существующий дизайн таблицы, то, что вы хотите сделать, это выбрать выбор группового максимума, см. эту статью , чтобы узнать о нескольких различных способах сделать это в mysql.

1 голос
/ 27 мая 2012
file_id     file_revised     file_name              Time_Stamp
-----------------------------------------------------------------
1           1                 foo.jpg                 insert_time
2           1                 foorevised.jpg          insert_time                 
3           1                 anotherrevision.jpg     insert_time

Я бы тогда сделал вариации на такие запросы:

SELECT * WHERE file_revision = 1 ORDER BY Time_Stamp GROUP BY file_revision

Или любое количество вариаций в запросе этого типа, то есть предел 1 или Порядок по file_id, как самый высокий, также будет самым последним и т.

...