Objeto con versiones de relaciones de nidos de niveles múltiples

Tengo una estructura de objects compleja con una relación anidada de múltiples niveles que describe una configuration de Producto. La configuration cambia las horas extraordinarias y necesito poder hacer reference a las diferentes configuraciones en cualquier momento en el futuro. En cualquier momento, todo el sistema está vinculado a una versión específica del producto y de alguna manera se abstrae de la noción completa de las versiones del producto.

La forma más directa de implementar esto es clonar toda la estructura del producto cada vez que se solicita una nueva versión y vincular las diferentes versiones. Sin embargo, esto es una exageración en términos de carga de la database. ¿Hay una mejor manera?

También pensé en rastrear los cambios individualmente y rebuild el producto cuando se solicita una versión, pero parece bastante complejo de implementar y acertar con la relación anidada de niveles múltiples.

O

Guarde un metadato mínimo en la database para rastrear una versión y serializar la estructura completa del producto usando herramientas como GIT.

Las herramientas VCS no están diseñadas para este propósito. Esta es una característica de la aplicación (historial de versiones) y debe tratarse como tal. La forma correcta de implementar esto sería crear una tabla de "file" para cada tipo de elemento versionado y relacionarlos con el elemento "actual" actual por ID.

Luego, cada vez que el elemento cambie, tome su estado actual y actualice el file antes de enviar los cambios al elemento a la tabla de elementos principales.

La diferencia importante es que no se trata de almacenar un historial de versiones para sus objects C # , sino que es una function de la aplicación para almacenar un historial de versiones de un "elemento" conceptual del usuario final en su aplicación. El "historial del producto" y el "historial de objects del producto" no son lo mismo; quieres lograr lo primero. Su object declara y los elementos que realmente representan son dos cosas distintas.

Las herramientas de control de versiones como Git son para almacenar revisiones de la aplicación en sí , no para proporcionar características de file para los datos que la aplicación está consumiendo. Eso pertenece a una database.

Alternativamente, si el problema es poder retrotraer sus datos a un punto específico en el time, esto debería lograrse tomando instantáneas con date de su database, que pueden intercambiarse según sea necesario, ya que esto es completamente independiente del aplicación en sí.