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

Obrigado megbr, essa visão foi muito boa e fez sentido para mim também, irei implementar um conjunto.