Управление версиями на уровне строк MySQL - PullRequest
3 голосов
/ 10 января 2010

Я создаю контроль версий для данных в нашей базе данных. Он будет иметь возможность хранить ревизии, откаты и откаты отката. Таблицы базы данных, которые я использую, которые необходимо пересмотреть, приведены ниже:

объекты
object_chunks
object_attributes

Объекты - это основной объект, чанки - это сгруппированные разделы объекта, а атрибуты - это атрибуты данных внутри чанка. Атрибуты хранят идентификатор объекта вместе с идентификатором чанка. Таким образом, легко выбрать все атрибуты для объекта без необходимости повторного соединения с таблицей чанков.

Единственное, что когда-либо действительно изменится, это атрибуты, но когда атрибут меняется, затронутый блок (и) будет обновляться, и всякий раз, когда блок обновляется, объект также обновляется. Теперь я подумал о двух разных способах решения этой проблемы.

  1. Создайте три новые таблицы с суффиксом _rev, эти таблицы будут просто хранить старые версии объектов. Реальные объекты также будут хранить число оборотов. Допустим, я изменил три разных атрибута, эти атрибуты охватывают три порции, поэтому три новых строки в порциях, три в атрибутах и ​​одна в объекте для ревизий. Поскольку это первое изменение, идентификатор rev будет равен 1, в реальных таблицах их rev будет 2.
  2. Я бы просто сделал вышеописанное, но вместо отдельной таблицы я бы просто сохранил ее в той же таблице.

Стоит отметить, что ВСЕГДА будут ревизии, количество кусков может варьироваться от 1 до 100+. Хотя в среднем это около 1-15. Атрибуты могут варьироваться от 0 до 100+. Среднее значение, вероятно, около 30. КАЖДЫЙ атрибут изменится. Эти объекты проходят через «фазу», когда все атрибуты должны заполняться пользователями. Как только они заполнены, объект архивируется и никогда не изменяется снова. Все объекты имеют соответствующий файл. Таким образом, объект будет хранить текущий хеш (sha256) файла также. Этот хеш используется для целей дедупликации.

Ответы [ 2 ]

3 голосов
/ 10 января 2010

Добавление идентификатора ревизии к первичному ключу таблицы объектов - определенно лучший способ. Вы можете иметь несколько активных ревизий и не перемещать данные между таблицами. Работая с несколькими таблицами, вы обнаружите, что вам трудно писать алгоритмы отката, перемещающие данные при сохранении ограничений целостности - особенно сложно, если система находится в активной разработке.

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

0 голосов
/ 10 января 2010

Как насчет

objects object_chunks revision object_attributes

Если номер ревизии увеличивается, вы можете просто выбрать объекты с максимальной (ревизией) группировкой по объекту, object_chunks в будущем.

...