Meu comentário não responde suas perguntas, mas passa uma visão de uma implementação que já fiz e que talvez possa ser útil para você.
Nessa implementação, considerei que todas as tabelas do sistema poderiam ser auditadas, ou seja, não seria legal criar relacionamento entre tabela de auditoria e demais. Para tal, minha tabela de auditoria possuía um campo do tipo varchar que receberia a tabela auditada, o registro antigo em formato json, o registro atualizado em formato json e uma leitura humana.
Ficando mais ou menos assim:
Tabela auditoria:
Id | Tabela | RegistroAntigo | RegistroNovo | LeituraHumana | CriadoEm |
---|---|---|---|---|---|
1 | Cars | {"id": 133, "modelo": "gol", "ano": 2010} | {"id": 133, "modelo": "gol", "ano": 2023} | Campo "ano" alterado de "2010" para "2023" | 2022-03-04 22:33:00 |