El problema al que se enfrenta es, como estoy seguro, un resultado de la normalización de la base de datos. Uno de los enfoques para resolver esto se puede tomar de las técnicas de Business Intelligence: archivar los datos en un estado des-normalizado en un Data Warehouse.
datos normalizados: mesa
- órdenes
- Clientes Tabla
- tabla Elementos
- ItemId
- Itemname
- itemprice
- OrderDetails Tabla
- ItemDetailId
- OrderId
- ItemId
- ItemQty
- etc
Cuando se le preguntó y se almacena de-normalizada, la tabla de almacenamiento de datos se parece a
- OrderId
- CustomerId
- CustomerName
- CustomerAddress
- (otro Cliente campos)
- ItemDetailId
- ItemId
- ITEMNAME
- itemprice
- (Otros OrderDetail y campos Posición)
Por lo general, o bien hay una cierta clase del trabajo programado que extrae datos de los datos normalizados en el Almacén de datos de forma programada, O si su el signo permite, se puede hacer cuando una orden alcanza un cierto estado. (Tal como se envió) Podría ser que los registros se almacenen en cada cambio de estado (con un campo llamado OrderStatus virando el estado actual), por lo que los datos completamente des-normalizados están disponibles para cada paso del proceso de reclamo/cumplimiento. Cuándo y cómo archivar los datos en el almacén variará según sus necesidades.
Hay una gran cantidad de gastos generales involucrados en lo anterior, pero el otro enfoque común que conozco lleva incluso MÁS sobrecarga.
El otro enfoque sería hacer que las tablas sean de solo lectura.Si un cliente desea cambiar su dirección, no edita su dirección existente, inserta un nuevo registro.
Así que si mi dirección es AddressId 12 cuando solicite por primera vez en su sitio en Jamnuary, entonces me mudo el 4 de julio, obtengo una nueva AddressId vinculada a mi cuenta. (Say AddressID 123123 porque su sitio es muy exitoso y ha atraído una gran cantidad de clientes.)
órdenes que palced antes del 4 de julio de tendrían AddressID 12 asociada con ellos, y los pedidos realizados en o después del 4 de julio de 123123. han AddressID
Repita ese patrón con cada tabla que necesite retener datos históricos.
Tengo un tercer enfoque, pero buscarlo es difícil. Utilizo esto solo en una aplicación, y en realidad funciona bastante bien en esta única instancia, que tenía necesidades empresariales bastante específicas para reconstruir los datos exactamente como lo era en un momento específico. No lo usaría a menos que tuviera necesidades comerciales similares.
En un estado específico, serialice los datos en un documento Xml u otro documento que pueda usar para reconstruir los datos. Esto le permite guardar los datos tal como estaban en el momento en que se serializaron, conservando la estructura de la tabla original y las relaitons.
Para tener nombres únicos de productos, puede agregar una tabla con solo nombres de productos, donde el nombre es el pk, y un enlace a esa tabla desde PRODUCT_VERSION –
@OweJessen. Claro que podría tener la tabla LATEST_PRODUCT_VERSION con NAME único, pero eso no significa contar como solución "declarativa", ya que necesitaría insertar y eliminar filas manualmente en esa tabla a medida que se crean nuevas versiones de productos. A menos que esté utilizando un DBMS que pueda actualizar automáticamente las vistas materializadas y hacer cumplir la exclusividad en ellas (como las vistas indizadas de MS SQL Server), el propio DBMS mantiene LATEST_PRODUCT_VERSION por usted. –