Control de versiones de una gran colección en una database para deshacer el propósito

En tener entidades: Collection y Item . Cada colección tiene muchos artículos. Tanto la Collection como el Item pueden ser editados queueborativamente por todos los usuarios de la aplicación. Tengo que proporcionar una forma de deshacer cambios. Los loggings de Item versionado son sencillos, la parte difícil es versionar la relación entre la Collection y el Item .

  • Las operaciones permitidas en la colección son: insert un elemento en una position determinada , eliminar un elemento y cambiar la position de un elemento dentro de la list (que puede verse como un inserto en la position + un eliminar en el par de position anterior).
  • La operación de inserción se llamará con frecuencia. A veces, una import por lotes puede insert miles de elementos en la colección. Debería poder revertir tal import y el deshacer no debería tomar mucho time para ser ejecutado.
  • La list puede consistir en 20 000 y más elementos. Prefiero no poder permitirme copyr toda la colección en cada cambio.
  • Debería poder ver el estado de una revisión de colección dada para descubrir los cambios que estaban en la revisión.

¿Cómo modelar esto en una database relacional?

He estado pensando en usar una propiedad temporal de múltiples valores. Al lado de Collection and Item hay una tabla de enlaces con vt_from y vt_to time stamps. Probablemente tendría que crear también una entidad CollectionVersion , también con los attributes vt_from y vt_to . Esas versiones se enumerarían en la página "historial" de la colección. Sin embargo, aún no he encontrado un algorithm general para revertir los cambios. ¿Tal vez debería tener lists de diferencias (agregadas / eliminadas) conectadas a la CollectionVersion que se usaría para ese fin?

Lo que está describiendo debería ser fácil de modelar utilizando el abastecimiento de events. Básicamente, desea almacenar los cambios en la colección como entidades. El estado real de las collections en cualquier momento se puede calcular aplicando la colección de events asociados desde la creación hasta el momento deseado.

http://martinfowler.com/eaaDev/EventSourcing.html

http://codebetter.com/blogs/gregyoung/archive/2010/02/20/why-use-event-sourcing.aspx