Por lo que entiendo, necesitas que una instancia en la relación (registro de tabla) mantenga por ejemplo parte de la clave sin variantes, y algo adicional que registre el cambio.
Entiendo que para el caso indicado, un código autoincremental no serviría, salvo que los cambios se lleven aparte.
Mantener los cambios en la misma tabla, si la tabla tiene mucho movimiento, puede crearte muchos registros de no proceso, que puede degradar cualquier consulta, además de que cualquier consulta tiene que "esquivar" esos datos
Varias formas de solucionarlo.
Con los cambios en la misma tabla.
Agregar a la clave primaria (que no puede ser AI) un datetime que puede ser nulo (y si el SGBD no admite nulo en la PK, un valor de fecha-hora "fuera de rango", año 3000 o año 0). Entonces el registro vigente tiene esa fecha "vacía" o fuera de rango, el registro que pasa a histórico, le colocas en el datetime mencionado, la fecha-hora en que dejo de estar vigente.
Esto es un cambio simple en la tabla, pero toda aplicación que acceda a esa tabla, debe "conocer" como esquivar los no registros "vigentes" y si cambia algo en la tabla, saber como proceder.
Esto particularmente, no me convence.
Otra forma.
Crear una bitácora donde se registre toda modificación a la tabla original. En esa tabla, colocas todos los campos de la tabla original más control de las 5W (Who, When, Where, What, hoW) o quien, cuando, donde (desde que WS), que hizo, como lo hizo.
Ese control histórico lo gestionas con triggers en el motor de base de datos (las bd nativas de fox también pueden hacerlo). No tienes que tocar la aplicación en si, solo los triggers que son parte de la bd.
Cualquier aplicación nueva que acceda a los datos de esa para altas, bajas o cambios, no tiene ni que enterarse de que ese registro de cambios se está haciendo.
Otra forma que instrumente, es que como accedo a los datos a partir de una clase de persistencia propia, dicha clase, cuando se inserta, borra o cambia cualquier tabla, guarda en una tabla común, los datos de las 5W + la clave primaria + nombre tabla + más un campo memo con los datos del registro serializados (por ejemplo JSON).
Entonces en una tabla común, tengo registro de todo lo que se toco en la BD, con la ventaja de que no tengo que meter triggers en cada tabla que se agrega al sistema y no tengo el doble de tablas de registro de modificaciones, con la contra de que si acceden sin usar el framework que diseñe, no me queda registro de cambios en las tablas.
Como ves, hay varias soluciones al problema.
Saludos: Miguel, La Pampa (RA)
Larga Vida y Prosperidad
Que la Fuerza los acompañe.