Voy a compartir con ustedes mi diseño y es diferente de sus dos diseños, ya que requiere una tabla por cada tipo de entidad. Encontré que la mejor manera de describir cualquier diseño de base de datos es a través de ERD, aquí está el mío:

En este ejemplo tenemos una entidad llamada empleado . usuario tabla contiene los registros y de los usuarios entidad y entity_revision son dos tablas que contienen el historial de revisiones para todos los tipos de entidades que tendrá en su sistema. Así es como funciona este diseño:
Los dos campos de entity_id y revision_id
Cada entidad en su sistema tendrá una identificación de entidad única propia. Su entidad podría pasar por revisiones pero su entity_id seguirá siendo el mismo. Debe mantener esta identificación de entidad en su tabla de empleados (como una clave externa). También debe almacenar el tipo de su entidad en la tabla de entidades (por ejemplo, 'empleado'). Ahora, en cuanto a revision_id, como lo muestra su nombre, realiza un seguimiento de las revisiones de su entidad. La mejor manera que encontré para esto es usar el employee_id como su revision_id. Esto significa que tendrá identificadores de revisión duplicados para diferentes tipos de entidades, pero esto no es un placer para mí (no estoy seguro de su caso). La única nota importante que debe hacerse es que la combinación de entity_id y revision_id debe ser única.
También hay un campo de estado dentro de la tabla entity_revision que indica el estado de la revisión. Puede tener uno de los tres estados: latest
, obsolete
o deleted
(no depender de la fecha de revisiones que contribuye en gran medida a aumentar sus consultas).
Una última nota sobre revision_id, no creé una clave externa que conecte employee_id a revision_id porque no queremos alterar la tabla entity_revision para cada tipo de entidad que podamos agregar en el futuro.
INSERCIÓN
Para cada empleado que desee insertar en la base de datos, también agregará un registro a la entidad y la entidad_revisión . Estos dos últimos registros lo ayudarán a realizar un seguimiento de quién y cuándo se ha insertado un registro en la base de datos.
ACTUALIZAR
Cada actualización para un registro de empleado existente se implementará como dos inserciones, una en la tabla de empleados y otra en entity_revision. El segundo lo ayudará a saber quién y cuándo se actualizó el registro.
SUPRESIÓN
Para eliminar un empleado, se inserta un registro en entity_revision indicando la eliminación y listo.
Como puede ver en este diseño, nunca se alteran ni eliminan datos de la base de datos y, lo que es más importante, cada tipo de entidad requiere solo una tabla. Personalmente, considero que este diseño es realmente flexible y fácil de trabajar. Pero no estoy seguro de ti, ya que tus necesidades pueden ser diferentes.
[ACTUALIZAR]
Habiendo soportado particiones en las nuevas versiones de MySQL, creo que mi diseño también viene con una de las mejores actuaciones. Uno puede dividir la entity
tabla usando el type
campo mientras que la partición entity_revision
usa su state
campo. Esto aumentará las SELECT
consultas por mucho tiempo mientras mantiene el diseño simple y limpio.